Python实现聪明的尼姆游戏:算法逻辑与代码解析
本文介绍使用Python实现聪明版尼姆游戏的方法。游戏规定玩家每次可拿走1至一半物品,拿走最后一个者输。计算机策略优先使剩余物品数为2的幂次方减1,否则随机抽取。代码包含玩家输入验证、电脑决策逻辑及胜负判定,适合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实现聪明尼姆游戏的介绍至此结束,更多相关内容可查阅本站过往文章或继续浏览后续内容,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













