改善棋盘游戏处理

时间:2011-09-17 18:44:05

标签: c++ algorithm

我有一个相当简单的棋盘游戏,我一直用C ++构建。目前,根据游戏中的玩家数量,为玩家分配玩家号码(1,2,3 ...... N)。很标准。球员及其统计数据保存在一个文件中,其中包括他们的姓名和号码。然后我通过读取带有转动文件的目录来处理转弯。转弯由玩家提交,仅包含玩家姓名和任务/转弯。将来,我计划让玩家数量发生变化,以便混淆游戏的顺序。

(如果你是一名棋盘游戏玩家,请考虑Caylus或Agricola)

玩家会在应用程序开始时读入。然后我给出一个命令并轮流处理。基本上,我只是简单地读取转弯目录,逐个1,并将该转弯与玩家名称相匹配。就目前而言,没有顺序依次处理。玩家3可以在玩家2之前离开。

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

  • 当我比较哪个转弯与哪个玩家相关时,将该转弯插入std::map<int, Turn>,关键是玩家编号。
  • 在我收集了所有转弯之后,在地图中搜索玩家N,从1开始并处理轮到他。
    • 我在这里再次浏览球员名单,因为我需要将球员与球员号码相匹配才能处理转牌。
  • 这样做直到我处理完所有玩家。

有更好的方法吗?这看起来很笨拙,也有很多开销。

谢谢!

注意:我的回合处理方法包含Player class(表示玩家统计档案文件)和struct表示从回合文件中读取的回合。

2 个答案:

答案 0 :(得分:2)

据我所知,你的问题是你有一些链接数据:Turn s,PlayerID s和PlayerTurnPosition s(确定后者2是整数但是我'假设你已经将它们类型化为类似的东西,以避免混淆)。并且您希望保持从PlayerID和PlayerTurnPosition值到相应Turn的查找,并且还保持Player信息之间的双向关系。

这只是尖叫着使用boost::bimap并在每对关系上附加一些额外的信息;

之类的东西
boost::bimaps::bimap< 
    boost::bimaps::vector_of<PlayerID>, 
    boost::bimaps::vector_of<PlayerTurnPosition>, 
    boost::bimaps::with_info<boost::shared_ptr<Turn> > 
  >

应该很好地完成工作(尽管左/右视图容器类型还有其他选项; set_of可能更有意义,因为播放器ID和位置可能是唯一的。)

此类with_info使用in the docs的示例。

答案 1 :(得分:1)

您可能会想到为玩家轮流定义一个Action类,该玩家类由玩家编号和转弯数定义,并定义此类的比较。从文件中读取所有操作,将它们插入到有序列表中,然后处理这些操作。