Как сделать так, чтобы мой генератор случайных покерных карт заканчивался, когда карты заканчиваются? - PullRequest
0 голосов
/ 02 июня 2018

Версия Android: 4.2

Я занимаюсь разработкой приложения для Android.Мне нужно генерировать изображения из папки для рисования случайным образом и установить текст, чтобы сказать, какая карта была выбрана.

Я хочу, чтобы мое приложение перечисляло каждую карту, выбранную случайным образом, без повторений, до тех пор, пока не закончится колода из 52 карт.

Как мне этого достичь?

Мой код xml:

<ImageView
        android:id="@+id/imageView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerInParent="true"
        android:scaleType="centerInside"
        tools:layout_editor_absoluteX="16dp"
        tools:layout_editor_absoluteY="16dp" />

В моем дро, у меня есть 52 изображения покерных карт с разными именами.

public class MainActivity extends AppCompatActivity {

   ImageView imageView;

   TextView txt1;

   Button button;

   Random r;

   Integer[] images = {
           R.drawable.ace_of_hearts,
           R.drawable.two_of_hearts,
           R.drawable.three_of_hearts,
           R.drawable.four_of_hearts,
           ...

Я использую этот код для генерации случайных карт по нажатию кнопки и отображения названия карты.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imageView = (ImageView) findViewById(R.id.imageView);

    txt1 = (TextView) findViewById(R.id.mytext);

    button = (Button) findViewById(R.id.btn1);

    r = new Random();

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //remove duplicates
            do {
                pickedImage = r.nextInt(images.length);
            } while (pickedImage == lastPicked);


            lastPicked = pickedImage;
            //display random image
            imageView.setImageResource(images[pickedImage]);
            txt1.setText(images[pickedImage]);
            }
    });
}

1 Ответ

0 голосов
/ 02 июня 2018

Вместо того, чтобы выбирать случайную карту и затем иметь дело с дубликатами, более простой подход может состоять в том, чтобы перетасовать массив и затем просто представить изображение оттуда:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imageView = (ImageView) findViewById(R.id.imageView);
    txt1 = (TextView) findViewById(R.id.mytext);
    button = (Button) findViewById(R.id.btn1);

    List<Integer> shuffledCards = new ArrayList<>(Arrays.asList(images));
    Collections.shuffle(shuffledCards);
    final Iterator<Integer> iter= shuffledCards.iterator();

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Stop once all the cards have been displayed
            if (!iter.hasNext()) {
                return;
            }

            image = iter.next();
            imageView.setImageResource(image);
            txt1.setText(image);
        }
    });
}
...