本文最后更新于 208 天前,其中的信息可能已经有所发展或是发生改变。
基本规则
#尼姆游戏:两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏
#计算机每次拿走足够多的物品使得堆的大小是 2 的幂次方减 1——也就是 3,7,15,31 或 63。除了堆的大小已经是 2 的幂次方减 1,在其他情况下这样走都是符合游戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些。
获胜方法:
#玩家获胜:取完后保证剩余的数量为2的n次幂-1,让电脑随机取数
#电脑获胜:取数让剩余数量为2的n次幂-1,玩家取时数量为2的n次幂-1,则电脑必胜
代码实现
from math import log2
from random import randint
def everyStep(n):
num = n - (2**int(log2(n))-1)
half = n // 2
#让剩余物品数量为2的幂次方减1
if num <= half:
return num
#如果实在没有办法,就随机拿走一些
return randint(1, half) #随机产生括号里两个参数之间的整数,且包括这两个参数
def smartNimuGame(n):
while n > 1:
#人类玩家先走
print("轮到玩家,物品的数量为 {0} .".format(n))
#确保人类玩家输入合法整数值
while True:
try:
num = int(input('你想拿走多少物品(最少拿走一个,最多只能拿走一半):'))
print(f'现在还有{n-num}个物品')
assert 1 <= num <= n//2
break
except:
print('你可以获取物品的数量只能在 1 - {0} 之间'.format(n//2))
n -= num
if n == 1:
return 'I fail !'
#计算机玩家拿走一些
num = everyStep(n)
n -= num
print(f'计算机玩家拿走了{num}个物品,现在还剩{n}')
else:
return 'You fail !'
print(smartNimuGame(randint(1, 100)))