游戏战斗开始

下面展示一些 内联代码片

// An highlighted block
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 游戏战斗场景模拟 - 生产者消费者模型实现
 * 核心:两位玩家都准备后,才开始战斗
 */
public class GameBattle {

    // 共享资源:战斗准备计数器
    private final Object lock = new Object(); // 共享锁对象
    private final int totalPlayersRequired; // 需要准备的总玩家数(通常为2)
    private AtomicInteger readyCount = new AtomicInteger(0); // 当前已准备的玩家数

    public GameBattle(int totalPlayersRequired) {
        this.totalPlayersRequired = totalPlayersRequired;
    }

    /**
     * 玩家准备方法(生产者)
     * @param playerName 玩家名称
     * @throws InterruptedException
     */
    public void playerReady(String playerName) throws InterruptedException {
        synchronized (lock) {
            // 1. 检查是否所有玩家已准备
            while (readyCount.get() >= totalPlayersRequired) {
                System.out.println("所有玩家已准备,战斗即将开始..." + playerName + " 请等待下一场。");
                lock.wait(); // 战斗已就绪,后续玩家等待
            }

            // 2. 玩家准备
            int currentReady = readyCount.incrementAndGet();
            System.out.println("玩家 " + playerName + " 已准备。当前准备人数: " + currentReady + "/" + totalPlayersRequired);

            // 3. 检查是否所有玩家都已准备
            if (currentReady == totalPlayersRequired) {
                System.out.println("\n所有玩家准备完毕!战斗开始!\n");
                lock.notifyAll(); // 唤醒所有等待的消费者(战斗线程)
            }
        }
    }

    /**
     * 等待并开始战斗方法(消费者)
     * @throws InterruptedException
     */
    public void startBattle() throws InterruptedException {
        synchronized (lock) {
            // 1. 检查是否满足开始条件
            while (readyCount.get() < totalPlayersRequired) {
                System.out.println("战斗线程等待: 玩家尚未准备就绪...");
                lock.wait(); // 条件未满足,消费者等待
            }

            // 2. 战斗逻辑
            System.out.println("战斗线程被唤醒,执行战斗逻辑...");
            // 这里可以模拟战斗过程
            Thread.sleep(1000); // 模拟战斗耗时
            System.out.println("战斗结束!");

            // 3. 重置状态,准备下一场战斗(可选)
            readyCount.set(0);
            System.out.println("系统已重置,准备下一场战斗。");
            lock.notifyAll(); // 唤醒可能等待的生产者(玩家)
        }
    }

    /**
     * 测试主方法
     */
    public static void main(String[] args) {
        final GameBattle battle = new GameBattle(2); // 2名玩家

        // 创建两个玩家线程
        Thread player1 = new Thread(() -> {
            try {
                Thread.sleep(100); // 模拟网络延迟或玩家操作时间
                battle.playerReady("玩家A");
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        Thread player2 = new Thread(() -> {
            try {
                Thread.sleep(200); // 模拟玩家B准备稍慢
                battle.playerReady("玩家B");
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 创建战斗线程(消费者)
        Thread battleThread = new Thread(() -> {
            try {
                battle.startBattle();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 启动线程
        battleThread.start(); // 先启动战斗等待线程
        player1.start();
        player2.start();

        // 等待所有线程结束
        try {
            player1.join();
            player2.join();
            battleThread.join();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值