给别人做彩票网站违法吗,wordpress建站详解,娱乐网站的代理怎么做,如何做网站搭建api接口原标题#xff1a;Python#xff1a;游戏#xff1a;五子棋之人机对战
开端
画棋盘
首先肯定是要画出棋盘来#xff0c;用 pygame 画出一个 19 19 或 15 15 的棋盘并不是什么难事#xff0c;这在之前的文章中已经多次用到#xff0c;就不赘述了。
画棋子
需要说一下的是…原标题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多行就不贴代码了大家可以直接下源码看。
五子棋执黑是必赢的代码中玩家就是执黑先手电脑执白后手所以下的好是完全可以赢电脑的不过一个小小失误也很可能被电脑翻盘。返回搜狐查看更多
责任编辑