You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

额外优化说明

  1. 卡组移动优化:前移卡组时仅遍历当前有效卡牌数量(cards1/cards2),而非整个数组,提升效率同时避免无效操作。
  2. 平局处理:添加了基础的平局逻辑(双方收回自己的卡牌),可根据需求扩展为完整的“战争”规则(双方再出多张牌进行比较)。

内容的提问来源于stack exchange,提问作者Seruloo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:54:54