综合java案例,哪队能笑到最后?

wen java案例 3

本文目录导读:

综合java案例,哪队能笑到最后?

  1. 案例题目:模拟“城市争霸赛”
  2. 代码实现解析
  3. 为什么这个案例“综合”?
  4. “哪队能笑到最后”的趣味变化

我可以为你设计一个综合Java案例,通过一个“模拟篮球/足球联赛”“智力问答对决”的程序,来回答“哪队能笑到最后”。

这里我提供一个经典且有趣的案例:《模拟淘汰赛:冠军之路》,它会综合运用面向对象(继承/接口)、集合框架、多线程(模拟比赛耗时)、Lambda/Stream、异常处理等核心知识。


案例题目:模拟“城市争霸赛”

背景设定:有4支球队(代码、算法、架构、测试)参加一场锦标赛,采用单败淘汰制(半决赛 -> 决赛),为了增加趣味性,比赛结果不仅取决于球队实力(基础属性),还会加入随机爆发因子(模拟临场发挥)。

核心需求

  1. 定义球队抽象类,包含队名、士气值、基础战力。
  2. 定义不同特点的球队子类(如“进攻型”、“防守型”)。
  3. 使用多线程模拟比赛过程(每场比赛耗时不同,谁先跑完谁赢?不,我们用分数判定,但用线程模拟过程)。
  4. 使用集合与Stream对球队进行排序和分组。
  5. 最终输出“笑到最后”的冠军队。

代码实现解析

我们按步骤拆解这个经典案例:

第一步:定义抽象球队(面向对象 - 抽象类 + 模板方法)

// 球队抽象类
public abstract class Team {
    private String name;
    private int morale; // 士气 0-100
    private int basePower; // 基础战斗力
    public Team(String name, int morale, int basePower) {
        this.name = name;
        this.morale = Math.max(0, Math.min(100, morale)); // 限制范围
        this.basePower = basePower;
    }
    // 抽象方法:获取球队特有战术加成(子类必须实现)
    public abstract int getTacticalBonus();
    // 模板方法:计算最终战力(士气影响 + 战术加成 + 随机发挥)
    public final int calculateFinalPower() {
        // 士气加权(士气越高,战力越稳定或越强)
        double moraleFactor = 0.8 + (morale / 100.0) * 0.4; // 0.8 ~ 1.2
        int baseCalc = (int) (basePower * moraleFactor);
        // 随机爆发(+0 ~ 20 点)
        int randomBonus = new java.util.Rator().nextInt(21);
        return baseCalc + getTacticalBonus() + randomBonus;
    }
    // Getter / toString...
}

第二步:定义具体球队(继承与多态)

class CodeTeam extends Team {
    public CodeTeam() {
        super("代码队", 90, 85); // 高士气,高基础
    }
    @Override
    public int getTacticalBonus() {
        return 10; // 代码重构加成
    }
}
class AlgorithmTeam extends Team {
    public AlgorithmTeam() {
        super("算法队", 75, 95); // 极高基础战力
    }
    @Override
    public int getTacticalBonus() {
        return 5; // 策略优化
    }
}
class ArchitectureTeam extends Team {
    public ArchitectureTeam() {
        super("架构队", 70, 80);
    }
    @Override
    public int getTacticalBonus() {
        return 15; // 系统稳定性加成
    }
}
class TestTeam extends Team {
    public TestTeam() {
        super("测试队", 85, 70);
    }
    @Override
    public int getTacticalBonus() {
        return 20; // 找Bug爆发力(专注于击败对手)
    }
}

第三步:比赛模拟(多线程 + 集合交互)

public class Championship {
    public static void main(String[] args) throws InterruptedException {
        List<Team> teams = new ArrayList<>(List.of(
                new CodeTeam(), new AlgorithmTeam(),
                new ArchitectureTeam(), new TestTeam()
        ));
        System.out.println("=== 参赛队伍 ===");
        teams.forEach(t -> System.out.println(t.getName() + " 基础战力: " + t.getBasePower()));
        // 使用 Stream 进行分组(比如按实力分组,这里简单打乱顺序)
        Collections.shuffle(teams);
        // 半决赛
        System.out.println("\n=== 半决赛开始 ===");
        Team finalist1 = playMatch(teams.get(0), teams.get(1));
        Team finalist2 = playMatch(teams.get(2), teams.get(3));
        // 决赛
        System.out.println("\n=== 总决赛 ===");
        Team champion = playMatch(finalist1, finalist2);
        System.out.println("\n? 最终获胜者(笑到最后): " + champion.getName() + " !!!");
    }
    // 单场比赛模拟(多线程)
    private static Team playMatch(Team t1, Team t2) throws InterruptedException {
        // 使用 CountDownLatch 模拟同时对抗
        ExecutorService executor = Executors.newFixedThreadPool(2);
        Future<Integer> score1 = executor.submit(() -> {
            Thread.sleep(new Random().nextInt(500) + 500); // 模拟比赛时间
            return t1.calculateFinalPower();
        });
        Future<Integer> score2 = executor.submit(() -> {
            Thread.sleep(new Random().nextInt(500) + 500);
            return t2.calculateFinalPower();
        });
        int score1Val = score1.get();
        int score2Val = score2.get();
        executor.shutdown();
        Team winner = (score1Val > score2Val) ? t1 : t2;
        Team loser = (score1Val > score2Val) ? t2 : t1;
        // 胜者士气提升,败者淘汰
        winner.setMorale(winner.getMorale() + 10);
        System.out.printf("[%s vs %s] 比分: %d : %d | 胜者: %s%n",
                t1.getName(), t2.getName(), score1Val, score2Val, winner.getName());
        return winner;
    }
}

为什么这个案例“综合”?

  1. 面向对象核心:抽象类(Team)、继承(四个子类)、多态(getTacticalBonus)。
  2. 模板方法设计模式calculateFinalPower 固定算法骨架,子类改变细节(战术加成)。
  3. 集合与StreamArrayListCollections.shuffleforEach、Lambda表达式。
  4. 多线程与并发:使用 ExecutorService 同时计算两队分数,模拟真实比赛是同时进行的。
  5. 未来与健壮性Future.get() 获取异步结果,处理 InterruptedException

“哪队能笑到最后”的趣味变化

为了让这个案例更具互动性,你可以增加以下扩展(作为思考题):

  • 黑马机制:如果士气值低于50,随机爆发上限提高到40(弱队爆冷)。
  • 小组赛循环赛:增加积分制,使用 Map<Team, Integer> 统计胜场。
  • 冠军预测:在比赛前,用计算好的“纸面实力”排序,比较预测结果和实际结果谁更准。

运行结果示例(每次随机可能不同):

=== 参赛队伍 ===
代码队 基础战力: 85
算法队 基础战力: 95
架构队 基础战力: 80
测试队 基础战力: 70
=== 半决赛开始 ===
[算法队 vs 测试队] 比分: 103 : 98 | 胜者: 算法队
[代码队 vs 架构队] 比分: 112 : 105 | 胜者: 代码队
=== 总决赛 ===
[算法队 vs 代码队] 比分: 99 : 117 | 胜者: 代码队
? 最终获胜者(笑到最后): 代码队 !!!

这个案例既考察了语法功底,又展示了软件设计思想,完美回答了“哪队能笑到最后”这一动态过程,如果你希望加入文件存储战绩(IO流)或图形化界面(Swing/JavaFX),这个案例可以无缝扩展,需要我帮你扩展某个特定部分吗?

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