首页 论坛 置顶 Python:尼姆游戏

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 作者
    帖子
  • #14023

    今天我们将通过一个名为尼姆游戏的小算法练习来学习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中的算法。

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

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 哎呀,回复话题必需登录。