人机版五子棋两种算法概述

  人机版五子棋是很有挑战性的。至今好像没有保证可以取胜的算法,但已经有不少写的很专业的五子棋程序了。我在编写五子棋的过程中参考了不少资料,发现人机五子棋大致有两种策略。在这儿总结一下,与大家共享。先说两种算法,然后介绍一点五子棋的专业知识。有些地方表述不清,望见谅,如有表述不清的地方,可以回帖讨论。

 

此类算法有一点是相同的,就是要对整个棋局或其中的有效位置进行评价。往往会使用一个分表。而评分表却很难确定,也没有所谓最好的,有人根据经验和测试,总结了不错的评分表,我在程序中都是用的别人的评分表。

 

第一种方法是很简单的,但是效果也是很好的。从运行结果看,这么简单的方法达到如此的水平,着实让我吃了一惊。当然,这是跟第二种算法比较的感觉。大致思路如下:

评估当前棋局中,哪个位置的得分最高。五子棋要赢,必然要有五个棋子在一起成线,那么我们就可以计算棋盘中每一个五格相连的线,一下称之为五元组。一般情况(包括专业五子棋)下棋盘是15*15的。那么应该是572个五元组。同时,针对五元组中黑子和白子的数量(可以不考虑相对位置)的不同,给该五元组评不同的分。然后每一个位置的得分就是包含这个位置的所有五元组的得分之和。 下面是我的程序中用的表示方法及其评分表。

说明:当五元组为空,分数为7,不为零的原因是,还有跟糟的情况:五元组中既有黑子又有白子,五元组也就是无效了,这时才给0分。这个评分表是我在一个老外的程序中找到的,这是我见到的几个评分表中最出色的。

 至于如何有效统计这么多五元组的得分,就自己想吧,我在写的一个程序中第一次写为了便于自己和朋友理解,居然计算了两遍,但是条理清晰。这就是在可读性和效率之间来个折中了。

 就这种算法,我写了一个程序,供大家参考:https://github.com/zhijie/Gobang

===============更新=========================

同时还有个中国象棋的源码 https://github.com/zhijie/ChineseChess vc版

后来学习android时,写了个android版的中国象棋,源码如下:

https://github.com/zhijie/ChineseChess4Android



 

 

 

第二种算法是使用正规军中的博弈算法。在极大极小值搜索中应用alpha-beta剪枝。

使用这种算法,就是估计几步之内(步数越多,时间越长,自己根据实际情况决定)放在哪个位置最有利。根据当前局面,评估每一个可以落子的位置,看看在这儿落子后的得分怎样。极大极小值搜索就是在估计自己走的时候,选得分高的,估计别人走的时候,选得分低的,这儿的低是对自己而言的,也就是假设对手选了对他最有利的位置,淡然就是让我们得分最低的位置了。然后这样假设几步,选最好的。因为这样的搜索控件往往太大了,就是用剪枝,对没有必要的走步就不用分析了。

这种算法的评分方式跟第一种不同,第一种方法是评估当前棋局的每一个位置的得分,找最优的。而这里是对假设的每一种走步的局面进行评估,选能够到达最优局面的位置落子。

这种算法属于经典的而且应用很广的算法。很多书上都有介绍。我就不多次一举了。而且我也不一定能说清。

这里给出山东师范大学董红安在2005年的硕士毕业论文中使用的的评分表

 

 

有时间我会把这种算法的五子棋写一下

 

下面提一下五子棋的专业知识

国内已有一些编程比赛是针对博弈的

那么就有了一些规定;在五子棋方面,比赛多使用专业五子棋比赛规则。主要是禁手,为了尽量公平,对先落子的一方(先手)下禁手,就是一些技术不能再用,用则为输。我找了一个禁手的图示

另外一点,为了使自己的程序更智能,先手一般会使用经典开局

因为根据经验,先手的某些开局赢的可能性更大。这种可能性的来源是,这种局面要有尽量多的两个子在一起的情况。这是26种经典开局,可以应用到自己的程序中

 

 

### Nginx 文件名逻辑漏洞(CVE-2013-4547) #### 漏洞概述 Nginx 文件名逻辑漏洞(CVE-2013-4547)允许攻击者通过精心构造的 URL 请求来绕过访问控制并读取或执行受限资源。此漏洞的根本原因在于 Nginx 错误地解析了带有特定编码字符的 URL,从而导致文件路径处理不当[^1]。 #### 影响范围 该漏洞影响多个版本的 Nginx,在某些配置下可能导致未经授权的文件访问甚至远程代码执行。具体受影响的版本包括但不限于: - Nginx 1.4.x 版本系列 - Nginx 1.5.x 版本系列 (部分) 当 Web 应用程序部署于上述版本之上时,可能存在潜在风险[^3]。 #### 复现过程 为了验证这一漏洞的存在,可以通过上传一个看似无害但实际上包含恶意 PHP 代码的图片文件 `phpinfo.jpg` 来测试。一旦成功上传,攻击者能够修改 HTTP 请求中的参数使服务器错误解释文件扩展名,进而触发命令注入行为[^4]。 ```bash curl -X POST http://example.com/upload.php \ -F "file=@/path/to/phpinfo.jpg" ``` 随后发送如下请求可尝试利用漏洞: ```http GET /uploads/phpinfo.jpg%00.php?cmd=id HTTP/1.1 Host: example.com ``` 如果存在漏洞,则返回的结果会显示当前用户的 ID 信息。 #### 安全修复措施 针对 CVE-2013-4547 的防护手段主要包括以下几个方面: - **升级至最新稳定版**:官方已发布更新解决此问题,建议立即应用最新的安全补丁以消除隐患[^2]。 - **手动修补源码**:对于无法即时升级的情况,可以从官方网站下载专门为此漏洞准备的安全补丁,并按照指引完成编译安装流程。 - **加强输入校验**:无论何时都应严格过滤用户提交的数据,特别是涉及文件操作的部分,防止非法字符进入内部处理环节。 - **启用 WAF 防护**:Web Application Firewall 能够识别异常模式并阻止可疑流量到达应用程序层面上游位置。 综上所述,及时采取适当行动可以有效降低遭受此类攻击的风险。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值