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

Java开发Risk游戏:攻击阶段排序后如何追踪变量?

解决Risk游戏攻击回合骰子排序与追踪问题

嘿,我完全懂你在开发Risk攻击环节时遇到的麻烦——要处理骰子排序,还得能追踪每个结果对应的原始掷骰单位对吧?毕竟Risk的规则里,攻击者掷3枚骰、防守者掷2枚,排序后要两两比较,但单独存三个int变量的话,排序后就彻底搞不清哪个值对应哪个单位了。

这里给你一个简单又清晰的解决方案:用自定义对象封装每个骰子的结果和它的标识,这样排序后依然能保留原始信息。

步骤1:创建封装骰子的自定义类

我们可以写一个DiceRoll类,把骰子点数和对应的单位标识(比如是攻击者的第1/2/3个单位)存在一起,同时实现Comparable接口来支持按点数排序:

class DiceRoll implements Comparable<DiceRoll> {
    private final int value; // 骰子点数
    private final String unitId; // 对应的单位标识,比如"attacker_1"

    public DiceRoll(int value, String unitId) {
        this.value = value;
        this.unitId = unitId;
    }

    // 获取点数
    public int getValue() {
        return value;
    }

    // 获取单位标识
    public String getUnitId() {
        return unitId;
    }

    // 按点数降序排序(Risk规则里大的骰子先比较)
    @Override
    public int compareTo(DiceRoll other) {
        return Integer.compare(other.value, this.value);
    }

    @Override
    public String toString() {
        return unitId + ": " + value;
    }
}

步骤2:生成并排序骰子结果

接下来在攻击逻辑里,我们生成攻击者和防守者的骰子列表,排序后依然能追踪每个结果的来源:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class RiskAttackHandler {
    public static void main(String[] args) {
        Random random = new Random();

        // 生成攻击者的3个骰子,每个绑定单位标识
        List<DiceRoll> attackerRolls = new ArrayList<>();
        attackerRolls.add(new DiceRoll(random.nextInt(6) + 1, "attacker_unit_1"));
        attackerRolls.add(new DiceRoll(random.nextInt(6) + 1, "attacker_unit_2"));
        attackerRolls.add(new DiceRoll(random.nextInt(6) + 1, "attacker_unit_3"));

        // 对攻击者骰子降序排序
        Collections.sort(attackerRolls);
        System.out.println("排序后的攻击者骰子:");
        attackerRolls.forEach(System.out::println);

        // 防守者的2个骰子同理
        List<DiceRoll> defenderRolls = new ArrayList<>();
        defenderRolls.add(new DiceRoll(random.nextInt(6) + 1, "defender_unit_1"));
        defenderRolls.add(new DiceRoll(random.nextInt(6) + 1, "defender_unit_2"));
        Collections.sort(defenderRolls);
        System.out.println("\n排序后的防守者骰子:");
        defenderRolls.forEach(System.out::println);
    }
}

步骤3:实现攻击结果比较

有了排序后的骰子列表,就能轻松按照Risk规则比较胜负,同时明确知道哪个单位参与了胜负判定:

// 按规则两两比较(最多比较2组,因为防守者只有2个骰子)
for (int i = 0; i < Math.min(attackerRolls.size(), defenderRolls.size()); i++) {
    DiceRoll attackerDie = attackerRolls.get(i);
    DiceRoll defenderDie = defenderRolls.get(i);

    if (attackerDie.getValue() > defenderDie.getValue()) {
        System.out.printf("%s 击败了 %s,防守方损失1单位%n", 
                          attackerDie.getUnitId(), defenderDie.getUnitId());
        // 这里写防守方减员的逻辑
    } else {
        System.out.printf("%s 击败了 %s,攻击方损失1单位%n", 
                          defenderDie.getUnitId(), attackerDie.getUnitId());
        // 这里写攻击方减员的逻辑
    }
}

这种方法的好处是逻辑清晰、扩展性强——如果后续需要给骰子添加更多属性(比如是否是精英单位),直接在DiceRoll类里加字段就行,不用改排序和比较的核心逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:03:36