原标题:Python:游戏:五子棋之人机对战

开端

画棋盘

首先肯定是要画出棋盘来,用 pygame 画出一个 19 × 19 或 15 × 15 的棋盘并不是什么难事,这在之前的文章中已经多次用到,就不赘述了。

画棋子

需要说一下的是画棋子,因为没找到什么合适的棋子图片,所以只要自己来画棋子。

我们用 pygame.draw.circle 画出来的圆形是这样的:

锯齿状十分明显,pygame.draw 中有画抗锯齿直线的函数 aaline,但是并没有 aacircle 这样的函数来画一个抗锯齿的圆。

这里就需要用到 pygame.gfxdraw 啦。pygame.gfxdraw 目前还仅是实验版本,这意味着这个 API 可能会在以后的 pygame 版本中发生变化或消失。

要绘制抗锯齿和填充形状,请首先使用函数的aa *版本,然后使用填充版本。例如:

我们用这个方法在棋盘上画一个棋子试试看。

可以看到效果已明显改善。

落子

落子需要判断鼠标事件,当鼠标左键点击,获取鼠标点击的位置,然后根据棋盘的位置,计算出棋子落在棋盘的位置。

胜利判定

当一子落下,如何判定是否胜利?

可以肯定的是,当某一子落下的时候,如果出现了 5 连,那么落下的这颗子必定在这条 5 连线上。那么这个问题就可以简化了,我们无需全盘扫描,只需要在落子位置上横竖撇捺扫描一下,判断是否出现 5 连即可。

我们定义一个棋盘类,类中实例化一个 19 × 19 的二维数组,初始值皆为 0,表示空,用 1 表示黑子,2 表示白子。这个类对外提供一个落子方法 drop,接收参数落子方和落子坐标,如果落子后胜利,则返回胜利者,否则返回 None。

这里我定义了一个偏移量,我们一共要计算横竖撇捺 4 条线,任意一条线出现 5 连就算获胜。计算方法实际上是一样的,只是方向不同,所以定义一个偏移量数组,不同的偏移量表示不同的方向,这样就可以利用循环来实现了,节省了很多代码。

电脑落子

这就是全篇的重头戏了,要怎么教电脑下五子棋。

首先声明,我用的是相对传统的方式,不是深度学习。

五子棋就是要实现 5 连,所以,一开始,我的想法是:将所有连线保存在一个数组中,落子的时候选择最长的连线落子。但这样有个问题解决不掉,如何让电脑识别“三三”呢?

后来网上看到篇文章,使用的方法是:遍历棋盘上的空位,计算每一个位置其横竖撇捺 8 个方向上是否有己方的子,有一个就加 10 分,最后选得分最高的位置落子。

这样不太严谨,写出来的电脑估计水平很菜,但是这个思路却是对的,落子就是要找到最值得的地方,那么我们干脆对每一个可落子的地方来做一个评估,选出最优解。

这里我们需要了解一下五子棋的几种基本棋形:连五,活四,冲四,活三,眠三,活二,眠二。

连五

顾名思义,五颗同色棋子连在一起,赢了。

活四

四颗同色棋子连在一起,并且左右两边都没有对方棋子阻挡,有两个连五点。

冲四

四颗同色棋子连在一起,并且一边有对方棋子阻挡,或者四颗棋子不是连的,当中有个空挡,这时只有一个连五点。

活三、跳活三

活三:三颗同色棋子连在一起。

跳活三:中间隔了一个空格的活三。

眠三

只能够形成冲四的三,无外乎两种情况,一是一边被挡住了,一是当中有 2 个空格。(其实我在代码中仅考虑了第一种情况,即便形成冲四,也不是什么危险局面。)

活二和眠二

活二,能够形成活三的二;眠二,能够形成眠三的二。这里就不放图了,参考活三眠三。

打分机制

理解了这些棋形,那么按我们之前的思路,就是如何打分了。

首先,连五肯定是不存在的,出现连五胜负已分,所以只要棋局还在进行中,就不会出现连五。那么,什么优先级最高?自然就是活四了。

其次是对方的“四”,对方活四,你防不防都一样输了,对方冲四,你就必须防守。

再次是我方的活三或冲四,活三跟冲四其实是一个级别的,对方必须防守。

再次是对方的活三或冲四。

以此类推下去。我们可以总结一点规律:

相同的棋形,我方优于对方。

冲四跟活三一个级别,眠三跟活二一个级别。

如果中间有空格的话,肯定是要比没空格的略微低级一点,但不至于降级。

基本逻辑就是这样,这一块的代码我写得也不好,整个判断写了100多行,就不贴代码了,大家可以直接下源码看。

五子棋执黑是必赢的,代码中,玩家就是执黑先手,电脑执白后手,所以,下的好是完全可以赢电脑的,不过一个小小失误也很可能被电脑翻盘。返回搜狐,查看更多

责任编辑:

python五子棋人机对战_Python:游戏:五子棋之人机对战相关推荐

  1. python绑定按键pageup键_python游戏教程一——键盘事件

    无论什么游戏,少不了输入设备,键盘鼠标可能应用的是最多的,当然除了他们还有游戏手柄或者其他.今天我们就一起来学习一下经常用到的鼠标和键盘事件. python当中经常用来做游戏的标准库为pygame,今 ...

  2. python五子棋人人对战_游戏五子棋人人对战例程

    原谅我的直男视角,界面有点丑,之后在我弄懂人机对战和网络对战,深度学习后,会继续更新完善我的五子棋. .计次循环首 (17, y) .计次循环首 (17, x) 复制窗口组件 (图片框1, 图片框组 ...

  3. python写井字棋_python 游戏(井字棋)

    1. 游戏思路和流程图 实现功能,现实生活中的井字棋玩法 游戏流程图SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠. 2. 使用模块和游戏提示 impor ...

  4. 雷神之战html5游戏在线玩,雷神之战_雷神之战变态版_雷神之战无限元宝/钻石公益服_VR之家...

    <雷神之战>是一款拥有宏大的欧美魔幻世界观的ARPG游戏(世界树,诸神黄昏,欧美神话题材的巅峰设计),丰富且明了的成长系统(化神功能.装备系统.光环.英灵.精灵.神兵.称号),由浅入深的玩 ...

  5. html战棋游戏战棋游戏,六款不可错过的战棋游戏 将领才华始于纸上谈兵

    战棋游戏,就是在地图上按格移动人物进行作战的回合游戏模式."步步惊心"的战斗模式.掌控全场的战场指挥感.史诗般的精彩剧情,战棋游戏的这些特点,吸引了众多玩家.那些绞尽脑汁考虑每回合 ...

  6. python经典小游戏五子棋,适合python编程的小游戏

    python入门可以做的小游戏 1.Python入门拼图小游戏简单介绍:将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状. 2.Python入门推箱子 ...

  7. Python编写人机对战小游戏(抓狐狸)(2)

    封面图片:<中学生可以这样学Python>,董付国.应根球著,清华大学出版社 =========== 很久很久以前,在公众号里推送过一个抓狐狸游戏,详见Python编写人机对战小游戏(抓小 ...

  8. java小游戏:五子棋人机大战

    一.java小游戏:五子棋人机大战 1.绘制窗口 package wuziqi;import javax.swing.*; import java.awt.event.MouseAdapter; im ...

  9. python自学 适合新手的 python人机对战小游戏

    目录 前言 一,游戏规则 二,游戏拆解: 版本1.0(自定属性,人工PK) 版本2.0(随机属性,自动PK) 版本3.0(打印结果,三局两胜) 前言 有很多人问,怎样学python可以进步最快,我回顾 ...

  10. python井字棋游戏开发(人人对战,人机对战,包含源码,逻辑思维流程图)

    需求分析 井字棋是比较便捷休闲娱乐的一种迷你棋,玩法比较简单,只需要一个九宫格棋盘就可以实现两人对战,规则为谁先连成三个棋子的一条线即可获胜.本游戏,需要满足两个主要功能:1.能实现玩家对战:2.能实 ...

最新文章

  1. Linux下目录/文件颜色的含义
  2. play!framework框架概述
  3. python测验7编程题_2020大学moocPython编程基础章节测验答案
  4. 超强领先!Transformer图像复原效果显著!
  5. linux升级openssl需要先卸载吗,在Linux系统上升级OpenSSL的方法
  6. php动态增加div,JavaScript动态创建div等元素实例
  7. 19年Q2了,运维的你有啥计划吗?
  8. 快速入手光学字符识别控件Aspose.OCR!学会使用C#以编程方式对图像执行OCR
  9. Java实现 蓝桥杯 算法提高 文本加密
  10. Mac 解压rar格式文件(附解压工具包)
  11. 小黑公司团建吃烤肉肉啦,mac m1死活安装不上hbase,用拯救者一下就安上啦的leetcode之旅:865. 具有所有最深节点的最小子树
  12. php 音频顺序播放,MP3播放器音频文件不按顺序播放的解决方法,简单实用
  13. JAVA多线程使用场景和注意事项
  14. python读取sheet_python读取excel文件中所有sheet表格
  15. html自定义字体缓存,PixiJS:加载自定义字体
  16. colorkey口红怎么样_COLORKEY口红最近太火!不到50块,颜色比大牌还美,尤其是这4支...
  17. vs2017配置linux连接器失败,Xilinx HLx 2017.1与VS 2017兼容问题解决的方法盘点
  18. 人生苦短我用python壁纸_人生苦短,我用python
  19. Open3D 点云曲率计算
  20. matlab实现图像读取、写入和显示

热门文章

  1. 机器学习接口代码之 Ridge、Lasso、Elasitc Net
  2. python99乘法表while翻译_Python学习之while练习--九九乘法表
  3. python对excel表统计视频教程_Python实现对excel文件列表值进行统计的方法
  4. Hbase简介及常用命令相关知识总结
  5. 嵌入式常见笔试题总结(3)
  6. halcon学习(算子汇总)
  7. 深度相机(三)--三种方案对比
  8. android系统提供了url通信,Android两种HTTP通信,HttpURLConnection和HttpClient
  9. php 接口怎么响应,Stripe PHP API方法响应的结构是什么?
  10. Centos7:mysql5.6安装,配置及使用(RPM方式)