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() |
组织数据、驱动流程、输出结果 |
可扩展方向
- 随机伤害:用
Random让攻击浮动 ±20%,更贴近真实 - 速度属性:先手顺序按速度决定,而非固定 a 先攻
- 多人混战:改为团队整体血量之和,或循环配对
- 策略模式:把"进攻/防御/暴击"抽象成策略接口,便于扩展
- 数据持久化:把对战结果写入 CSV/JSON 便于分析
如果你有具体的"地面对抗"业务场景(比如体育比赛、游戏对战、销售团队 PK 等),告诉我,我可以针对性地调整数据结构。