尼姆游戏(聪明版)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

好的,我可以为您编写一个Python程序来模拟聪明本的尼姆游戏。 以下是代码实现: ```python import random def computer_move(pile): """ 计算机的移动,使得堆的大小是2的幂次方减1 """ pile_size = pile[-1] for i in range(1, pile_size//2+1): if (pile_size - i) & pile_size == pile_size - i: return pile_size - i return random.randint(1, pile_size//2) def play_nim_game(): """ 开始尼姆游戏 """ pile = [1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215, 33554431, 67108863, 134217727, 268435455, 536870911, 1073741823, 2147483647] print("欢迎来到聪明本的尼姆游戏!") print("游戏规则:玩家和计算机轮流从一堆物品中拿走一部分。每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到计算机。拿走最后一个物品的玩家输掉游戏。") print("现在,堆的大小为", pile[-1], "个物品。") while True: # 玩家的移动 player_move = int(input("请输入你要拿走的物品数量:")) while player_move > pile[-1]//2 or player_move < 1: player_move = int(input("你输入的数字不符合规则,请重新输入:")) pile[-1] -= player_move print("你拿走了", player_move, "个物品,现在堆的大小为", pile[-1], "个物品。") if pile[-1] == 0: print("你赢了!") break # 计算机的移动 computer_move_amount = computer_move(pile) pile[-1] -= computer_move_amount print("计算机拿走了", computer_move_amount, "个物品,现在堆的大小为", pile[-1], "个物品。") if pile[-1] == 0: print("你输了!") break play_nim_game() ``` 希望这个程序能够帮助到您!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

慕仙少白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值