首页 › 论坛 › 置顶 › Python:尼姆游戏
正在查看 1 个帖子:1-1 (共 1 个帖子)
-
作者帖子
-
2025-03-20 17:20 #14023Q QPY课程团队管理员
今天我们将通过一个名为尼姆游戏的小算法练习来学习Python。
规则
这是一个两人游戏。我们一开始有n根火柴(例如10根)。
轮流进行,每个玩家可以拿走1、2或3根火柴。拿走最后一根火柴的玩家输。算法
这是一个相当确定性的游戏,换句话说,当你知道诀窍时,你就无法输(除非你从一个输的位置开始)。
以下是正确拿取火柴数量的表格(x表示一个输的位置):
因此,我们可以观察到一个无限的周期循环,周期为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 个帖子)
- 哎呀,回复话题必需登录。