Python实现聪明的尼姆游戏:算法逻辑与代码解析

Ivy
Ivy
发布时间:2026-10-15 | 5人浏览过
原创

本文介绍使用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实现聪明尼姆游戏的介绍至此结束,更多相关内容可查阅本站过往文章或继续浏览后续内容,感谢支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表