当前位置:首页 > Python > 正文

用Python实现Nim游戏(从零开始掌握博弈论与递归算法)

在本教程中,我们将一步步教你如何使用Python编写一个经典的Nim游戏。无论你是编程新手还是想深入理解博弈论算法,这篇教程都将帮助你轻松上手。我们会讲解游戏规则、核心逻辑,并最终实现一个可运行的命令行版本。

什么是Nim游戏?

Nim是一种两人轮流进行的数学策略游戏。游戏开始时有若干堆石子(或其他物品),每轮玩家必须从其中一堆中拿走至少一个石子。拿到最后一个石子的玩家获胜(或失败,取决于规则变种)。我们这里采用“拿最后一个石子者胜”的规则。

用Python实现Nim游戏(从零开始掌握博弈论与递归算法) Python Nim游戏算法 Nim游戏实现 Python博弈论编程 初学者Python游戏开发 第1张

为什么学习Nim游戏对编程有帮助?

Nim游戏是博弈论中的经典案例,其最优策略可通过“异或(XOR)”运算快速判断。通过实现它,你能掌握:

  • 基本输入输出与循环控制
  • 递归与状态判断
  • 简单的AI对手设计
  • Python Nim游戏算法的核心思想

第一步:搭建基础游戏框架

我们先创建一个最简版本:玩家 vs 玩家,不带AI。

def print_piles(piles):    for i, count in enumerate(piles):        print(f"堆 {i + 1}: {'● ' * count}")def get_valid_move(piles):    while True:        try:            pile = int(input("请选择堆号 (1-{}): ".format(len(piles)))) - 1            if pile < 0 or pile >= len(piles):                print("无效堆号!")                continue            take = int(input(f"从堆 {pile + 1} 中拿几个 (1-{piles[pile]}): "))            if 1 <= take <= piles[pile]:                return pile, take            else:                print("数量超出范围!")        except ValueError:            print("请输入有效数字!")def main():    piles = [3, 4, 5]  # 初始三堆石子    current_player = 1    while any(piles):        print(f"\n当前玩家: 玩家 {current_player}")        print_piles(piles)        pile, take = get_valid_move(piles)        piles[pile] -= take        if not any(piles):            print(f"\n玩家 {current_player} 获胜!")            break        current_player = 2 if current_player == 1 else 1if __name__ == "__main__":    main()

第二步:加入AI(使用Nim和理论)

真正的Nim游戏算法核心在于“Nim和”——即所有堆石子数的异或值。如果Nim和为0,则当前局面为必败态;否则为必胜态。

我们可以让AI总是将局面变为Nim和为0的状态:

def nim_sum(piles):    result = 0    for p in piles:        result ^= p    return resultdef ai_move(piles):    total = nim_sum(piles)    if total == 0:        # 必败态,随机拿一个        for i in range(len(piles)):            if piles[i] > 0:                return i, 1    else:        # 寻找能使得新nim_sum为0的移动        for i in range(len(piles)):            target = piles[i] ^ total            if target < piles[i]:                return i, piles[i] - target    # 安全兜底    for i in range(len(piles)):        if piles[i] > 0:            return i, 1

第三步:整合AI到主程序

修改main()函数,支持人机对战:

def main():    piles = [3, 4, 5]    mode = input("选择模式:1=玩家对战,2=人机对战: ")    player_vs_ai = (mode == "2")    while any(piles):        print_piles(piles)        if player_vs_ai:            # 玩家回合            pile, take = get_valid_move(piles)            piles[pile] -= take            if not any(piles):                print("\n你赢了!")                break            # AI回合            print("\nAI正在思考...")            ai_pile, ai_take = ai_move(piles)            piles[ai_pile] -= ai_take            print(f"AI从堆 {ai_pile + 1} 拿走了 {ai_take} 个石子。")            if not any(piles):                print("\nAI获胜!")                break        else:            # 玩家对战逻辑(略,同前)            pass

总结与延伸

恭喜你!你已经掌握了Python Nim游戏算法的基本实现。这个项目不仅锻炼了你的编程能力,也让你初步接触了博弈论编程的思想。

如果你想进一步提升,可以尝试:

  • 添加图形界面(如使用tkinter)
  • 支持自定义堆数和初始数量
  • 实现“拿最后一个输”的变种规则
  • 记录胜负历史

希望这篇初学者Python游戏开发教程对你有帮助!动手试试吧,编程的乐趣在于实践。

关键词:Python Nim游戏算法、Nim游戏实现、Python博弈论编程、初学者Python游戏开发