Моя программа застрять в цикле, который он не должен делать - PullRequest
0 голосов
/ 12 января 2019

В моей программе четыре почти одинаковых while-lopps. Программа проходит через 3 из них, но застревает в четвертом (последнем).

Что я пытаюсь достичь, так это программа, которая дает каждому игроку 13 случайных игральных карт.

Я добавил соответствующий фрагмент программы ниже.

public static void main(String[] args) {
    String[] cards = new String[53];
    cards[1] = "1k"; cards[2] = "2k"; cards[3] = "3k"; cards[4] = "4k"; cards[5] = "5k"; cards[6] = "6k";
    cards[7] = "7k"; cards[8] = "8k"; cards[9] = "9k"; cards[10] = "10k"; cards[11] = "11k"; cards[12] = "12k";
    cards[13] = "13k"; 
    cards[14] = "1h"; cards[15] = "2h"; cards[16] = "3h"; cards[17] = "4h"; cards[18] = "5h"; cards[19] = "6h";
    cards[20] = "7h"; cards[21] = "8h"; cards[22] = "9h"; cards[23] = "10h"; cards[24] = "11h"; cards[25] = "12h";
    cards[26] = "13h";
    cards[27] = "1r"; cards[28] = "2r"; cards[29] = "3r"; cards[30] = "4r"; cards[31] = "5r"; cards[32] = "6r";
    cards[33] = "7r"; cards[34] = "8r"; cards[35] = "9r"; cards[36] = "10r"; cards[37] = "11r"; cards[38] = "12r";
    cards[39] = "13k";
    cards[40] = "1s"; cards[41] = "2s"; cards[42] = "3s"; cards[43] = "4s"; cards[44] = "5s"; cards[45] = "6s";
    cards[46] = "7s"; cards[47] = "8s"; cards[48] = "9s"; cards[49] = "10s"; cards[50] = "11s"; cards[51] = "12s";
    cards[52] = "13s";

    String[] player1 = new String[14];
    String[] player2 = new String[14];
    String[] player4 = new String[14];
    String[] player3 = new String[14];

    String used = "";
    int i1 = 0;
    int i2 = 0;
    int i3 = 0;
    int i4 = 0;


    while (true) {
        Random rand1 = new Random();
        int irand1 = rand1.nextInt(51) + 1 ;

        String card = cards[irand1];

        if (i1 == 14) 
            break;

        if (used.contains(card))
            continue;

        else {
            player1[i1] = card;
            used = used + " " + card;
            i1++;
        }
    }

        while (true) {
            Random rand2 = new Random();
            int irand2 = rand2.nextInt(51) + 1 ;

            String card2 = cards[irand2];

            if (i2 == 14) 
                break;

            if ( used.contains(card2))
                continue;

            else {
                player2[i2] = card2;
                used = used + " " + card2;
                i2++;
            }

        }


        while (true) {
            Random rand3 = new Random();
            int irand3 = rand3.nextInt(51) + 1;

            String card3 = cards[irand3];

            if (i3 == 14) 
                break;

            if (used.contains(card3))
                continue;

            else {
                player3[i3] = card3;
                used = used + " " + card3;
                i3++;
            }           
    }

        while (true) {
            Random rand4 = new Random();
            int irand4 = rand4.nextInt(51) + 1;

            String card4 = cards[irand4];

            if (i4 == 14) 
                break;

            if (used.contains(card4))
                continue;

            else {
                player4[i4] = card4;
                used = used + " " + card4;
                i4++;
            }           
    }

}

 }

Для пояснения, цикл while, в котором застревает программа:

while (true) {
            Random rand4 = new Random();
            int irand4 = rand4.nextInt(51) + 1;

            String card4 = cards[irand4];

            if (i4 == 14) 
                break;

            if (used.contains(card4))
                continue;

            else {
                player4[i4] = card4;
                used = used + " " + card4;
                i4++;
            }           
    }

Любая помощь будет оценена, спасибо!

1 Ответ

0 голосов
/ 12 января 2019

Во-первых, вы можете сэкономить некоторое время, инициализируя и объявляя свой cards (и вы повторили «13k» с cards[39] = "13k"; - так у вас нет 52 уникальных карт). Во-вторых, я бы использовал Collections.shuffle(List) для раздачи карт. Это можно сделать с помощью чего-то вроде

String[] cards = {
        "1k", "2k", "3k", "4k", "5k", "6k", "7k", "8k", "9k", "10k", "11k", "12k", "13k",
        "1r", "2r", "3r", "4r", "5r", "6r", "7r", "8r", "9r", "10r", "11r", "12r", "13r",
        "1h", "2h", "3h", "4h", "5h", "6h", "7h", "8h", "9h", "10h", "11h", "12h", "13h",
        "1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "10s", "11s", "12s", "13s"
};
List<String> al = new ArrayList<>(Arrays.asList(cards));
Collections.shuffle(al);
String[] player1 = al.subList(0, 13).toArray(new String[13]);
String[] player2 = al.subList(13, 26).toArray(new String[13]);
String[] player3 = al.subList(26, 39).toArray(new String[13]);
String[] player4 = al.subList(39, al.size()).toArray(new String[13]);
System.out.println(Arrays.toString(player1));
System.out.println(Arrays.toString(player2));
System.out.println(Arrays.toString(player3));
System.out.println(Arrays.toString(player4));   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...