尼姆游戏(聪明版)python

尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。

在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2 的幂次方减1——也就是3,7,15,31 或63。除了堆的大小已经是2 的幂次方减1,在其他情况下这样走都是符合游戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些

随机生成物品数量模块:

# 生成一个随机物品的数量
def res_num():
    # 随机生成一个60——100的物品数量
    resnum = random.randint(60,100)
    # 返回生成的随机物品数量
    return resnum

判断是否为2的n次方减一模块:

# 判断是否为2的幂次方减1
def N(n):
    while True:
        if ((n % 2) == 0)|(n == 1):
            if n == 1:
                i = 1
                break
            else:
                n = n // 2
                i = 1
        else:
            i = 0
            break
    # 如果是2的幂
    if i == 1:
        return 1
    # 不是2的幂
    else:
        return 0

当玩家未拿走2的n次方减一物品时,机器人拿走2的n次方减一个 物品模块:

# 机器拿走物品
def robot_resnum(resnum):
    # 机器每次只能取走剩下物品的一半
    num = resnum // 2
    i = 0
    if resnum >= 3:
        while True:
            # 判断取走物品数码是不是2的幂,如果是2的幂
            if N((num + 1)) == 1:
                a = num
                b = resnum - a
                print("机器回合!")
                print("机器人拿走%d个物品,还剩下%d个物品!" % (a, b))
                break
            # 不是2的幂,则继续向下取
            else:
                num = num - 1
    else:
        m = resnum - num
        print("机器人拿走%d个物品,还剩下3个!"%m)
    if (resnum - num) == 0:
        print("机器人拿走1个物品,还剩下0个物品。")
        print("恭喜你,你战胜了机器人!")
        return resnum - 1
    return (resnum - num)

当玩家拿走2的n次方个物品时,机器人随机取走一个物品模块:

# 机器人拿走物品2,玩家拿走2的幂机器人随机取一个
def robot_resnum2(resnum):
    if resnum > 1:
        a = resnum // 2
        b = random.randint(1, a)
        print("机器人拿走%d个物品,还剩下%d个物品。" % (b, resnum - b))
        return resnum - b
    else:
        resnum = resnum - 1
        print("机器人拿走1个物品,还剩下0个物品。")
        print("恭喜你,你战胜了机器人!")
        return resnum - 1

玩家取走物品模块:

# 玩家拿走物品
def people_resnum(resnum):
    while True:
        # 请输入你要取的物品数量
        print("你的回合!")
        print("请输入你要取的物品数量:")
        num = int(input())
        if (resnum - num) != 0:
            if num <= (resnum / 2):
                if N(num) == 1:
                    print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))
                    i = 1
                    break
                else:
                    print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))
                    i = 0
                    break
            else:
                print("您输入的物品数量大于该堆物品数量一半,请重新输入!")
        else:
            print("你拿走1个物品,还剩下0个物品。")
            print("很遗憾你败给了机器人,再接再厉!")
            return resnum - num,1
    return resnum - num, i

主函数模块:

# 获取随机生成的物品数量
resnum = res_num()
print("目前该堆物品中有%d个物品。"%resnum)
while True:
    # 将目前物品数量传入函数
    a = people_resnum(resnum)
    resnum = a[0]
    # 如果玩家拿的数量为2的幂
    if resnum > 0:
        if a[1] == 1:
            # 将剩余物品数量传入函数robot_resnum
            resnum = robot_resnum2(resnum)
        # 如果玩家拿的不是2的幂
        else:
            # 将剩余物品数量传入函数robot_resnum
            resnum = robot_resnum(resnum)
    # 判断最后物品数量
    if resnum <= 0:
        break

完整代码:

import random

def res_num():
    # 随机生成一个60——100的物品数量
    resnum = random.randint(60,100)
    # 返回生成的随机物品数量
    return resnum


# 判断是否为2的幂次方减1
def N(n):
    while True:
        if ((n % 2) == 0)|(n == 1):
            if n == 1:
                i = 1
                break
            else:
                n = n // 2
                i = 1
        else:
            i = 0
            break
    # 如果是2的幂
    if i == 1:
        return 1
    # 不是2的幂
    else:
        return 0


# 机器拿走物品
def robot_resnum(resnum):
    # 机器每次只能取走剩下物品的一半
    num = resnum // 2
    i = 0
    if resnum >= 3:
        while True:
            # 判断取走物品数码是不是2的幂,如果是2的幂
            if N((num + 1)) == 1:
                a = num
                b = resnum - a
                print("机器回合!")
                print("机器人拿走%d个物品,还剩下%d个物品!" % (a, b))
                break
            # 不是2的幂,则继续向下取
            else:
                num = num - 1
    else:
        m = resnum - num
        print("机器人拿走%d个物品,还剩下3个!"%m)
    if (resnum - num) == 0:
        print("机器人拿走1个物品,还剩下0个物品。")
        print("恭喜你,你战胜了机器人!")
        return resnum - 1
    return (resnum - num)


# 机器人拿走物品2,玩家拿走2的幂机器人随机取一个
def robot_resnum2(resnum):
    if resnum > 1:
        a = resnum // 2
        b = random.randint(1, a)
        print("机器人拿走%d个物品,还剩下%d个物品。" % (b, resnum - b))
        return resnum - b
    else:
        resnum = resnum - 1
        print("机器人拿走1个物品,还剩下0个物品。")
        print("恭喜你,你战胜了机器人!")
        return resnum - 1


# 玩家拿走物品
def people_resnum(resnum):
    while True:
        # 请输入你要取的物品数量
        print("你的回合!")
        print("请输入你要取的物品数量:")
        num = int(input())
        if (resnum - num) != 0:
            if num <= (resnum / 2):
                if N(num) == 1:
                    print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))
                    i = 1
                    break
                else:
                    print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))
                    i = 0
                    break
            else:
                print("您输入的物品数量大于该堆物品数量一半,请重新输入!")
        else:
            print("你拿走1个物品,还剩下0个物品。")
            print("很遗憾你败给了机器人,再接再厉!")
            return resnum - num,1
    return resnum - num, i


# 获取随机生成的物品数量
resnum = res_num()
print("目前该堆物品中有%d个物品。"%resnum)
while True:
    # 将目前物品数量传入函数
    a = people_resnum(resnum)
    resnum = a[0]
    # 如果玩家拿的数量为2的幂
    if resnum > 0:
        if a[1] == 1:
            # 将剩余物品数量传入函数robot_resnum
            resnum = robot_resnum2(resnum)
        # 如果玩家拿的不是2的幂
        else:
            # 将剩余物品数量传入函数robot_resnum
            resnum = robot_resnum(resnum)
    # 判断最后物品数量
    if resnum <= 0:
        break

  • 13
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
尼姆游戏是一种非常经典的数学游戏,通常由两个玩家轮流取走一些石子,每次取走的石子数量可以自由选择,但是必须在同一个堆中取走至少一个石子。最后无法取走石子的玩家输掉游戏。 而对于聪明尼姆游戏程序设计,其实就是让电脑在尽可能少的步骤内获胜。这可以通过一些数学方法来实现,比如二进制异或运算。 具体来说,假设有n个堆,每个堆的石子数分别为a1, a2, ..., an。我们可以把这n个数都写成二进制形式,然后按位进行异或运算。也就是说,我们把所有数的每一位都相加起来,如果某一位上的和为奇数,那么电脑就应该在该位上取走一个石子。 这样做的原理是,异或运算具有“同0异1”的特性。也就是说,如果两个数在某一位上相同,那么异或运算的结果就是0;否则结果就是1。因此,如果我们让所有堆中对应位上的和都为偶数,那么电脑就一定可以在尽可能少的步骤内获胜。 以下是一个简单的聪明尼姆游戏程序的Python实现: ```python def nim_game(piles): x = 0 for pile in piles: x ^= pile if x == 0: # 如果异或和为0,则电脑无法获胜 return False for i in range(len(piles)): # 如果某一堆石子数的异或和与总异或和相同,则在该堆中取走一些石子 if piles[i] ^ x < piles[i]: piles[i] ^= x return True # 如果找不到合适的堆,则在第一堆中取走一些石子 piles ^= x return True ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕仙少白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值