尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。
在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2 的幂次方减1——也就是3,7,15,31 或63。除了堆的大小已经是2 的幂次方减1,在其他情况下这样走都是符合游戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些
随机生成物品数量模块:
# 生成一个随机物品的数量
def res_num():
# 随机生成一个60——100的物品数量
resnum = random.randint(60,100)
# 返回生成的随机物品数量
return resnum
判断是否为2的n次方减一模块:
# 判断是否为2的幂次方减1
def N(n):
while True:
if ((n % 2) == 0)|(n == 1):
if n == 1:
i = 1
break
else:
n = n // 2
i = 1
else:
i = 0
break
# 如果是2的幂
if i == 1:
return 1
# 不是2的幂
else:
return 0
当玩家未拿走2的n次方减一物品时,机器人拿走2的n次方减一个 物品模块:
# 机器拿走物品
def robot_resnum(resnum):
# 机器每次只能取走剩下物品的一半
num = resnum // 2
i = 0
if resnum >= 3:
while True:
# 判断取走物品数码是不是2的幂,如果是2的幂
if N((num + 1)) == 1:
a = num
b = resnum - a
print("机器回合!")
print("机器人拿走%d个物品,还剩下%d个物品!" % (a, b))
break
# 不是2的幂,则继续向下取
else:
num = num - 1
else:
m = resnum - num
print("机器人拿走%d个物品,还剩下3个!"%m)
if (resnum - num) == 0:
print("机器人拿走1个物品,还剩下0个物品。")
print("恭喜你,你战胜了机器人!")
return resnum - 1
return (resnum - num)
当玩家拿走2的n次方个物品时,机器人随机取走一个物品模块:
# 机器人拿走物品2,玩家拿走2的幂机器人随机取一个
def robot_resnum2(resnum):
if resnum > 1:
a = resnum // 2
b = random.randint(1, a)
print("机器人拿走%d个物品,还剩下%d个物品。" % (b, resnum - b))
return resnum - b
else:
resnum = resnum - 1
print("机器人拿走1个物品,还剩下0个物品。")
print("恭喜你,你战胜了机器人!")
return resnum - 1
玩家取走物品模块:
# 玩家拿走物品
def people_resnum(resnum):
while True:
# 请输入你要取的物品数量
print("你的回合!")
print("请输入你要取的物品数量:")
num = int(input())
if (resnum - num) != 0:
if num <= (resnum / 2):
if N(num) == 1:
print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))
i = 1
break
else:
print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))
i = 0
break
else:
print("您输入的物品数量大于该堆物品数量一半,请重新输入!")
else:
print("你拿走1个物品,还剩下0个物品。")
print("很遗憾你败给了机器人,再接再厉!")
return resnum - num,1
return resnum - num, i
主函数模块:
# 获取随机生成的物品数量
resnum = res_num()
print("目前该堆物品中有%d个物品。"%resnum)
while True:
# 将目前物品数量传入函数
a = people_resnum(resnum)
resnum = a[0]
# 如果玩家拿的数量为2的幂
if resnum > 0:
if a[1] == 1:
# 将剩余物品数量传入函数robot_resnum
resnum = robot_resnum2(resnum)
# 如果玩家拿的不是2的幂
else:
# 将剩余物品数量传入函数robot_resnum
resnum = robot_resnum(resnum)
# 判断最后物品数量
if resnum <= 0:
break
完整代码:
import random
def res_num():
# 随机生成一个60——100的物品数量
resnum = random.randint(60,100)
# 返回生成的随机物品数量
return resnum
# 判断是否为2的幂次方减1
def N(n):
while True:
if ((n % 2) == 0)|(n == 1):
if n == 1:
i = 1
break
else:
n = n // 2
i = 1
else:
i = 0
break
# 如果是2的幂
if i == 1:
return 1
# 不是2的幂
else:
return 0
# 机器拿走物品
def robot_resnum(resnum):
# 机器每次只能取走剩下物品的一半
num = resnum // 2
i = 0
if resnum >= 3:
while True:
# 判断取走物品数码是不是2的幂,如果是2的幂
if N((num + 1)) == 1:
a = num
b = resnum - a
print("机器回合!")
print("机器人拿走%d个物品,还剩下%d个物品!" % (a, b))
break
# 不是2的幂,则继续向下取
else:
num = num - 1
else:
m = resnum - num
print("机器人拿走%d个物品,还剩下3个!"%m)
if (resnum - num) == 0:
print("机器人拿走1个物品,还剩下0个物品。")
print("恭喜你,你战胜了机器人!")
return resnum - 1
return (resnum - num)
# 机器人拿走物品2,玩家拿走2的幂机器人随机取一个
def robot_resnum2(resnum):
if resnum > 1:
a = resnum // 2
b = random.randint(1, a)
print("机器人拿走%d个物品,还剩下%d个物品。" % (b, resnum - b))
return resnum - b
else:
resnum = resnum - 1
print("机器人拿走1个物品,还剩下0个物品。")
print("恭喜你,你战胜了机器人!")
return resnum - 1
# 玩家拿走物品
def people_resnum(resnum):
while True:
# 请输入你要取的物品数量
print("你的回合!")
print("请输入你要取的物品数量:")
num = int(input())
if (resnum - num) != 0:
if num <= (resnum / 2):
if N(num) == 1:
print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))
i = 1
break
else:
print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))
i = 0
break
else:
print("您输入的物品数量大于该堆物品数量一半,请重新输入!")
else:
print("你拿走1个物品,还剩下0个物品。")
print("很遗憾你败给了机器人,再接再厉!")
return resnum - num,1
return resnum - num, i
# 获取随机生成的物品数量
resnum = res_num()
print("目前该堆物品中有%d个物品。"%resnum)
while True:
# 将目前物品数量传入函数
a = people_resnum(resnum)
resnum = a[0]
# 如果玩家拿的数量为2的幂
if resnum > 0:
if a[1] == 1:
# 将剩余物品数量传入函数robot_resnum
resnum = robot_resnum2(resnum)
# 如果玩家拿的不是2的幂
else:
# 将剩余物品数量传入函数robot_resnum
resnum = robot_resnum(resnum)
# 判断最后物品数量
if resnum <= 0:
break