县网站建设/写软文能赚钱吗
尼姆游戏
- 1 实验题目
- 1.1 游戏介绍
- 1.2 实验要求
- 2 实验原理
- 2.1 计算机回合
- 2.2 玩家回合
- 2.3 游戏开始
- 3 运行结果
- 4 源代码
1 实验题目
1.1 游戏介绍
尼姆游戏是个著名的游戏,有很多变种玩法。有傻瓜模式与聪明模式。
傻瓜模式:两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。
聪明模式:在聪明模式中,除傻瓜模式的规则外,每次到计算机拿走一部分时,计算机每次拿走足够多的物品使得堆的大小是 2 的幂次方减 1——也就是 3,7,15,31 或 63。除了堆的大小已经是 2 的幂次方减 1,在其他情况下这样走都是符合游戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些。
1.2 实验要求
编写程序,模拟聪明版本的尼姆游戏。
2 实验原理
2.1 计算机回合
使得计算机每次取走的数量会使得堆大小变成2的幂次方减一即可。
可以使用一个while循环,找到物品堆大小的数量处于2的几次方之间。找到这个区间的下限x,每次拿走时:拿走数量 = 物品数量 - (2x - 1)。这样就可以保证每次计算机拿走之后,物品剩下的数量为 2x-1 。
另外,当物品数量正是2的幂次方时,就让计算机随机产生一个符合游戏规则的数字作为拿走数量。
while True:if pow(2, x) < self.number <= pow(2, x + 1):breakx = x + 1
if self.number == pow(2, x + 1):n = random.randint(1, int(self.number / 2))
else:n = self.number - (pow(2, x) - 1)
2.2 玩家回合
判断玩家取走是否满足游戏规则,即是否大于1且小于物品总数的一半。
此处可设置一个 flag 进行标志,若用户输入数量符合游戏规则,则令 flag 为 True ;若不符合,令 flag 为 False 。
当 flag = False 时就让用户继续输入直到输入数量符合规则。当 flag = True 时就使用用户输入的数量。
n = int(input('请输入要拿走的物品个数:'))
flag = n < 1 or n > int(self.number / 2)
while flag:print('输入数据不符合游戏规则,请重新输入!')n = int(input('请输入要拿走的物品个数:'))flag = n < 1 or n > int(self.number / 2)
2.3 游戏开始
实现玩家与计算机交替拿走物品。
这里需要设置每次玩家拿走数量的变量player,以及计算机每次拿走数量的变量computer。使用while循环让游戏一直进行下去,直到判断出谁输谁赢。
while True:computer = self.computer_turn()if computer == 0:breakelse:self.number = self.number - computerprint('电脑回合:拿走{:d}个物品,剩余{:d}个物品'.format(computer, self.number))player = self.player_turn()if player == 0:breakelse:self.number = self.number - playerprint('玩家回合:拿走{:d}个物品,剩余{:d}个物品'.format(player, self.number))
3 运行结果
4 源代码
# 尼姆游戏
import randomclass Game:def __init__(self):self.number = 0def computer_turn(self):x = 0n = 0if self.number == 2:n = 1elif self.number == 1:print('游戏结束,玩家获胜')return 0else:while True:if pow(2, x) < self.number <= pow(2, x + 1):breakx = x + 1if self.number == pow(2, x + 1):n = random.randint(1, int(self.number / 2))else:n = self.number - (pow(2, x) - 1)return ndef player_turn(self):if self.number == 1:print('游戏结束,电脑获胜')return 0n = int(input('请输入要拿走的物品个数:'))flag = n < 1 or n > int(self.number / 2)while flag:print('输入数据不符合游戏规则,请重新输入!')n = int(input('请输入要拿走的物品个数:'))flag = n < 1 or n > int(self.number / 2)return ndef begin(self):computer = 0player = 0print('欢迎来到尼姆游戏!')self.number = int(input('请输入物品总数:'))while True:computer = self.computer_turn()if computer == 0:breakelse:self.number = self.number - computerprint('电脑回合:拿走{:d}个物品,剩余{:d}个物品'.format(computer, self.number))player = self.player_turn()if player == 0:breakelse:self.number = self.number - playerprint('玩家回合:拿走{:d}个物品,剩余{:d}个物品'.format(player, self.number))if __name__ == '__main__':game = Game()game.begin()