读书人

C++ 取石头子儿游戏

发布时间: 2013-10-15 16:47:37 作者: rapoo

C++ 取石子游戏
1.游戏图文说明



C++ 取石头子儿游戏



这个游戏是这样玩的:

开始有两堆石子,第一堆有2个,第二堆有1个,开始是玩家1开始取石子,然后是玩家2取石子,规则是只能取某一堆的至少一颗石子,两人轮流取石子,直到有人取完石子,谁就输了。


上图列出了游戏的所有可能:

假设玩家1取了第一堆中的一颗石子,那么在接下来的回合,玩家2无论取第一堆或者第二堆石子中的一颗,那么玩家1都将会输掉这个比赛。玩家1正确的做法就是取走第一堆的两颗石子,这样就赢了。当然如果玩家1取走第二堆中的石子,除非玩家2脑残地取走了第一堆中的2颗石子,玩家1将会输掉这个比赛。


先好好理解下上面所说的,看起来很简单,我们这次的目的是要创建一个电脑对手,它必须知道所有的游戏可能,它必须足够聪明,让玩家头痛。


2.用程序模拟比赛所有可能


2.1创建一个树的数据结构来存储所有结果



C++ 取石头子儿游戏


把上面实体的所有比赛过程可以转换成一个树的数据结构。我们需要存储所有的可能。当我们像上面的情况2,1时,有11种情况,然而如果是有4堆石子,它们数量分别是4,2,2,2的情况,总共有228291种情况,计算时间要12秒!真令人吃惊。可能是我写的算法太垃圾。


首先我们创建一个Rocks的类表示每一堆。有两个属性,一个是堆的索引,表示第几堆,另一个表示堆里石子的数量。



每一个节点我们还有一个属性来标识是否对玩家有利,有利表示1,失利表示0,这个是我们根据石子堆2,1,1统计出的树。主要有3点。

    先看最末端节点,如果是电脑结束游戏,那么玩家就输了,是玩家拿完最后一颗石子。再看最右边,是如何得出1的呢?因为是玩家回合,只要有一个孩子是1,它就是1,因为有一个结果对玩家有利,理论上玩家就会选择这个再看最左边的,因为是电脑回合,所以只有他的所有孩子都是1,它才是1,如果有一个是0,电脑就会选择它了,玩家就输了,看下这个节点的兄弟节点都是0。

代码是这样的,再次用了递归,速度非常慢。



4.整个项目代码下载:

http://www.waitingfy.com/?attachment_id=719

5.游戏规则参考:

http://www.waitingfy.com/?p=725


《Data Structures For Game Programmers》



读书人网 >C++

热点推荐