最近我用Python做了一个国际象棋程序并把代码发布在Github上了。这个代码不到1000行,大概20%用来实现AI。在这篇文章中我会介绍这个AI如何工作,每一个部分做什么,它为什么能那样工作起来。你可以直接通读本文,或者去下载代码,边读边看代码。虽然去看看其他文件中有什么AI依赖的类也可能有帮助,但是AI部分全都在AI.py文件中。

AI 部分总述

AI在做出决策前经过三个不同的步骤。首先,他找到所有规则允许的棋步(通常在开局时会有20-30种,随后会降低到几种)。其次,它生成一个棋步树用来随后决定最佳决策。虽然树的大小随深度指数增长,但是树的深度可以是任意的。假设每次决策有平均20个可选的棋步,那深度为1对应20棋步,深度为2对应400棋步,深度为3对应8000棋步。最后,它遍历这个树,采取x步后结果最佳的那个棋步,x是我们选择的树的深度。后面的文章为了简单起见,我会假设树深为2。

生成棋步树

棋步树是这个AI的核心。构成这个树的类是MoveNode.py文件中的MoveNode。他的初始化方法如下:

这个类有五个属性。首先是move,即它包含的棋步,它是个Move类,在这不是很重要,只需要知道它是一个告诉一个起子往哪走的棋步,可以吃什么子,等等。然后是children,它也是个MoveNode类。第三个属性是parent,所以通过它可以知道上一层有哪些MoveNode。pointAdvantage属性是AI用来决定这一棋步是好是坏用的。depth属性指明这一结点在第几层,也就是说该节点上面有多少节点。生成棋步树的代码如下:

变量moveTree一开始是个空list,随后它装入MoveNode类的实例。第一个循环后,它只是一个拥有没有父结点、子结点的MoveNode的数组,也就是一些根节点。第二个循环遍历moveTree,用populateNodeChildren函数给每个节点添加子节点:

这个函数是递归的,并且它有点难用图像表达出来。一开始给它传递了个MoveNode对象。这个MoveNode对象会有为1的深度,因为它没有父节点。我们还是假设这个AI被设定为深度为2。因此率先传给这个函数的结点会跳过第一个if语句。

然后,决定出所有规则允许的棋步。不过这在这篇文章讨论的范围之外,如果你想看的话代码都在Github上。下一个if语句检查是否有符合规则的棋步。如果一个都没有,要么被将死了,要么和棋了。如果是被将死了,由于没有其他可以走的棋步,把node.move.checkmate属性设为True并return。和棋也是相似的,不过由于哪一方都没有优势,我们把node.pointAdvantage设为0。

如果不是将死或者和棋,那么legalMoves变量中的所有棋步都被加入当前结点的子节点中作为MoveNode,然后函数被调用来给这些子节点添加他们自己的MoveNode。

python国际象棋规则_如何使用Python编写一个国际象棋AI程序相关推荐

  1. java写便签_如何编写一个便签程序(用Java语言编写)

    如何编写一个便签程序(用Java语言编写) 热度:336   发布时间:2011-02-18 11:44:16 如何编写一个便签程序(用Java语言编写) 因为以前没有好好学习Java,都搞忘了,请大 ...

  2. nodejs命令行执行程序_在NodeJS中编写命令行应用程序

    nodejs命令行执行程序 by Peter Benjamin 彼得·本杰明(Peter Benjamin) 在NodeJS中编写命令行应用程序 (Writing Command-Line Appli ...

  3. java 多线程 卖票_编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示);...

    编写一个Java 多线程程序,完成三个售票窗口同时出售20张票(如下图所示); 程序分析:(1)票数要使用同一个静态值: (2)为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: (1 ...

  4. java编程用户输入两个数字_编写一个Java应用程序,要求从键盘输入两个整数,计算这两个数据...,编写一个Java应用程序,要求从键盘输入一个数,判断该数是不...

    导航:网站首页 > 编写一个Java应用程序,要求从键盘输入两个整数,计算这两个数据...,编写一个Java应用程序,要求从键盘输入一个数,判断该数是不 编写一个Java应用程序,要求从键盘输入 ...

  5. 让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析

    让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析 标签:new bing.GPT-4 文章目录 让 new bing 使用 GPT-4 编写一个令人满意的程序全过程赏析 前言 ...

  6. 利用C#编写一个水准测量近似平差程序

    一.代码界面展示 整个界面主要就是就整个界面而言,其实主要使用到的控件就是Menu,tabControl,dataGridView,richtextbox. 二.代码运算结果展示 1.导入数据 这里就 ...

  7. C语言编程编制职工档案管理程序,C语言 编写一个职工档案程序.doc

    C语言 编写一个职工档案程序 一.实验项目: 实验6 课程设计 (时间安排:6课时) 二.实验内容: 编写一个职工档案程序,设计实现如下功能: 建立一个职工数据结构,结构包含姓名.序号.性别和年龄信息 ...

  8. 2023-05-29 用 fltk gui库编写一个打字练习程序

    用 fltk gui库编写一个打字练习程序 前言 一.FLTK GUI 库 二.使用步骤 1.引入库 2.使用代码 总结 前言 给孩子练习键盘打字, 发现终端还是欠点意思, 研究了一下gui, 最终用 ...

  9. 华为面试题:请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

    已经很久没有写博客了,2017年的最后一天写一篇,用这样的方式和2017年告别挺好的.这段时间经历找工作,是我这一年截止到目前最迷茫的时期.看看程序,思考能让我冷静下来,不被杂事打扰,前天看到了华为的 ...

最新文章

  1. centos8.2 hyper第一代 第二代_欧洲第一代法王以工程师身份加入拳头游戏,网友齐呼:是真的牛...
  2. 吊打一切现有开源OCR项目!90% +准确率,训练部署一条龙
  3. C++ STL容器值set
  4. JavaScript 5/30:Flex Panel Gallery即FLEX布局的图片库
  5. MongoDB数据库因安全漏洞,导致Family Locator泄露二十多万名用户数据
  6. 到底应该使用count(*) 还是count(1)
  7. 手机销售网jsp程序设计
  8. Qt实现职工信息管理系统
  9. VMware虚拟机通过光盘PE安装GHOSTxp
  10. 漫谈软件系统测试——缺陷分析
  11. 三、面向对象(高琪java300集+java从入门到精通笔记)
  12. app通过电商变现方式探讨
  13. 学计算机会学dos,DOS操作系统和上课学习的应用软件_CPUCPU评测-中关村在线
  14. 如何用wps设计统一的图片背景
  15. OpenWrt 编译及batman-adv组件选择(for Netgear WNDR3800)
  16. 【毕业设计】基于超声波与红外的自动调速风扇系统(代码开源) -物联网 嵌入式 stm32
  17. 计算机网络域名解析,域名解析是什么意思?
  18. 第956期机器学习日报(2017-05-01)
  19. 新兴游戏市场之——马来西亚
  20. VueScan Pro(扫描仪驱动程序)官方中文版V9.7.50

热门文章

  1. <read papers>学术论文的基金项目和研究成果格式怎么标注?
  2. Web思维导图实现的技术点分析
  3. 一款免费的屏幕录制软件
  4. ANDROID下面的游戏更新目录
  5. 如何思考产品价值定位?
  6. 《Linux命令行与shell脚本编程大全》读书笔记 之一
  7. c语言 强制退出程序,C#实现点击按钮退出应用程序实例
  8. JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化
  9. 使用freesurfer和3Dslicer进行脑区分割和电极定点(日常记录)
  10. FZU-2268 Cutting Game