改进棋盘游戏回合处理 我在C++中有一个非常简单的棋盘游戏。目前,根据游戏中的玩家数量,玩家被分配一个玩家编号(1、2、3…N)。相当标准。球员及其统计数据保存在一个文件中,其中包括他们的姓名和号码。然后,我通过读取包含turn文件的目录来处理turn。回合由玩家提交,只包含玩家姓名和任务/回合。在未来,我计划更改玩家编号,以便混淆游戏顺序

改进棋盘游戏回合处理 我在C++中有一个非常简单的棋盘游戏。目前,根据游戏中的玩家数量,玩家被分配一个玩家编号(1、2、3…N)。相当标准。球员及其统计数据保存在一个文件中,其中包括他们的姓名和号码。然后,我通过读取包含turn文件的目录来处理turn。回合由玩家提交,只包含玩家姓名和任务/回合。在未来,我计划更改玩家编号,以便混淆游戏顺序,c++,algorithm,C++,Algorithm,(如果你是一个棋盘游戏玩家,想想凯卢斯或阿格里科拉) 玩家在应用程序开始时被读入。然后,我发出一个命令并处理转弯。基本上,我只是简单地读取轮次目录,1乘1,并将该轮次与玩家名称匹配。目前,没有顺序顺序处理。玩家3可以先于玩家2 我认为这不是一个很好的设计,所以我提出了以下解决方案: 当我比较哪个回合和哪个玩家时,将该回合插入std::map,关键是玩家编号 在我收集所有回合后,在地图中搜索玩家N,从1开始,并处理他的回合。 我在这里再次遍历玩家列表,因为我需要将玩家与玩家编号匹配,以便处理回

(如果你是一个棋盘游戏玩家,想想凯卢斯或阿格里科拉)

玩家在应用程序开始时被读入。然后,我发出一个命令并处理转弯。基本上,我只是简单地读取轮次目录,1乘1,并将该轮次与玩家名称匹配。目前,没有顺序顺序处理。玩家3可以先于玩家2

我认为这不是一个很好的设计,所以我提出了以下解决方案:

  • 当我比较哪个回合和哪个玩家时,将该回合插入
    std::map
    ,关键是玩家编号
  • 在我收集所有回合后,在地图中搜索玩家N,从1开始,并处理他的回合。
    • 我在这里再次遍历玩家列表,因为我需要将玩家与玩家编号匹配,以便处理回合
  • 这样做,直到我处理完所有玩家
有更好的方法吗?这看起来很麻烦,而且开销很大

谢谢


注意:我的回合处理方法包含一个
玩家类(代表玩家统计文件)和一个
结构(代表从回合文件中读取的回合)。

您可能会考虑为在回合中行动的玩家定义一个动作类,该动作类由玩家编号和回合编号定义,并在此类上定义一个比较。读取文件中的所有操作,将它们插入到有序列表中,然后处理这些操作。

据我所知,您的问题是您有一些链接数据:
Turn
s、
PlayerID
s和
PlayerTurnPosition
s(好的,后两个是整数,但我假设您已经将它们键入类似的值以避免混淆)。您希望保持从PlayerID和PlayerTurnPosition值到相应回合的查找,并且还保持玩家信息之间的双向关系

这只是大声喊着使用一个附加了一些额外信息的配对关系;比如

boost::bimaps::bimap< 
    boost::bimaps::vector_of<PlayerID>, 
    boost::bimaps::vector_of<PlayerTurnPosition>, 
    boost::bimaps::with_info<boost::shared_ptr<Turn> > 
  >
boost::bimap::bimap<
boost::bimaps::向量,
boost::bimaps::向量,
boost::bimap::with_info
>
应该可以很好地完成这项工作(尽管左/右视图容器类型还有其他选项;
set\u of
可能更有意义,因为playerID和位置可能是唯一的)


这类
的示例,使用_info
用法。

考虑到玩家数量较少,迭代一个简单的数组类型可能就足够了。在这种情况下,复杂的结构往往比原始的结构慢。是时候尝试bimap了!谢谢tim!嗯,实际上bimap可能无法让我达到我想要的位置nt。有第四条数据,这是玩家状态数据。我的设计可能很糟糕。如果你只需要从PlayerID到PlayerStatus,那它不能存储在另一个表中吗?当然,如果你真的需要从玩家状态到玩家ID进行查找……那么总是有boost::multi_索引——这就是gbimap的通用化。不过使用起来要灵活得多(IMHO)。我想我可以走这条路。我可以根据玩家数量为向量创建一个简单的排序函数,并处理加载到该玩家中的回合。