Python:尼姆游戏

今天我们将通过一个名为尼姆游戏的小算法练习来学习Python。

规则

这是一个两人游戏。我们一开始有n根火柴(例如10根)。
轮流进行,每个玩家可以拿走1、2或3根火柴。拿走最后一根火柴的玩家输。

算法

这是一个相当确定性的游戏,换句话说,当你知道诀窍时,你就无法输(除非你从一个输的位置开始)。

以下是正确拿取火柴数量的表格(x表示一个输的位置):

periodicity

因此,我们可以观察到一个无限的周期循环,周期为4。

当我们有模4 = 1(换句话说,除法的余数等于1)时,玩家就输了(如果对方表现良好)。

因此,获胜策略是将对手送入一个失败的位置。

单人版本

我们将在算法中形式化这一点,使用模运算来编写计算机的人工智能。

n = int(input("请输入初始的火柴数量: "))
print("火柴数量 : ", n)
while n>0:
    j=-1
    print("P1 回合")

while j<1 or j>3 or j>n:
    j=int(input("你要取多少?(1-3)"))
n=n-j
if n==0:
    print("你输了!")
else:
    print("P2 回合(CPU)")
    print("剩余 ", n)

if n%4==3:
    p=2
elif n%4==2:
    p=1
elif n%4==0:
    p=3
else:
    p=1
print("我拿了一些", p)
n=n-p

print("剩余 ", n)
        if n==0:
            print("我输了!")

双人版本

这是一个版本,如果你想和朋友一起实验,请记住这个策略:


def nim_game():
    print("欢迎来到尼姆游戏!")
    print("规则:玩家轮流从堆中移除1到3个物体。")
    print("被迫取走最后一个物体的玩家输。")

    # 初始化堆
    pile = int(input("请输入堆中物体的初始数量:"))
    while pile <= 0:
        print("堆中必须至少包含1个物体。")

pile = int(input("输入初始物品数量: "))

    # 玩家名称
    player1 = input("输入玩家 1'的名字: ")
    player2 = input("输入玩家 2'的名字: ")

    # 开始游戏
    current_player = player1

    while pile > 0:

print(f"\n堆中有 {pile} 个物体。")
        print(f"{current_player}'的回合。")

        # 获取要移除的物体数量
        try:
            remove = int(input("你将移除多少个物体 (1-3)? "))
            if remove < 1 or remove > 3:

print("无效的移动。您只能取走1、2或3个物体。")
                continue
            if remove > pile:
                print("无效的移动。您不能取走超过堆中物体的数量。")
                continue
        except ValueError:
            print("无效的输入。请输入一个介于1和3之间的数字。")
            continue

        # 更新堆
        pile -= remove

        # 检查游戏是否结束
        if pile == 0:

print(f"\n{current_player} 被迫拿走最后一个物品,输了!")
break

# 切换玩家
        current_player = player2 if current_player == player1 else player1

print("游戏结束。感谢您的参与!")

# 运行游戏
if __name__ == "__main__":
    nim_game()

 

这里有一个小逻辑练习,你可以用来练习Python中的算法。

此外,你已经知道了这个秘密,不会再被这个游戏愚弄,祝你玩得开心!

更多