You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现玩家与敌人回合随机顺序的循环迭代?

解决回合随机排序的方案

刚好之前也碰到过类似的回合制顺序问题,给你分享个简单靠谱的实现思路,用C++标准库就能搞定:

核心思路

  • 先把玩家列表和敌人列表合并成一个包含所有角色的统一列表
  • 用随机洗牌算法打乱这个列表的顺序,确保每次运行的回合次序都不一样
  • 重点要初始化随机种子,不然每次洗牌结果会完全重复

具体代码实现

首先得补上几个必要的头文件:

#include <vector>
#include <algorithm>
#include <random>
#include <chrono>

然后替换你原来的合并循环逻辑,改成下面的流程(假设你的Player和Enemy都继承自Character基类):

// 假设你的玩家列表是vector<Player> players,敌人列表是vector<Enemy> enemies
std::vector<Character*> allCharacters;

// 把玩家和敌人都加入总列表
for (auto& player : players) {
    allCharacters.push_back(&player);
}
for (auto& enemy : enemies) {
    allCharacters.push_back(&enemy);
}

// 用当前时间做随机种子,保证每次运行的随机序列不同
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
// 调用标准库的洗牌函数打乱顺序
std::shuffle(allCharacters.begin(), allCharacters.end(), std::default_random_engine(seed));

// 现在遍历这个打乱后的列表,就是随机的回合顺序了
for (auto& character : allCharacters) {
    // 执行角色的回合逻辑,比如调用takeTurn()方法
    character->takeTurn();
}

关键细节说明

  • 为什么用基类指针?:因为Player和Enemy是Character的子类,用基类指针可以利用多态特性,统一调用子类的回合逻辑,避免对象切片问题。
  • 随机种子不能少:如果不设置种子,std::shuffle会用固定默认值,导致每次运行的顺序完全一样,用系统时间做种子能保证真正的随机性。
  • 可复用优化:如果不想每次都重新合并列表,可以把合并逻辑抽出来只做一次,每次循环前单独调用洗牌函数就行:
    void shuffleTurnOrder(std::vector<Character*>& chars) {
        unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
        std::shuffle(chars.begin(), chars.end(), std::default_random_engine(seed));
    }
    
    // 使用时:
    shuffleTurnOrder(allCharacters);
    for (auto& c : allCharacters) {
        c->takeTurn();
    }
    

这样每次运行游戏,玩家和敌人的回合顺序都会完全随机,完美解决你的需求~

内容的提问来源于stack exchange,提问作者Damonlaws

火山引擎 最新活动