实验原理与内容:
本实验完成一个模拟聪明版的尼姆游戏功能:
尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分,在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。
在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2 的幂次方减1——也就是3,7,15,31 或63。除了堆的大小已经是2 的幂次方减1,在其他情况下这样走都是符合游戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些。
编写程序,模拟聪明版本的尼姆游戏。
本实验中主要涉如下过程。
1.游戏分析与算法设计
2.使用Python编写游戏程序
3.编写Python源文件
4.编译/调试程序
5.运行程序
实现代码:
from random import randint,choice
def everyStep(n):
half = n/2
m = 1
# 所有可能满足的取法
possible = []
while True:
# 机器取走剩下后的数量
rest = 2**n - 1
if rest >= n:
break
# 剩下的数量大于一半,则取走的不超过一半
if rest >= half:
possible.append(n-rest)
m = m + 1
# 如果至少存在一种取法使得剩下物品数量为 2*n-1
if possible:
return choice(possible)
# 无法使得剩余物品数量为 2*n-1,随机取走一些
return randint(1,int(half))
def smartMinGame(n):
while n>1:
# 人类玩家先走
print("现在到你了,我们还有{0}步".format(n))
# 确保人类玩家输入合法整数值
while True:
try:
num = int(input("你想走多少步:"))
assert 1<= num <=n//2
break
except:
print("错误,必须在1到{0}".format(n//2))
n-=num
if n==1:
return '我(计算机)输了'
# 计算机玩家拿走一些
n -= everyStep(n)
if n == 1:
return '你输了'
print(smartMinGame(randint(1,100)))