gist 打不开的凑合看这个吧 xsir317/renju

曾经从一个C++的源码那里(传送门: Index of /renlib/opensrc 就是那个ForbiddenPointFinder )找到了最初的判断禁手的源码,然后自己改了一版php用了很久。

棋盘么,五子棋判断胜负,加上有禁手、假禁手的逻辑和嵌套,并不是那么容易的,涉及很多形状判断,以及大量的横、竖、斜向的数棋子什么的, 写得不好就会i ++ j ++ 整个代码里都是,重复代码会导致整体质量很差。

我新写的这个类,把方向定义为向量, 比如斜向分别是 [ +1,+1] [-1,-1] 和 [+1,-1] [-1,+1] 这样用一个方法去处理挪格子的问题,省去了原先代码中很多和方向、挪格子相关的冗余代码。

加上注释什么的,一共不到500行,去除注释的实际代码可能也就350行。

胜负逻辑一层层梳理,也不是很复杂。

首先,按照目前的五子棋(连珠)规则,先五为胜,后手方(白棋)长连视同五连。先手方(黑棋)禁手判负。比赛之中是要求后手方当场指出,咱们这里直接就判断了。

胜负判断:如果落子为黑方,形成了五连则返回黑胜,此时无视禁手;如果没有形成五连则检查禁手,如果禁手了则返回黑方禁手,白胜。如果为白方,形成了五连或者长连,返回白胜。

禁手判断: 长连、双四、双活三。

长连: 数,黑棋超过6个就是长连了。

双四: 在四个方向 - | / \ 检查四的数量。 简单的说,当前点放个黑棋,然后找到相应方向最近的空格,判断此空格落子是否成5, 就可以判断是否是四了。 注意类似

--0-000-0--

和 --00-00-00--

这样的形状,同一条线是可以落子形成双冲四的。 注意区别。

活三:当前点向相应方向找空格,看看是否能形成活四,只要能形成活四,那就是活三。

活四:两头都能连五,而且落子并不触发禁手,且构成子是四个,那么就是活四了。

双三: 遍历四个方向 - | / \ 如果找到了大于等于2个活三,就是双三了。

具体代码实现也相当清晰,改成其他语言应该也比较轻松吧。

另外顺便实现了无禁手的规则,更简单,这里面大部分代码就用不上了。见gomokuCheckWin方法。

另外我想了一下, 如果我用15个int32 ,好像就可以表示出一个棋盘了,而且还有富裕。。。

一共15行,然后棋盘分黑、白两半。 每行一个int32。

这个int32的前15位 表示棋盘的第一行相应位置是否有黑棋,有则为1 没有则为0;

空一位,然后16~31 表示棋盘的第一行相应位置是否有白棋,有则为1 没有则为0;

一个棋局放在15个int32里绰绰有余, 如此,我们是否能用位操作进行棋盘的计算、判断,感觉代码封装一下,代码会很麻烦,但是程序运行开销会很小啊。

如果这样扔到一些人工智能学习引擎里,是不是学习效率会快一些?

有空去试试~ 弄个Python版 ,跑个TensorFlow试试能不能训练一个AI出来。。。

python判断五子棋胜负_一个连珠(带禁手的五子棋)判断胜负的PHP实现相关推荐

  1. 大爷,快来玩呀!带禁手规则的五子棋实践强化学习理论

    下载地址: https://github.com/wangjia184/renju 大爷,快来玩呀!带禁手规则的五子棋游戏,强化学习 1.基本结构 2.性能 3.棋局多样性 4.训练 最近迷上了强化学 ...

  2. python实现支持向量机实例_一个简单的案例带你了解支持向量机算法(Python代码)...

    介绍 掌握机器学习算法并不是一个不可能完成的事情.大多数的初学者都是从学习回归开始的.是因为回归易于学习和使用,但这能够解决我们全部的问题吗?当然不行!因为,你要学习的机器学习算法不仅仅只有回归! 把 ...

  3. 人工智能博弈树极大极小搜索算法alpha-beta剪枝实现五子棋,带禁手

    由于2020的特殊情况,导致了一个被拖了挺久的大作业.... 五子棋其实大家很多时候会在闲暇时刻和朋友随便玩玩,这不仅让我回忆起了高中时候摸鱼休息就喜欢和同学在自己打的格子中用铅笔来一盘五子棋,回想起 ...

  4. 自学python 编程基础知识_一个python编程自学者的历程以及给自学新手的一些建议...

    文章原本昨晚已经在电脑写好了,今天准备用手机润润色再发表,结果误操作给删了,又要重新码字,真是日了狗了. 由于手机码字,以下python就用py简称代替了.写之前其实也犹豫再三,一则自己编程水平实在有 ...

  5. python开发pc软件_程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  6. python爬微博关键字_一个简单的python爬虫实践,爬取包含关键词的新浪微博

    此项目主要功能是通过微博"搜索"页面,每天自动爬取所有包含自定list中词汇的微博原数据.低速可控,简单粗暴,适合用来有针对性的搜集数据量不是很大的包含关键词的微博,每日可爬3-6 ...

  7. python入侵数据库数据库_一个简单的Python访问Mysql数据库例子

    2020/11/3操作记录 搭建好Python的数据环境之后,接下来就是在Python代码中访问数据库我先在Navicat图形化界面创建一个数据库命名为pythontest,再在数据库中创建了一个表s ...

  8. python刷微博转发_一个简单的python刷新浪微博粉丝小程序

    代码简陋没有什么技术,还有个txt的配置文件才可以用.但是配置文件不发出来了.只要你自己好好看代码很容易猜得到.希望大家不要拿去刷了.因为实在是没意思. 代码中需要用到的相关python模块方法有: ...

  9. 围棋JAVA判断胜负_几张图教会你:围棋终局胜负计算

    作者:弈智围棋 小棋手们在下完棋之后,总会高高地举起小手,同时大声地问道:"老师!这盘棋谁赢了???!"呐,今天,老师就来告诉你们,围棋是怎样判断胜负的. 围棋的胜负是以双方在棋盘 ...

最新文章

  1. Struts2 中#、@、%和$符号的用途
  2. python爬虫赚钱的途径-如何用爬虫技术赚钱?
  3. 分析Linux内核5.0系统调用处理过程
  4. NS2:undefined reference to `xxx' collect2: error: ld returned 1 exit status
  5. 一文看尽 JVM GC 调优
  6. P1041 传染病控制
  7. LeetCode 50 实现乘方运算
  8. Windows命令查看文件MD5
  9. Python二维数组,坑苦了
  10. 计算机锁屏图片怎么设置方法,电脑锁屏照片怎么设置
  11. 如何将Kali Linux中的Firefox浏览器语言设置为中文
  12. 三种存储类型和三种存储方式
  13. 几个在线网页聊天网站
  14. 加权平均数的例子_加权平均数怎么算?举个具体的例子
  15. util.Date插入数据库有时差
  16. 四个月宝宝厌奶期症状?
  17. springboot基于vue众筹平台系统
  18. 缺少msvc140.dll解决办法,缺少任意dll文件的解决办法
  19. SQL Server-判断日期是否为周六 周日
  20. 16.04编译android 7.0,[原创]使用ubuntu 16.04编译android-6.0.0_r1

热门文章

  1. 微处理器组成的微型计算机属于,以微处理器为核心组成的微型计算机属于什么...
  2. 坑记(二):比赛环境搭配坑(1080ti,安装torch+mmdetection)
  3. 店铺有点击没有转化怎么办
  4. RK3588 编解码盒子 之 RTL8211FS-CG光口调试
  5. PAT 乙级 1069  微博转发抽奖
  6. 1069 微博转发抽奖
  7. 什么是 SSL 证书及其工作原理
  8. 微信公众号开发过程整理
  9. 四国军棋界面开发(3) 标棋和调入布局
  10. 手把手教你设计CPU RISC-V处理器设计