简介
利用Matlab实现了一个人机棋子博弈游戏
玩法
随机生成4堆棋子(棋子数为10以内的整数),人先选,电脑后选,选到最后一个棋子胜,每次只能从一堆中选棋子,个数不限
算法
将每堆棋子的个数转为二进制a1,a2,a3,a4,进行二进制不进位相加得到a,规定a=0这个状态为偶状态,那么最后四堆全空也是偶状态。所以只要保证每轮选择完成后为偶状态,无论下一轮另一个怎么选择,都会破坏偶状态,再按照上面的方法恢复偶状态,循坏直到最后四堆全空的偶状态即胜利。如果最开始相加得出的a不为0,那么a1,a2,a3,a4中必有至少一个ai在a的最高位为1(若a为0100,则a1,a2,a3,a4中必有至少一个ai的第二位为1,注意从第0位开始),为了保证a=0,那么就在ai这堆中选择棋子,才能使a的最高位变为0。假设选择bi个,剩下(ai-bi)个,为了使a=0,必须保证剩下的(ai-bi)与另外三堆棋子的二进制和为0,即
- (a1-b1)+a2+a3+a4=0(假设i=1)
- 又 ∵ a1+a2+a3+a4=a
- ∴ a1-b1=a1-a
- ∵a1-b1为十进制运算,a1-a为二进制运算,二进制不进位相减即为相加
- ∴a1-b1=a+a1
- 即ai-bi(十进制减法)=a+ai(二进制不进位加法)
由此可得,每轮电脑要在ai这堆中剩下的棋子数为(a+ai)(二进制)个,那么电脑每轮要取走的棋子数bi,即
- bi=ai-(a+ai)
- 将二进制的a+ai转为十进制后,这是剩下的棋子个数,用总个数ai进行十进制减法即可得到取走的棋子数bi
若最初的a=0,则后选有必胜策略,若a!=0,则先选有必胜的策略,在这个程序中随机生成的一般a!=0,那么人先选,人如果知道这个算法,