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
相关产品推荐
相关产品推荐

