python编程实验,模拟聪明版的尼姆游戏设计原理
实验原理与内容:
本实验完成一个模拟聪明版的尼姆游戏功能:
尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分,在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。
在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是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)))
运行演示:
下一篇:
VB中的二维数组输出的定位