Java карточная игра. (Игра о войне)

Поэтому я должен реализовать карточную игру War. У меня все идет хорошо, за исключением остановки моего цикла, когда он достигает размера одной из колод (arraylist). То, что я хочу сделать, это цикл до тех пор, пока одна из колод не опустеет. И указатели на то, как я могу это сделать? Я понимаю, что мой код может быть сокращен, но мне не нужно беспокоиться об этом прямо сейчас. Вот мой код:

import java.util.*;
import java.lang.*;

public class lab9_11{
    public static void main(String args[]){

        System.out.printf("\n");
        System.out.printf("\n");
        System.out.printf("\\         / /\\   |\\  |\n");
        System.out.printf(" \\  / \\  / /__\\  |/  |\n");
        System.out.printf("  \\/   \\/ /    \\ |\\  o\n");
        System.out.printf("\n");
        System.out.printf("Lets play a game of war.\n");
        System.out.printf("Type 1 to begin or 0 to exit.\n");
        Scanner keyboard = new Scanner(System.in); 

        int initial = keyboard.nextInt();

        if (initial > 1){
            System.out.printf("You can't read, so you shouldn't play this.\n");
            System.exit(-1);
        }

        if (initial == 0){
            System.exit(-1);
        }

        else {
            System.out.printf("Okay, lets play!\n");
            System.out.printf("\n");
        }
        System.out.printf("Here is a deck of 52 cards -> []:\n");

        int deck[] = new int[52];

        deck[0] = 2; //0-12 = hearts
        deck[1] = 3;
        deck[2] = 4;
        deck[3] = 5;
        deck[4] = 6;
        deck[5] = 7;
        deck[6] = 8;
        deck[7] = 9;
        deck[8] = 10;
        deck[9] = 11; //jack of hearts
        deck[10] = 12; //queen of hearts 
        deck[11] = 13; //king of hearts
        deck[12] = 14; //ace of hearts

        deck[13] = 2; //13-25 = spades
        deck[14] = 3;
        deck[15] = 4;
        deck[16] = 5;
        deck[17] = 6;
        deck[18] = 7;
        deck[19] = 8;
        deck[20] = 9;
        deck[21] = 10;
        deck[22] = 11; //jack of spades
        deck[23] = 12; //queen of spades 
        deck[24] = 13; //king of spades
        deck[25] = 14; //ace of spades

        deck[26] = 2; //0-12 = diamonds
        deck[27] = 3;
        deck[28] = 4;
        deck[29] = 5;
        deck[30] = 6;
        deck[31] = 7;
        deck[32] = 8;
        deck[33] = 9;
        deck[34] = 10;
        deck[35] = 11; //jack of diamonds
        deck[36] = 12; //queen of diamonds 
        deck[37] = 13; //king of diamonds
        deck[38] = 14; //ace of diamonds

        deck[39] = 2; //39-51 = clubs
        deck[40] = 3;
        deck[41] = 4;
        deck[42] = 5;
        deck[43] = 6;
        deck[44] = 7;
        deck[45] = 8;
        deck[46] = 9;
        deck[47] = 10;
        deck[48] = 11; //jack of clubs
        deck[49] = 12; //queen of clubs 
        deck[50] = 13; //king of clubs
        deck[51] = 14; //ace of clubs

        System.out.printf("First, lets shuffle it into 2 decks of 26.\n");

        Random rangen = new Random(); //Random number generator
        for (int i=0; i < deck.length; i++) { //shuffles the deck
            int randomPosition = rangen.nextInt(deck.length);
            int temp = deck[i];
            deck[i] = deck[randomPosition];
            deck[randomPosition] = temp;
        }

        int[] player1 = new int[26]; //initializes 1st player's deck
        int[] player2 = new int[26]; //initializes 2nd player's deck

        System.arraycopy(deck, 0, player1, 0, player1.length); //takes 26 cards and puts into player1's deck.
        System.arraycopy(deck, player1.length, player2, 0, player2.length);//takes the other 26 and puts into player2's deck.
        System.out.printf(".\n");
        System.out.printf(".\n");
        System.out.printf("Here's your deck. --> [?]\n");
        System.out.printf(".\n");
        System.out.printf(".\n");
        System.out.printf("Here's your opponent's deck. --> [?]\n");
        System.out.printf(".\n");
        System.out.printf(".\n");
        System.out.printf("Okay, lets begin!\n");
        System.out.printf("\n");
        System.out.printf("\n");
        System.out.printf("Type 1 to flip your cards.\n");
        System.out.printf("Which ever player holds all the cards by the end wins.\n");
        int q = keyboard.nextInt();
        if (q == 1){
            System.out.printf("Lets see...\n");
        }
        if (q != 1){
            System.out.printf("That wasn't one... type the number '1' or else the game will end because you are stupid.\n");
            int q2 = keyboard.nextInt();
                if (q != 1) {
                System.exit(-1);
            }       
        }
        List<Integer> player1List = new ArrayList<Integer>();//converts array1 into arraylist1
        for (int i = 0; i < player1.length; i++)
        {
            player1List.add(player1[i]);
        }
        System.out.println(player1List);
        List<Integer> player2List = new ArrayList<Integer>();//converts array2 into arraylist2
        for (int i = 0; i < player2.length; i++)
        {
            player2List.add(player2[i]);
        }
        System.out.println(player2List);


        for (int i = 0; i < player1List.size(); i++){
            if (player1List.get(i) < player2List.get(i)){
                System.out.printf("Player 1: %d\n", player1List.get(i));
                System.out.printf("Player 2: %d\n", player2List.get(i));
                System.out.printf("Player 2 wins round!\n");
                player2List.add(player1List.get(i));
                player1List.remove(player1List.get(i));
            }
            if (player1List.get(i) < player2List.get(i)){
                System.out.printf("Player 1: %d\n", player1List.get(i));
                System.out.printf("Player 2: %d\n", player2List.get(i));
                System.out.printf("Player 1 wins round!\n");
                player1List.add(player2List.get(i));
                player2List.remove(player2List.get(i));
            }
            if (player1List.get(i) == player2List.get(i)){
                System.out.printf("Player 1: %d\n", player1List.get(i));
                System.out.printf("Player 2: %d\n", player2List.get(i));
                System.out.printf("It's a tie, cards return to your deck.\n");
            }
        }
        if (player1List.isEmpty() || player2List.isEmpty()){
            if (player1List.isEmpty()) {
                System.out.printf("Player 2 WINS THE GAME!!!!!!\n");
            }
            if (player2List.isEmpty()) {
                System.out.printf("Player 1 WINS THE GAME!!!!!!\n");
            }
        }


        System.out.println(player1List);

        System.out.println(player2List);


        /*
        System.out.printf("test.\n");
        System.out.printf("test1111.\n");
        for(int i = 0; i < player1.length; i++){
            System.out.println(player1[i]);
        }
        System.out.printf("test.\n");
        System.out.printf("test222.\n");
        for(int i = 0; i < player2.length; i++){
            System.out.println(player2[i]);
        }
        System.out.printf("test.\n");
        System.out.printf("test11.\n");
        for(int i = 0; i < win1.length; i++){
            System.out.println(win1[i]);
        }
        System.out.printf("test.\n");
        System.out.printf("test22.\n");
        for(int i = 0; i < win2.length; i++){
            System.out.println(win2[i]);
        }
        */

        System.out.printf("\n");
        System.out.printf("\n");
    }
}

Вот мой за кругом суженный. Мне это нужно, чтобы оно зацикливалось до тех пор, пока один из массивов не опустеет.

    for (int i = 0; i < player1List.size(); i++){
        if (player1List.get(i) < player2List.get(i)){
            System.out.printf("Player 1: %d\n", player1List.get(i));
            System.out.printf("Player 2: %d\n", player2List.get(i));
            System.out.printf("Player 2 wins round!\n");
            player2List.add(player1List.get(i));
            player1List.remove(player1List.get(i));
        }
        if (player1List.get(i) < player2List.get(i)){
            System.out.printf("Player 1: %d\n", player1List.get(i));
            System.out.printf("Player 2: %d\n", player2List.get(i));
            System.out.printf("Player 1 wins round!\n");
            player1List.add(player2List.get(i));
            player2List.remove(player2List.get(i));
        }
        if (player1List.get(i) == player2List.get(i)){
            System.out.printf("Player 1: %d\n", player1List.get(i));
            System.out.printf("Player 2: %d\n", player2List.get(i));
            System.out.printf("It's a tie, cards return to your deck.\n");
        }
    }
    if (player1List.isEmpty() || player2List.isEmpty()){
        if (player1List.isEmpty()) {
            System.out.printf("Player 2 WINS THE GAME!!!!!!\n");
        }
        if (player2List.isEmpty()) {
            System.out.printf("Player 1 WINS THE GAME!!!!!!\n");
        }
    }

3 ответа

Я бы предложил использовать Очередь для ваших колод, так как вам нужно положить (предложить) карты на одну сторону колоды (внизу) и извлечь (опросить) карты сверху (насколько я понимаю из записи в Википедии об этом). игра). LinkedList это хорошая реализация Queue, Код может выглядеть примерно так:

while(!deck1.isEmpty() && !deck2.isEmpty()) {
    int card1 = deck1.poll();
    int card2 = deck2.poll();

    if(card1 < card2) {
        deck2.offer(card2);
        deck2.offer(card1);
    }

    if(card2 < card1) {
        deck1.offer(card1);
        deck1.offer(card2);
    }

    if(card1 == card2) {
        deck1.offer(card1);
        deck2.offer(card2);
    }
}

Эй, вы должны использовать два счетчика, вместо одного для (int i = 0; i

другая ошибка: if (player1List.get(i)

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

например.

for (int i = 0; i < player1List.size(); i++){

  player1List.remove(i);

}

В приведенном выше коде, при входе в цикл, i установлен в 0и player1List.size() возвращает 2 - так что цикл введен. Во время этого цикла элемент удаляется из ArrayList, и после проверки второй итерации цикла player1List.size() теперь возвращает 1 (так как элемент был удален), тогда он не проходит проверку цикла, и не повторяется во второй раз.

Вам нужно найти подход, который не предполагает изменения списка, который вы перебираете. (возможно, clone() Это? или, может быть, скопировать элементы во временный массив?)

НТН

Другие вопросы по тегам