玩家匹配算法

  • 本文关键字:匹配算法 玩家 c++
  • 更新时间 :
  • 英文 :


当玩家注册锦标赛推送vector时,以及当开始游戏匹配玩家并添加list(list有结构,2名玩家插入1个list(并在vector中擦除时的示例。获胜玩家添加重复vector。当回合结束时(例如vector有101名玩家,匹配的100名玩家战斗,获胜者是再次插入参与者vector第101名玩家经过并移动下一回合(。我在努力匹配,我在编码,但当下一轮移动进入无限循环时。我犯了什么错?(抱歉英语不好(我的代码;

struct sFighters
{
sFighters(int p1, int p2) : p1(p1), p2(p2) {}
int p1;
int p2;
};
std::vector<int> vec;
std::list<sFighters> dList;
void AddVec(int id)
{
if (const auto& it = std::find(vec.begin(), vec.end(), id); it == vec.end())
vec.push_back(id)
else
std::cout << "Already in vec" << std::endl;
}
void MakeList()
{
for (auto i = vec.size() - 1; i > 0; i-=2 )
{
dList.push_back(sFighters(vec[i], vec[i-1]));
std::erase(vec, vec[i]); std::erase(vec, vec[i-1]); // c++20 features
}
StartFightMode(); // for start fight player1 and player2
}
void FinishFight(int win, int lose)
{
if (const auto& it = std::find_if(dList.begin(), dList.end(),
[win,lose] (const auto& st)
{return (st->GetID() == p1 || st->GetID() == p2); }
); it != dList.end())
{
dList.erase(it);
}
vec.push_back(win);
if (dList.empty() && vec_size > 1)
{
MakeList();
return;
}
if (dList.empty() && vec.size() == 1)
{
std::cout << "Winner player id: " << vec.begin() << std::endl; 
return;
}

StartFightMode(); // check dList and start fight player1 and player2
}

我的c++有点生疏,但在MakeList中,如果我是无符号的,并且在循环的每次迭代中从中减去两个,那么它可能永远不会小于或等于零。

循环中的for (auto i = vec.size() - 1; i > 0;i将是无符号长整型。所以CCD_ 11是偶数CCD_ 12将是奇数。当i==1和您调用i-=2时,i将变为2^64-1>0,因此循环将继续。

解决方案1:代替auto,将int写入i类型(速度会有小损失,但应忽略不计(

解决方案2:从头开始,不断迭代。

重要提示:std::erase将删除所有等于vec[i]vec[i-1]的元素。如果您有一个与其中一个元素相等的其他元素,则vec的大小将减少2以上,因此在下一个循环中,您将从vec索引出来。使用pop_back()(也快得多(

最新更新