我有一个相当简单的棋盘游戏,我一直用C ++构建。目前,根据游戏中的玩家数量,为玩家分配玩家号码(1,2,3 ...... N)。很标准。球员及其统计数据保存在一个文件中,其中包括他们的姓名和号码。然后我通过读取带有转动文件的目录来处理转弯。转弯由玩家提交,仅包含玩家姓名和任务/转弯。将来,我计划让玩家数量发生变化,以便混淆游戏的顺序。
(如果你是一名棋盘游戏玩家,请考虑Caylus或Agricola)
玩家会在应用程序开始时读入。然后我给出一个命令并轮流处理。基本上,我只是简单地读取转弯目录,逐个1,并将该转弯与玩家名称相匹配。就目前而言,没有顺序依次处理。玩家3可以在玩家2之前离开。
我认为这不是一个很棒的设计,所以我提出了以下解决方案:
std::map<int, Turn>
,关键是玩家编号。有更好的方法吗?这看起来很笨拙,也有很多开销。
谢谢!
注意:我的回合处理方法包含Player class
(表示玩家统计档案文件)和struct
表示从回合文件中读取的回合。
答案 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类,该玩家类由玩家编号和转弯数定义,并定义此类的比较。从文件中读取所有操作,将它们插入到有序列表中,然后处理这些操作。