Python实现聪明的尼姆游戏
时间:2022-04-26 09:07:58|栏目:Python代码|点击: 次
尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家则输掉游戏
在聪明模式中,计算机每次拿走一定数量的物品使得堆的大小是 2 的幂次方减 1—也就是 3、7、15、31、63 等。如果有一定数量的剩余物品,计算机就随机拿出一些。编写程序,模拟聪明版本的尼姆游戏。
先创建两个函数,一个用于玩家拿走商品,另一个用于电脑拿走商品。题目要求电脑要随机挑选,因此我们用到了random库中的choice方法,用法为random.choice(iterable),就是从序列中随机挑选一个元素。
import random # 玩家拿走物品 def play(num): while True: try: if num == 1: print('请输入要拿走物品的数量(1)') take_num = int(input()) assert take_num == 1 else: print('请输入要拿走物品的数量(1-%d)' % (num / 2)) take_num = int(input()) assert 1 <= take_num <= num // 2 except(ValueError, AssertionError): print('请正确输入数量!') else: break num -= take_num print('玩家拿走了', take_num, '个,还剩', num, '个') return num # 电脑拿走物品 def computer(num): take_max = num // 2 lst = [] for i in range(1, num): temp = 2 ** i - 1 if temp <= num - 1: lst.append(temp) else: break lst = list(filter(lambda y: num - y <= num // 2, lst)) if lst: temp_lst = [] for i in lst: x = num - i temp_lst.append(x) take_num = random.choice(temp_lst) num -= take_num print('电脑拿走了', take_num, '个,还剩', num, '个') return num else: take_num = random.randint(1, take_max) num -= take_num print('电脑拿走了', take_num, '个,还剩', num, '个') return num while True: try: initial_value = int(input('请输入起始数量堆的大小:')) except(ValueError, AssertionError): print('请正确输入数量!') else: break player = 1 computer_player = 1 # 依次循环玩家和电脑那走物品,若玩家先拿完则提前跳出循环,若电脑先拿完则正常退出循环 while computer_player and player: initial_value = play(initial_value) player = initial_value if player == 0 or player == 1: break initial_value = computer(initial_value) computer_player = initial_value if player == 0: print('\n电脑胜利!') else: print('电脑拿走了 1 个,还剩 0 个') print('\n玩家胜利!')
以上代码纯本人想法,若有更好的想法可留言一起探讨
栏 目:Python代码
下一篇:Python深度学习pytorch神经网络汇聚层理解
本文标题:Python实现聪明的尼姆游戏
本文地址:http://www.codeinn.net/misctech/200242.html