[英]Java card game. (Game of War)
因此,我必須實施紙牌游戲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循環范圍縮小了。 我需要它,以便它循環直到arraylists之一為空。
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");
}
}
我建議對您的卡座使用Queue ,因為您需要將卡( 提供 )放在卡座的一側(底部),並從頂部檢索( 投票 )卡(據我從Wikipedia條目中了解到的)游戲)。 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 <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的秒
我相信您遇到的問題是由於您更改了要遍歷的ArrayList。
例如。
for (int i = 0; i < player1List.size(); i++){
player1List.remove(i);
}
在上面的代碼中,進入循環后, i
設置為0
,player1List.size()返回2
因此進入了循環。 在此循環期間,從ArrayList中刪除了一個元素,並且在檢查了循環的第二次迭代后,player1List.size()現在返回1
(因為已刪除了一個元素),這使循環檢查失敗,並且它沒有進行第二回合。
您需要找到一種不涉及更改要迭代的List的方法。 (也許是clone()
嗎?還是可以將元素復制到臨時數組中?)
高溫超導
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.