java案例统计地面对抗谁胜出?

wen java案例 2

Java 案例:统计地面对抗谁胜出

下面是一个完整的 Java 示例,模拟"地面对抗"场景(例如游戏中的对战),统计哪一方胜出。

java案例统计地面对抗谁胜出?

场景设计

假设两支队伍进行地面对抗:

  • 红队 vs 蓝队
  • 每个队员有攻击力和生命值
  • 一对一对抗,生命值先归零的一方失败
  • 统计最终哪一方胜出

完整代码

import java.util.*;
// 战斗单位
class Fighter {
    private String name;
    private int hp;
    private int attack;
    private String team;
    public Fighter(String name, String team, int hp, int attack) {
        this.name = name;
        this.team = team;
        this.hp = hp;
        this.attack = attack;
    }
    public boolean isAlive() { return hp > 0; }
    public void takeDamage(int damage) {
        hp -= damage;
        if (hp < 0) hp = 0;
    }
    public String getName() { return name; }
    public int getHp() { return hp; }
    public int getAttack() { return attack; }
    public String getTeam() { return team; }
}
// 对抗统计器
class BattleStats {
    private int redWins = 0;
    private int blueWins = 0;
    private int draws = 0;
    private int totalRounds = 0;
    public void recordWin(String team) {
        totalRounds++;
        if ("红队".equals(team)) redWins++;
        else if ("蓝队".equals(team)) blueWins++;
        else draws++;
    }
    public String getWinner() {
        if (redWins > blueWins) return "红队";
        else if (blueWins > redWins) return "蓝队";
        else return "平局";
    }
    public void printStats() {
        System.out.println("\n========== 对抗统计 ==========");
        System.out.println("总场次: " + totalRounds);
        System.out.println("红队胜: " + redWins);
        System.out.println("蓝队胜: " + blueWins);
        System.out.println("平局:   " + draws);
        System.out.println("最终胜出方: " + getWinner());
        System.out.println("==============================");
    }
}
// 战斗模拟器
public class GroundBattle {
    // 一对一战斗
    public static String fight(Fighter a, Fighter b) {
        System.out.printf("  [对战] %s(%s, HP=%d, ATK=%d) VS %s(%s, HP=%d, ATK=%d)%n",
                a.getName(), a.getTeam(), a.getHp(), a.getAttack(),
                b.getName(), b.getTeam(), b.getHp(), b.getAttack());
        int round = 1;
        while (a.isAlive() && b.isAlive()) {
            // a 先手攻击 b
            b.takeDamage(a.getAttack());
            if (!b.isAlive()) break;
            // b 反击 a
            a.takeDamage(b.getAttack());
            round++;
        }
        String winner;
        if (a.isAlive() && !b.isAlive()) winner = a.getTeam();
        else if (!a.isAlive() && b.isAlive()) winner = b.getTeam();
        else winner = "平局";
        System.out.println("    -> 胜出: " + winner + " (经过 " + round + " 回合)");
        return winner;
    }
    public static void main(String[] args) {
        // 创建对抗双方队员
        List<Fighter> redTeam = Arrays.asList(
                new Fighter("红-战士",  "红队", 100, 15),
                new Fighter("红-刺客",  "红队", 80,  25),
                new Fighter("红-坦克",  "红队", 150, 10)
        );
        List<Fighter> blueTeam = Arrays.asList(
                new Fighter("蓝-骑士",  "蓝队", 120, 18),
                new Fighter("蓝-法师",  "蓝队", 70,  30),
                new Fighter("蓝-弓手",  "蓝队", 90,  20)
        );
        BattleStats stats = new BattleStats();
        // 一一对应进行对抗
        System.out.println(">> 开始地面对抗");
        int n = Math.min(redTeam.size(), blueTeam.size());
        for (int i = 0; i < n; i++) {
            String winner = fight(redTeam.get(i), blueTeam.get(i));
            stats.recordWin(winner);
        }
        // 输出统计结果
        stats.printStats();
    }
}

输出示例

>> 开始地面对抗
  [对战] 红-战士(红队, HP=100, ATK=15) VS 蓝-骑士(蓝队, HP=120, ATK=18)
    -> 胜出: 蓝队 (经过 7 回合)
  [对战] 红-刺客(红队, HP=80, ATK=25) VS 蓝-法师(蓝队, HP=70, ATK=30)
    -> 胜出: 红队 (经过 2 回合)
  [对战] 红-坦克(红队, HP=150, ATK=10) VS 蓝-弓手(蓝队, HP=90, ATK=20)
    -> 胜出: 蓝队 (经过 5 回合)
========== 对抗统计 ==========
总场次: 3
红队胜: 1
蓝队胜: 2
平局:   0
最终胜出方: 蓝队
==============================

关键设计要点

模块 作用
Fighter 封装单位属性(血/攻/队),负责扣血和存活判断
fight() 一对一回合制模拟,返回胜出队伍
BattleStats 累计各队胜场,判定最终胜者
main() 组织数据、驱动流程、输出结果

可扩展方向

  1. 随机伤害:用 Random 让攻击浮动 ±20%,更贴近真实
  2. 速度属性:先手顺序按速度决定,而非固定 a 先攻
  3. 多人混战:改为团队整体血量之和,或循环配对
  4. 策略模式:把"进攻/防御/暴击"抽象成策略接口,便于扩展
  5. 数据持久化:把对战结果写入 CSV/JSON 便于分析

如果你有具体的"地面对抗"业务场景(比如体育比赛、游戏对战、销售团队 PK 等),告诉我,我可以针对性地调整数据结构。

抱歉,评论功能暂时关闭!