python 聪明的尼姆游戏

两个玩家轮流从一堆物品中拿走一部分,在每一步中,玩家可以自由选择拿走多少物品,
但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。
在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2 的幂次方减1——也就是3,7,15,31 或63。
除了堆的大小已经是2 的幂次方减1,在其他情况下这样走都是符合游戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些。
import random
num = random.randint(3, 100)  # 函数返回3和100之间的任意整数
print("初始数为{}".format(num))
while num > 1:
    # 人类回合
    while True:
        userNum = int(input("请输入你取走的个数:"))
        if 1 <= userNum <= num//2:    # 至少取走一个且最多只能拿走一半 求商://
            break
        else:
            print("输入的数字不合法!")
    num -= userNum
    print("目前有{}".format(num))
    if num == 1:  # 如果玩家取走后剩1,则玩家胜
        print("YOU WIN.")
        break
    # 机器回合
    mi = [3, 7, 15, 31, 63]
    while True:
        if num == 2:
            RootNum = 1
            print("Root取走{}".format(RootNum))
            break
        t = random.choice(mi)    # 机器随机抽取预计余数
        RootNum = num - t
        if num in mi:    # 余数本来就是2的幂次方-1
            RootNum = random.randint(1, num//2)  # 机器随机抽取
            print("Root取走{}".format(RootNum))
            break
        elif 0 <= RootNum <= num//2 and num not in mi:
            print("Root取走{}".format(RootNum))
            break
        else:
            continue
    num -= RootNum
    print("目前有{}".format(num))
    if num == 1:  # 如果机器取走后剩1,则机器胜
        print("YOU LOSS.")

实现效果

 

 

posted @ 2022-04-10 17:28  郑NINE  阅读(357)  评论(0编辑  收藏  举报