0

所以我不得不实现卡牌游戏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循环。我需要它,所以它会循环,直到其中一个数组列表为空。

    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");
        }
    }
4

3 回答 3

1

我建议为您的套牌使用队列,因为您需要将(提供)卡片放在套牌的一侧(底部)并从顶部检索(投票)卡片(据我所知,维基百科条目对此游戏)。ALinkedList是 a 的一个很好的实现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);
    }
}
于 2012-03-19T03:31:23.883 回答
0

我相信您遇到的问题是由于您更改了正在迭代的 ArrayList。

例如。

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

  player1List.remove(i);

}

在上面的代码中,进入循环后,i设置为0,并且 player1List.size() 返回2- 所以进入了循环。在此循环期间,从 ArrayList 中删除一个元素,并且在检查循环的第二次迭代时, player1List.size() 现在返回1(因为删除了一个元素),然后循环检查失败,并且它不会循环第二次。

您需要找到一种不涉及更改您正在迭代的列表的方法。(也许clone()是?或者可能将元素复制到临时数组中?)

高温高压

于 2012-03-19T03:29:16.083 回答
0

嘿,你必须使用两个计数器,而不是一个 for (int i = 0; i < player1List.size(); i++) //一个计数器你无法预测谁的牌结束了!for (int i = 0, j = 0; i < player1List.size() && j < player2List.size(); i++, j++)//像这样

另一个错误是: if (player1List.get(i) < player2List.get(i)) //for 循环的第二个 if 条件

于 2013-01-04T07:50:32.477 回答