Python 中的 Minimax:学习如何输掉 Nim 游戏

2023-12-03

游戏很有趣!他们明确的规则让你探索不同的策略,寻找必胜的方法。这极小极大算法用于在游戏中的任何时刻选择最佳动作。您将学习如何用 Python 实现一个可以完美玩 Nim 游戏的极小极大玩家。

在本教程中,您将重点关注极小极大。然而,为了直观地了解算法的工作原理,最好使用具体的游戏。您将学习 Nim 的规则,这是一款规则简单、选择有限的游戏。在示例中使用 Nim 可以让您专注于极小极大原则,而不会迷失在游戏规则中。

当您按照本教程进行操作时,您将:

  • 学习原理极小极大算法
  • 玩几个变体尼姆的游戏
  • 实施极小极大算法
  • 失去Nim 对抗极小极大玩家
  • 使用α-β剪枝优化极小极大算法

您可以通过单击下面的链接下载本教程中使用的源代码以及游戏模拟器,您可以在其中与 minimax 对手玩不同的 Nim 变体:

源代码: 点击此处下载免费源代码你将用它来输掉 Nim 对抗你的极小极大玩家的游戏。

玩一个简化的 Nim 游戏

尼姆的根源回去很久了。尽管该游戏的变体在历史上一直存在,但 Nim 的名字是在 1901 年 Charles L. Bouton 发表时得名的。Nim,一个有完整数学理论的游戏.

Nim 是两个玩家的游戏,总是以一个玩家获胜而告终。该游戏由放置在游戏桌上的多个计数器组成,玩家轮流移除一个或多个计数器。在本教程的前半部分,您将使用以下规则玩 Nim 的简化版本:

  • 有几个柜台在共享堆中。
  • 两名玩家采取交替转弯.
  • 在轮到他们时,玩家移除one, two, 或者堆中的计数器。
  • 采取的球员最后一个柜台输了游戏。

您将把这个游戏称为简单尼姆. 之后,您将了解常规 Nim 的规则。它们并没有复杂多少,但 Simple-Nim 更容易推理。

笔记:现在是时候玩了!您将从模拟版本开始,因此请在办公桌上腾出空间。玩几轮 Simple-Nim 以了解规则。在此过程中,请留意您遇到的任何获胜策略。

您可以使用任何可用的物体作为计数器,也可以使用记事本来跟踪当前正在使用的计数器数量。十到二十个计数器之间的某个位置是游戏的良好起点。

如果您附近没有对手,您可以暂时与自己对战。在本教程结束时,您将编写出一个可以对抗的对手。

为了演示规则,两名玩家——Mindy 和 Maximillian——将玩 Simple-Nim 游戏,从十二柜台。明迪先说:

  • 明迪拿下两个柜台,离开ten在堆里。
  • 马克西米利安拿下一个柜台,离开在堆里。
  • 明迪拿下三个筹码,离开six在堆里。
  • 马克西米利安拿下两个筹码,离开在堆里。
  • 明迪拿下三个筹码,离开one在堆里。
  • 马克西米利安拿下最后的反击并输掉比赛。

在这场比赛中,马克西米利安拿下最后一个反击,所以明迪获胜。

Nim,包括 Simple-Nim,是一个有趣的游戏,因为规则足够简单,可以完全分析游戏。您将使用 Nim 探索极小极大算法,该算法能够完美地玩游戏。这意味着如果可能的话,极小极大玩家总是会赢得游戏。

了解极小极大算法

游戏一直是发明和测试的沃土人工智能算法。游戏因其明确的规则而非常适合此类研究。最著名的算法之一是极小极大。该名称描述了一名玩家如何试图最大化自己的分数,而另一名玩家则试图最小化分数。

Minimax 可以应用于许多不同的游戏和更一般的决策。在本教程中,您将学习如何教 minimax 玩 Nim。但是,您可以在其他游戏中使用相同的原理,例如井字游戏,还有。

探索游戏树

回想一下上一节明迪和马克西米利安玩的游戏。下表显示了游戏的所有动作:

Mindy Pile Maximillian
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的 Minimax:学习如何输掉 Nim 游戏 的相关文章

  • ChatterBot:使用 Python 构建聊天机器人

    目录 演示 项目概况 先决条件 第 1 步 使用 Python ChatterBot 创建聊天机器人 第 2 步 开始训练您的聊天机器人 第 3 步 导出 WhatsApp 聊天记录 第 4 步 清理您的聊天导出 第 5 步 使用自定义数据
  • Python 3.11 预览:TOML 和 tomllib

    目录 Python 3 11 Beta 很酷的新功能 安装 tomllib TOML Parser in Python 3 11 学习基本 TOML 使用 tomllib 读取 TOML 写入TOML Other New Features
  • 使用 Pdb 进行 Python 调试

    目录 入门 打印变量的值 打印表达式 Stepping Through Code 列出源代码 使用断点 继续执行 显示表达式 Python 来电显示 基本 pdb 命令 使用 pdb 进行 Python 调试 结论 调试应用程序有时可能是一
  • NumPy arange():如何使用 np.arange()

    目录 np arange 的返回值和参数 Range Arguments of np arange 提供所有范围参数 提供两个范围参数 提供一个范围参数 提供否定论据 倒数 获取空数组 np arange 的数据类型 使用 np arang
  • Python 中使用 spaCy 进行自然语言处理

    目录 NLP 和 spaCy 简介 安装spaCy 已处理文本的 Doc 对象 句子检测 spaCy 中的令牌 停用词 词形还原 词频 词性标注 可视化 使用 displaCy 预处理函数 使用 spaCy 基于规则的匹配 使用 spaCy
  • Python 的 urllib.request 用于 HTTP 请求

    目录 使用 urllib request 的基本 HTTP GET 请求 The Nuts and Bolts of HTTP Messages 了解什么是 HTTP 消息 了解 urllib request 如何表示 HTTP 消息 关闭
  • Python eval():动态计算表达式

    目录 Understanding Python s eval 第一个参数 表达式 第二个参数 全局变量 第三种说法 本地人 Evaluating Expressions With Python s eval 布尔表达式 数学表达式 通用表达
  • 了解 Python 模拟对象库

    目录 什么是模拟 Python 模拟库 The Mock Object 惰性属性和方法 断言和检查 管理模拟的返回值 管理模拟的副作用 配置你的模拟 patch patch 作为装饰器 patch 作为上下文管理器 修补对象的属性 在哪里打
  • Python heapq 模块:使用堆和优先级队列

    目录 What Are Heaps 数据结构 堆和优先级队列 堆的实现 优先级队列的用途 Heaps as Lists in the Python heapq Module 基本操作 高级别操作 堆可以解决的问题 如何发现问题 Exampl
  • PyQt 布局:创建具有专业外观的 GUI 应用程序

    目录 在 GUI 上布置图形元素 储备 PyQt 布局库 Using General Purpose Layout Managers 构建水平布局 QHBoxLayout 构建垂直布局 QVBoxLayout 在网格中排列小部件 QGrid
  • 如何使用 NumPy 获取正态分布的随机数

    目录 如何使用 NumPy 生成正态分布的随机数 绘制正态分布数字 指定平均值和标准差 在 NumPy 中使用随机数 用中心极限定理迭代至正态性 结论 概率分布描述了事件或实验所有可能结果的可能性 这正态分布是最有用的概率分布之一 因为它很
  • Python 中的 Minimax:学习如何输掉 Nim 游戏

    目录 玩一个简化的 Nim 游戏 Get to Know the Minimax Algorithm 探索游戏树 找到最佳的下一步行动 Lose the Game of Nim Against a Python Minimax Player
  • Python pandas:你可能不知道的技巧和功能

    目录 1 在解释器启动时配置选项和设置 2 用pandas的测试模块制作玩具数据结构 3 利用访问器方法 4 从组件列创建 DatetimeIndex 5 使用分类数据节省时间和空间 6 通过迭代内省 Groupby 对象 7 使用此映射技
  • 使用 Python 发送电子邮件

    目录 Getting Started 选项 1 设置 Gmail 帐户进行开发 选项 2 设置本地 SMTP 服务器 Sending a Plain Text Email 启动安全 SMTP 连接 发送您的纯文本电子邮件 Sending F
  • 最好的 Python 书籍

    目录 Best Books for Learning Python Python 速成课程 Head First Python 第二版 用 Python 发明你自己的电脑游戏 第四版 思考 Python 如何像计算机科学家一样思考 第二版
  • Python 中的函数式编程:何时以及如何使用它

    目录 什么是函数式编程 Python 对函数式编程的支持程度如何 使用 lambda 定义匿名函数 Applying a Function to an Iterable With map 使用单个可迭代对象调用 map 使用多个可迭代对象调
  • Jupyter Notebook:简介

    目录 Getting Up and Running With Jupyter Notebook 安装 启动 Jupyter Notebook 服务器 Creating a Notebook 命名 运行细胞 菜单 启动终端和其他东西 查看正在
  • Python pickle 模块:如何在 Python 中持久化对象

    目录 Python 中的序列化 Python pickle 模块内部 Python pickle 模块的协议格式 可酸洗和不可酸洗类型 腌制对象的压缩 Python pickle 模块的安全问题 结论 作为开发人员 您有时可能需要通过网络发
  • 如何制作引人入胜的编程视频

    目录 Decide When a Programming Video Makes Sense 关注结果 绘制代码示例 做演讲者笔记 Audit Your Setup 准备你的房间 检查你的屏幕 选择录音软件 Clean Up Your Co
  • 使用 Python、PyQt 和 SQLite 构建联系簿

    目录 演示 Python 联系手册 项目概况 先决条件 Step 1 Creating the Contact Book s Skeleton App With PyQt 构建通讯录项目 创建应用程序的主窗口 编码和运行应用程序 第 2 步

随机推荐

  • 该做什么和不该做什么:Python 编程建议

    本课程涵盖 PEP8 提供的更多建议 以保持一致性并消除歧义 在本课程结束时 您将知道如何检查 如果一个布尔值是True或者False 列表是否为空 变量是否具有定义的值 该参数不是 None 列表中的后缀和前缀
  • 如何设置 Django 项目

    当您开始构建任何新的 Django Web 应用程序时 您需要首先解决一个基本设置 本课程概述了设置 Django 项目的必要步骤 在本课程中 您将重点关注启动新的 Web 应用程序所需执行的初始步骤 您应该首先安装Python 并且应该知
  • 后续步骤:创建博客

    在本课程中 您构建了 Django 组合 了解了很多有关 Django 功能的知识 并与很多错误消息交了朋友 如果您想继续构建这个项目 您可以查看本课程基于的文章添加一个博客到您的网站 博客是与世界分享您的技术知识和写作技巧的好方法 下载
  • 了解 Python 模拟对象库

    目录 什么是模拟 Python 模拟库 The Mock Object 惰性属性和方法 断言和检查 管理模拟的返回值 管理模拟的副作用 配置你的模拟 patch patch 作为装饰器 patch 作为上下文管理器 修补对象的属性 在哪里打
  • Python heapq 模块:使用堆和优先级队列

    目录 What Are Heaps 数据结构 堆和优先级队列 堆的实现 优先级队列的用途 Heaps as Lists in the Python heapq Module 基本操作 高级别操作 堆可以解决的问题 如何发现问题 Exampl
  • PyQt 布局:创建具有专业外观的 GUI 应用程序

    目录 在 GUI 上布置图形元素 储备 PyQt 布局库 Using General Purpose Layout Managers 构建水平布局 QHBoxLayout 构建垂直布局 QVBoxLayout 在网格中排列小部件 QGrid
  • Python Turtle 初学者(概述)

    在本分步课程中 您将借助一个名为turtle的简单交互式Python库来学习Python编程的基础知识 如果您是 Python 初学者 那么本课程肯定会在您迈入编程世界的第一步时为您提供帮助 蟒蛇turtle库具有类似的交互功能 可以让新程
  • 创建一个千篇一律的 Django 应用程序

    有关本课程中使用的工具的更多信息 请查看 GNU纳米 django environ 的文档
  • 如何使用 NumPy 获取正态分布的随机数

    目录 如何使用 NumPy 生成正态分布的随机数 绘制正态分布数字 指定平均值和标准差 在 NumPy 中使用随机数 用中心极限定理迭代至正态性 结论 概率分布描述了事件或实验所有可能结果的可能性 这正态分布是最有用的概率分布之一 因为它很
  • 如何将 Python 添加到 PATH

    目录 如何在 Windows 上将 Python 添加到 PATH 如何在 Linux 和 macOS 上将 Python 添加到 PATH 了解什么是 PATH 了解 PATH 中顺序的重要性 在基于 UNIX 的系统上管理您的 PATH
  • 类型提示

    在本课中 您将了解类型提示在Python中 类型提示是一种正式的解决方案 用于静态指示 Python 代码中值的类型 它被指定在公众号 484并介绍于Python 3 5 这是向函数添加类型信息的示例 您注释参数和返回值 def greet
  • 加入 Real Python 团队,担任视频课程讲师

    加入 Real Python 团队 担任视频课程讲师 您是否喜欢学习新事物并与数千名 Python 开发人员分享您的知识 realpython com 教程团队以提供最高质量的在线 Python 教程而闻名 我们的使命是 帮助世界各地的 P
  • 2021 年 7 月 14 日

    主持人大卫 阿莫斯回答会员的问题 在这次会议上 我们讨论了 Python 新闻和更新 Python 3 10 中的结构模式匹配是什么 什么是pyproject toml为什么要使用它 如何从 Python 自动运行 Linux 命令 和更多
  • 正则表达式:Python 中的正则表达式(第 2 部分)

    目录 re Module Functions 搜索功能 替代函数 实用功能 Compiled Regex Objects in Python 为什么要费心编译正则表达式 正则表达式对象方法 正则表达式对象属性 Match Object Me
  • 什么是数据工程?它适合您吗?

    目录 数据工程师做什么 What Are the Responsibilities of Data Engineers 数据流 数据标准化和建模 数据清理 数据可访问性 What Are Common Data Engineering Sk
  • 更多锁具

    在本课程中 您将继续探索锁并了解僵局以及如何避免它 锁也称为互斥量在其他语言中 如果您下载示例代码 您可以获得自己的副本11 more locks py 下载 Sample Code zip 12 9KB 要了解更多信息 您还可以查看有关的
  • 模拟开关/外壳 – 完整示例

    该视频总结了有关用 Python 模拟 Switch Case 的课程 在本课程中 您将看到一个真实世界的示例 说明如何使用 Python 字典来模拟 switch caselambda功能 def dispatch dict operat
  • 有效使用 NumPy 的 np.arange()

    数值模拟是数值计算的基本 Python 库 它最重要的类型是数组类型被称为ndarray NumPy 提供了很多数组创建例程对于不同的情况 arange 就是这样一个基于的函数数值范围 它通常被称为np arange 因为np是 NumPy
  • Python 中的 Minimax:学习如何输掉 Nim 游戏

    目录 玩一个简化的 Nim 游戏 Get to Know the Minimax Algorithm 探索游戏树 找到最佳的下一步行动 Lose the Game of Nim Against a Python Minimax Player
  • Python pandas:你可能不知道的技巧和功能

    目录 1 在解释器启动时配置选项和设置 2 用pandas的测试模块制作玩具数据结构 3 利用访问器方法 4 从组件列创建 DatetimeIndex 5 使用分类数据节省时间和空间 6 通过迭代内省 Groupby 对象 7 使用此映射技
Powered by Hwhale