Java版战争卡牌游戏存在固定获胜者问题,与卡组初始值无关
问题分析与修复方案
核心问题
你的代码存在两个致命逻辑错误,直接导致了获胜者固定的异常:
1. 胜负判断完全颠倒
代码中boolean player = deck1[0] < deck2[0];的判断逻辑完全错误:当deck1[0] < deck2[0]时,明明是deck2的卡牌更大,应该deck2获胜,但代码却将两张卡牌加到deck1的卡组中,导致胜负结果完全反转。
2. 游戏结束条件错误
循环条件while (deck1[0] != 0 && deck2[0] != 0)不合理:当玩家的卡牌被移到数组后面时,数组首元素会变成0,但玩家实际还有卡牌(比如deck1的有效卡牌在索引1-25,首元素为0),此时循环会错误终止,提前结束游戏。
修正后的完整代码
import java.util.Scanner; import static java.lang.System.exit; public class War { public static void main(String[] args) { int numTimePlay = args.length > 0 ? Integer.parseInt(args[0]) : 0; if (numTimePlay < 1) { System.out.println("Error: invalid number"); exit(0); } // 开始游戏轮次 for (int m = 0; m < numTimePlay; m++) { // 初始化完整卡组:每4张为同数值不同花色 int[] fullDeck = new int[52]; for (int i = 0; i < fullDeck.length; i++) { fullDeck[i] = i + 1; } // 洗牌 for (int i = 0; i < fullDeck.length; i++) { int l = (int) (Math.random() * (52 - i)); int temp1 = fullDeck[i]; fullDeck[i] = fullDeck[l]; fullDeck[l] = temp1; } // 分配卡组给两名玩家 int[] deck1 = new int[52]; int[] deck2 = new int[52]; for (int i = 0; i < 26; i++) { deck2[i] = fullDeck[i]; } for (int i = 26; i < fullDeck.length; i++) { deck1[i - 26] = fullDeck[i]; } // 打印初始卡组(调试用) for (int i = 0; i < 52; i++){ System.out.print(deck1[i]+ " "); } System.out.println(); for (int i = 0; i < 52; i++){ System.out.print(deck2[i]+ " "); } System.out.println(); // 记录双方当前卡牌数量 int cards1 = 26; int cards2 = 26; // 修正结束条件:基于实际剩余卡牌数量判断 while (cards1 > 0 && cards2 > 0) { // 取出双方当前首张卡牌 int value1 = deck1[0]; int value2 = deck2[0]; // 将deck1卡组前移一位(移除首张已出的牌) for (int i = 1; i < cards1; i++){ deck1[i-1] = deck1[i]; } deck1[cards1 - 1] = 0; // 清空原最后一张有效牌的位置 cards1--; // 将deck2卡组前移一位(移除首张已出的牌) for (int i = 1; i < cards2; i++){ deck2[i-1] = deck2[i]; } deck2[cards2 - 1] = 0; // 清空原最后一张有效牌的位置 cards2--; // 修正胜负判断逻辑 if (value1 > value2) { // deck1获胜,将两张牌加到卡组底部 deck1[cards1] = value1; deck1[cards1 + 1] = value2; cards1 += 2; } else if (value2 > value1) { // deck2获胜,将两张牌加到卡组底部 deck2[cards2] = value2; deck2[cards2 + 1] = value1; cards2 += 2; } else { // 平局处理(基础版:双方收回各自卡牌) deck1[cards1] = value1; cards1++; deck2[cards2] = value2; cards2++; } } // 打印最终卡组(调试用) for (int i = 0; i < 52; i++){ System.out.print(deck1[i]+ " "); } System.out.println(); for (int i = 0; i < 52; i++){ System.out.print(deck2[i]+ " "); } System.out.println(); // 输出结果 if (cards1 == 0){ System.out.println("Player loses"); } else{ System.out.println("CPU loses"); } // 询问是否继续游戏 System.out.println("Do you want to continue? Y/N"); Scanner myScanner = new Scanner(System.in); String yes = myScanner.next(); if (!(yes.equals("Y"))){ System.out.println("Thanks for playing!"); exit(0); } } } }
额外优化说明
- 卡组移动优化:前移卡组时仅遍历当前有效卡牌数量(
cards1/cards2),而非整个数组,提升效率同时避免无效操作。 - 平局处理:添加了基础的平局逻辑(双方收回自己的卡牌),可根据需求扩展为完整的“战争”规则(双方再出多张牌进行比较)。
内容的提问来源于stack exchange,提问作者Seruloo
相关产品推荐
相关产品推荐

