今天我们将通过一个名为尼姆游戏的小算法练习来学习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中的算法。
此外,你已经知道了这个秘密,不会再被这个游戏愚弄,祝你玩得开心!