有哪些开源的计算机图形学程序代码五子棋程序的源代码值得初学者阅读

网站已改版,请使用新地址访问:
16173 这是五子棋游戏的C程序源代码,其中有其实 细节,请下载阅读并调试运行 Chess Poker games 棋牌
240万源代码下载- www.pudn.com
&文件名称: 16173
& & & & &&]
&&所属分类:
&&开发工具: C++ Builder
&&文件大小: 23 KB
&&上传时间:
&&下载次数: 105
&&提 供 者: zhangchunlei
&详细说明:这是五子棋游戏的C程序源代码,其中有其实现的细节,请下载阅读并调试运行-This is the game of 331 C source code, which is to realize the details, please read and downloaded debugging operation
文件列表(日期:)(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&五子棋&&......\CWUZIQI.EXE
&相关搜索:
&输入关键字,在本站240万海量源码库中尽情搜索:
&[] - 一个五子棋游戏,特别好玩,编程思路清晰
&[] - Goldbach s conjecture: Goldbach(哥德巴赫)曾经提出了一个这样的猜想: 对于2000 以内的正偶数都能够分解为两个素数之和。 要求: 该题是一个猜想,我们不去证明它,而是通过编程序来验证 该猜想是否正确。 输入: 用户从键盘任意输入一个自然数。 输出: 给出满足猜想的两
&[] - 我自己实现的五子棋游戏,可以实现人机对战,并且可以判断各种类型的禁手。通过人工智能算法下五子棋/连珠。国际上每年都会有Gomocup让各类AI进行PK一决胜负。关注话题分享阅读全文52 条评论分享收藏阅读全文1添加评论分享收藏感谢阅读全文251 条评论分享收藏感谢阅读全文12 条评论分享收藏感谢阅读全文3添加评论分享收藏感谢487有哪些开源的计算机五子棋程序的源代码值得初学者阅读_百度知道
有哪些开源的计算机五子棋程序的源代码值得初学者阅读
我有更好的答案
//tieba.htm
源码之家知道用百度知道.net/166/7012.htm" target="_blank">http://www.mycodes.net/166/7012.com/p/" target="_blank">http://tieba.baidu.com/p/
百度贴吧 c语言吧<a href="http.mycodes.baidu://www:
开源中国社区<a href="http给你推荐几个网站去看看吧,难道不会搜索吗
采纳率:33%
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&figure&&img src=&https://pic2.zhimg.com/v2-13ccfcdcead8adddc4442_b.jpg& data-rawwidth=&512& data-rawheight=&338& class=&origin_image zh-lightbox-thumb& width=&512& data-original=&https://pic2.zhimg.com/v2-13ccfcdcead8adddc4442_r.jpg&&&/figure&&b&参考代码、文章及文献&/b&&br&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/lihongxun945/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&极大极小值搜索算法&/a&&br&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/baixiaozhe/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Alpha-Beta剪枝算法&/a&&br&&a href=&https://link.zhihu.com/?target=https%3A//github.com/avicha/alphabeta& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&参考代码&/a&&br&&br&&br&&b&需要用到的知识&/b&&br&
game tree&br&
极大极小值搜索算法 &br&
evaluate function
Alpha-Beta剪枝算法 &br&&br&&b&为什么选择五子棋?&/b&&br&
五子棋是博弈游戏当中较简单的一种玩法,规则、赢法都很简单,其 AI 的设计也相对简单,而且目前市面上已经有了很多的五子棋游戏及开源代码,因此用五子棋来入门,是一个非常好的选择。这里和大家分享一些我的学习经历,主要记录五子棋 AI 的设计和实现过程,不介绍界面的实现。&br&&br&&b&FIRST 【博弈树 game tree】 &/b&&br&“博弈树是指由于动态博弈参与者的行动有先后次序,因此可以依次将参与者的行动展开成一个树状图形”,这是 wikipedia 对于博弈树的解释,顾名思义,博弈树就对博弈双方以相同的次数轮流进行决策行为的图形描述。对于任何一种博弈竞赛,我们都可以将其构建成一颗博弈树,其节点对应某一种棋局,其分支表示进行一步决策,博弈树的根表示开始位置,叶子节点表示博弈到此结束。&br&&figure&&img src=&https://pic1.zhimg.com/v2-10ffcd83fdfff851d10a_b.jpg& data-rawwidth=&600& data-rawheight=&225& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-10ffcd83fdfff851d10a_r.jpg&&&/figure&&br&&b&Second 【极大极小值搜索算法
the min-max algorithm
】&/b&&br&有了博弈树的概念后,我们需要做的是对这棵巨大的博弈树进行搜索,由于博弈树的每一个分支都是一步决策,因此我们需要对其进行深度优先搜索,这里我们用的是极大极小值搜索算法。其中极大极小值定理是 von Neumann 和 Borel 在上世纪 20 年代提出的,是搜索算法的数学基础,定理具体内容不做介绍。极大极小值搜索算法是一种在失败的可能性中找出最小值的方法,通俗的说就是最小化对手的最大利益,这种算法通常用递归实现&br&&figure&&img src=&https://pic2.zhimg.com/v2-09b098668cdfd678a5d4e5ca2894f40a_b.jpg& data-rawwidth=&732& data-rawheight=&359& class=&origin_image zh-lightbox-thumb& width=&732& data-original=&https://pic2.zhimg.com/v2-09b098668cdfd678a5d4e5ca2894f40a_r.jpg&&&/figure&
如上图所示,假设甲为 AI,乙为玩家&br&&br&
我们需要在双方走每一步棋后对棋局进行评估,得到一个分数,规定这个分数越大,对玩家越有利,反之对 AI 更有利&br&&br&
因此 :&br&&br&&i&AI 走的层我们成为MIN层,在这一层 AI 要选择分值最低的点走以保障自己的利益最大化;&/i&&br&&i&
玩家走的层我们成为MAX层,在这一次玩家要选择分值最高的点走以保障自己的利益最大化;&/i&&br&&br&
通俗的说,AI 在玩家落子后,遍历所有可走的位置,模拟玩家落子,并对每一种走法进行评估,选择对自己最有利的一步棋。那么,我们就需要一个能对当下局势做出评估的方法,下面说说至关重要的评估函数。&br&&br&&b&Third【评估函数 evaluate function】&/b&&br&评估函数(也称评价函数)是博弈类游戏中 AI 的重要一部分,它决定了 AI 的决策步骤 ,主要任务是评估节点的重要程度,通俗的讲,评估函数为 AI 评估目前的对局形式,也为 AI 模拟每一步决策后的对局形式,并决策出于 AI 最有利、于对方最不利的一步。&br&
评估函数的设计中最重要的一步,也是非常复杂的一个环节,是一个建立数学模型的过程,通常为:&br&&br&&u&&i&G(s) = a1 * f1(s) + a2 * f2(s) + a3 * f3(s) + . . . + an * f(n)&/i&&/u&&br&&br&&br&&i&
其中 s 为当前的局面,fi(s) 为某个评估因素的得分, ai 为某个评估因素的权重比&/i&&br&&br&然后,回到我们的五子棋,我们该如何设计评估函数呢?这就需要一些五子棋的棋局知识了,五子棋对弈的过程中,一定会出现以下这些情况:&br&&br&&i&五子 : 这种情况表示已经有一方赢得了本次对弈,出现这种情况时,我们给当前局势的评分为无穷大(infinity)&/i&&br&&i&&br&
双四 : 一方出现了两个四子相连,且均为被堵死,这种情况被认为极有可能获胜,设评分为 10000&br&&/i&&br&&i&
单四 : 一方出现了一个四子相连,且未被堵死,这种情况被认为有较大可能获胜,设评分为 5000&/i&&br&&i&&br&
双三 : 一方出现了两个三子相连,且均为被堵死,这种情况被认为有较大优势,设评分为 2000&/i&&br&&i&&br&
单三 : 一方出现了一个三子相连,且未被堵死,这种情况被认为有优势,设评分为 1000&/i&&br&&i&&br&
双二 : 一方出现了两个二子相连,且均未被堵死,这种情况我们设评分为 500&/i&&br&&i&&br&
单二 : 一方出现了一个二子相连,且未被堵死,设评分为 200&/i&&br&&i&&br&
一子 : 只有一子,设评分为 10&/i&&br&&br&&br&上面这些就是我们刚才说的 评估因素 的 权重比 (ai)。但是仅有这些权重比是不够的,我们还需要上面公式中的 fi(),也就是一个能根据当前局面给出得分的方法,下面就说说如何设计这个 fi():&br&&br&
我们需要引入一个新的概念,&b&赢法数组&/b&。大家都知道,博弈类游戏的结束一定是因为某一方触发了获胜条件或是双方在规定时间、范围内没有分出胜负,即打成平手;因此我们需要记录所有的获胜条件,在对弈者每一步决策后判断其是否触发了获胜条件,而存储获胜条件的结构我们就称之为:赢法数组。说到这里可能会有人问:在五子棋中判断是否获胜只要在棋子的周围统计同类棋子的个数不就行了吗? 没错,这确实是一种简便的判断获胜的方法,但是我们的赢法数组还有另外一个重要的功能,协助 fi() 得出分数。&br&&br&
那么赢法数组是如何协助得出分数的呢? 首先,我们需要把五子棋的所有赢法存入该数组,如图所示,不同的位置代表了不同的赢法,在 15 x 15 的棋盘中,一共有 572 种赢法。&br&&figure&&img src=&https://pic2.zhimg.com/v2-33cbd5e8ba978b76b0f102_b.jpg& data-rawwidth=&360& data-rawheight=&163& class=&content_image& width=&360&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-495c352fe53f_b.jpg& data-rawwidth=&387& data-rawheight=&182& class=&content_image& width=&387&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-e5fcb7f2aa223dbc495c8f_b.jpg& data-rawwidth=&363& data-rawheight=&205& class=&content_image& width=&363&&&/figure&&figure&&img src=&https://pic3.zhimg.com/v2-8a6a823c59dc003d3753a9_b.jpg& data-rawwidth=&289& data-rawheight=&216& class=&content_image& width=&289&&&/figure&&br&
有了所有的赢法之后,我们就可以给出得分了:对于每一种种赢法,我们需要统计该赢法的位置上己方棋子和对方棋子的数目,同样可以存储在一个数组中,然后在每一次需要对当前局势评估时,如果某种赢法上只有己方棋子或只有对方棋子,根据棋子的的数目就是该点的权重,也就是 fi() 得出的值,在和预设的评分 ai 相乘,将总分相加,就得出了当前局势下某一方的评估分数。&br&&br&
通过这样的方法,我们可以得到两个数字,分别是 玩家 和 AI 的当前优势值,我们将这两个数字做差,返回
MAX - MIN 的值,这就是该种走法的分数,也就是博弈树种叶子节点的值,值越大对玩家更有利,值越小对 AI 更有利。 &br&&br&&b&【Then】&/b&&br&
到这里,我们的五子棋 AI 已经设计完成了,AI 会模拟玩家落子,然后对每一种走法进行评估,选出最优解。这样的 AI 已经可以和人类玩家进行对战了。&br&&br&
但是它还有一个很大的缺点——速度很慢,想想看,我们最开始提到的那棵博弈树,它是非常非常庞大的,我们几乎不可能对整棵树进行搜索,这样的代价实在太大了,现实中我们一般会设置搜索层数,也就是 AI 会往后看几步棋。
我们来做一个简单的计算,假设 AI 平均一步需要考虑 50 种可能的走法,当看到第四步的时候,需要搜索的节点数为 50^4 = 625w 个,这么多的节点,计算机需要比较长的时间去‘思考’,我们不愿意长时间去等待 AI 落子,那么就需要在搜索上动些脑筋了。&br&&br&&b&Fourth【Alpha-Beta剪枝算法
alpha-beta pruning algorithm
】&/b&&br&上面我们说到,人类玩家是不愿意长时间等待计算机‘思考’的 ,要减少搜索树的时间,常用的方法是剪枝,剪去没有意义的分支来降低搜索次数,提高搜索速度,这里我们要用到的是 Alpha-Beta剪枝算法。&br&&br&
Alpha-Beta剪枝算法是在极大极小值搜索算法上的一种改进,它是一种对抗性搜索算法,当算法评估出某策略的后续走法比之前的策略还差时,就会停止该策略的后续搜索,相当于剪去了不影响最终决定的分枝。&br&&br&
算法将会用到两个值:alpha 和 beta,分别代表人类玩家能够接受的最低分和 AI 能够接受的最高分,一旦出现beta &= alpha ,我们认为父节点不会选择这个节点,因为选择这个节点会为自己带来不利,因此该分枝的其他节点也就没有了搜索的必要。&br&&br&
下面我们通过一个例子来理解 Alpha-Beta剪枝算法,这个例子参考来源于一篇博客 ,如果没看懂我的描述,请移步 &a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/baixiaozhe/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&一看就懂的Alpha-Beta剪枝算法详解&/a&&br&&br&&br&
首先明确,alpha 为下界,beta 为上界,一旦下界大于等于上届,我们就可以剪枝,停止对当前分枝的搜索。&br&&br&&figure&&img src=&https://pic1.zhimg.com/v2-101daba21b6c2c352d50d_b.jpg& data-rawwidth=&690& data-rawheight=&433& class=&origin_image zh-lightbox-thumb& width=&690& data-original=&https://pic1.zhimg.com/v2-101daba21b6c2c352d50d_r.jpg&&&/figure&&br&
这是我们要搜索的完整的树,正方形代表 玩家, 圆形代表 AI&br&&br&
alpha 的初始值为负无穷大,beta 为正无穷大;这里我们只用根节点左子树的一部分举例,其余过程雷同&br&&figure&&img src=&https://pic1.zhimg.com/v2-8c8f7abc7a78bd6f69ef25bcdf789c5f_b.jpg& data-rawwidth=&442& data-rawheight=&429& class=&origin_image zh-lightbox-thumb& width=&442& data-original=&https://pic1.zhimg.com/v2-8c8f7abc7a78bd6f69ef25bcdf789c5f_r.jpg&&&/figure&
在未到叶子节点之前,每个节点的 alpha beta 值均继承自父节点,如图所示,第一个叶子节点的评估分为 3,也就是说AI 在这一步的决策中,玩家至少可以获得一个价值为 3 分的棋局,由于第四层为AI层(MIN层),AI 应尽量让玩家更少的获利,所以修改 beta 值为 3,意为这一步 AI 最多只接受玩家获利 3 分;
再搜索下一个叶子节点,值为 17,大于 3,因此 beta 值不变。&br&&figure&&img src=&https://pic2.zhimg.com/v2-a1d6f32e4d0c904b0eafb0_b.jpg& data-rawwidth=&465& data-rawheight=&429& class=&origin_image zh-lightbox-thumb& width=&465& data-original=&https://pic2.zhimg.com/v2-a1d6f32e4d0c904b0eafb0_r.jpg&&&/figure&&br&&br&
该分支的叶子节点搜索完后,向父节点返回,并确定第四层的分支为 3,意为在这一步 AI 会选择走价值为 3 分的这一步棋,以让玩家更少的获利,继续回到第三层,这一层为玩家层(MAX层),玩家应尽量选择分值较大的步骤走,以让自己获利更多,因此我们更新 alpha 的值为其子节点的 beta 值,意为在这一步的决策中,玩家最少接收自己获利 3 分; &br&&br&随后搜索另一个分支,在这个分枝的叶子节点中,我们发现了一个节点的分枝为 2,小于 3,更新 beta 值为 2 后发现 beta &= alpha,符合剪枝条件,因此剪枝,不在搜索该分枝的其它叶子节点;&br&&br&&i&&u&通俗的说就是,如果玩家在第三层选择右边的方案,那么 AI 就一定有一步棋可以只让玩家的获利只有 2 分,也就是比左边方案的 3 分少,因此 AI 可以认为玩家在第三层做决策时不会选择右边的方案,因为这样玩家自己的获利更小,所以这一方案其他的步骤就不用考虑了。 这就是剪枝操作。&/u&&/i&&br&&br&&figure&&img src=&https://pic1.zhimg.com/v2-34e744db9d47decac9e35c_b.jpg& data-rawwidth=&607& data-rawheight=&425& class=&origin_image zh-lightbox-thumb& width=&607& data-original=&https://pic1.zhimg.com/v2-34e744db9d47decac9e35c_r.jpg&&&/figure&&br&
其他分枝的搜索与上述方法一样,我们这里展示最终剪枝完毕的结果。可以发现原本需要搜索 12 个几点,而剪枝完后我们的程序只需要搜索 6 个节点,当数量非常庞大时,剪枝操作会大大提升搜索算法的效率&br&&br&&b&【Finally】&/b&&br&上面简述的方法都是比较简单的、入门级的,如果需要提高 AI 的智能程度和思考速度,我们还有大量的工作需要做,比如 简化 AI 决策时的考虑范围、采用更高级的搜索算法、强化走法生成函数等等
参考代码、文章及文献
需要用到的知识 博弈树 game tree 极大极小值搜索算法 评估函数 evaluate function
Alpha-Beta剪枝算法 为什么选择五子棋? 五子棋是博弈游戏当中较简单的一种玩法,规则、赢法都很…
&p&比较强的开源五子棋AI:&/p&&p&1. Carbon:目前棋力最强的开源引擎。我没怎么认真研究过,不过据说代码可读性不错,比较推荐。作者是来自波兰的Micha? Czardybon。&br&&a href=&//link.zhihu.com/?target=https%3A//github.com/gomoku/Carbon-Gomoku& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - Carbon-Gomoku&/a&&/p&&p&2. Pela:在carbon之前曾经被认为最强的开源引擎,现在国内比较火的安卓五子棋大师就是盗的它的代码。算杀挺快。不过这程序AI的棋风有些不太正统,和它下过的都知道是怎么一回事。可以读一读,但不太建议模仿它。作者是来自捷克的Petr La?tovi?ka。&br&&a href=&//link.zhihu.com/?target=https%3A//sourceforge.net/projects/piskvork/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SourceForge - Piskvork & Pela&/a&&/p&&p&其它的开源AI也有,不过棋力上不如以上这两个。&/p&&p&关于五子棋的相关资料:&/p&&p&就去弈心作者的主页上去看吧,所有有价值的东西应该都在那里了……&br&&a href=&//link.zhihu.com/?target=http%3A//www.aiexp.info/gomoku-renju-resources-an-overview.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AI EXP - Gomoku/Renju Resouces -- An Overview&/a&&/p&&p&--------------------------------------------------------------------------------------------------&br&更新:&/p&&p&更新两个来自中国人的开源五子棋引擎,都是今年的新引擎。目前棋力大概和Pela差不多。&/p&&p&1. Chis,今年第一次参加Gomocup,就进入了Freestyle 1组。作者Peiming Zheng。&br&&a href=&//link.zhihu.com/?target=https%3A//github.com/ChisBread/Chis& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - Chis&/a&&/p&&p&2. Wine,也是比较新的作品,明年应该会参加Gomocup。作者Jinjie Wang。&/p&&p&&a href=&//link.zhihu.com/?target=https%3A//github.com/jinjiebang/AIWine& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - Wine&/a&&/p&
比较强的开源五子棋AI:1. Carbon:目前棋力最强的开源引擎。我没怎么认真研究过,不过据说代码可读性不错,比较推荐。作者是来自波兰的Micha? Czardybon。 2. Pela:在carbon之前曾经被认为最强的开源引擎,现在国内比较火的安卓…
谢谢邀请,至少到现在目前缺少一场真正的顶级ai和顶级人类的对战,但后来询问多位五子棋资深人士所讲,人类还是占上风的。&br&&br&先说gomocup的比赛结果&br&2006年,第一届人机大战,捷克顶级选手跟当时顶级的ai下的结果是一胜一平一负(下得都是平衡开局)。&br&2011年,第二届人机大战捷克顶级选手跟当时顶级的ai下的结果是5:3,AI赢(下得都是平衡开局)。&br&而2012年中国的弈心才出现在Gomocup里,把其余的AI都给虐了(也就是当年打败人类的那些软件),连续三年遥遥领先。2014年更是以153:9的悬殊比分赢了其余的ai。照这么说,AI应该能够赢得过顶级的人类棋手。&br&&br&但弈心的官网里,作者孙锴称:&br&&blockquote&相比电脑象棋,电脑五子棋的发展是缓慢的。顶级五子棋程序依旧无法超越最强的人类的棋手。&br&&/blockquote&这话就让人糊涂了。后来我猜测理解这可能背后有其他的隐含含义:&br&&blockquote&相比电脑象棋,电脑五子棋的发展是缓慢的。(在弈心出来之前,)顶级五子棋程序依旧无法超越最强的人类的棋手。&/blockquote&但其实考证后,真实的含义是&br&&blockquote&相比电脑象棋,电脑五子棋的发展是缓慢的。顶级五子棋程序依旧无法超越最强的人类的棋手(捷克那批棋手太菜了)。&/blockquote&据称弈心当前(2014年)的水平也是打不过世界前100的棋手,但目前还没有看到相应的比赛。&br&&br&&br&PS. 以上说的都是实战,像下面这种题目(横贯冰雪)算VCF这种东西,电脑还是要比人类解题的速度快躲了。&br&&figure&&img src=&https://pic4.zhimg.com/1d1df86b12c2795eab9ef17_b.jpg& data-rawwidth=&460& data-rawheight=&478& class=&origin_image zh-lightbox-thumb& width=&460& data-original=&https://pic4.zhimg.com/1d1df86b12c2795eab9ef17_r.jpg&&&/figure&&br&&br&参考资料:&br&&a href=&//link.zhihu.com/?target=http%3A//gomocup.org/results/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Results | Gomocup&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.piskvorky.cz/clanky/zajimavosti-ze-sveta-piskvorek-a-renju/ai-vs-clovek-2011-2/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AI vs. ?lověk 2011&/a&&br&&a href=&//link.zhihu.com/?target=http%3A//www.aiexp.info/pages/yixin-cn.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&弈心官网&/a&
谢谢邀请,至少到现在目前缺少一场真正的顶级ai和顶级人类的对战,但后来询问多位五子棋资深人士所讲,人类还是占上风的。 先说gomocup的比赛结果 2006年,第一届人机大战,捷克顶级选手跟当时顶级的ai下的结果是一胜一平一负(下得都是平衡开局)。 2011年…
通常大家玩的五子棋分为带禁手和不带禁手两个版本(前者称之为连珠&a href=&//link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Renju& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Renju&/a&,后者一般称之为五子棋&a href=&//link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Gomoku& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Gomoku&/a&),&b&无论哪一个版本,先手黑棋均必胜&/b&。&b&后面还会讲到,26种职业开局一多半都是先手必胜。&/b&&br&所谓黑必胜的意思是,只要黑棋按照一定的方式下,白棋选择棋盘上的任何一个点都不可能赢棋。&br&&br&——第一次严格的证明——&br&&br&其实在电脑出现之前,五子棋的玩家就发现黑棋采取某些开局赢面极大,实践中白棋几种很强的防守都无法阻挡黑棋最终赢,也怀疑有先手“绝对”必胜的方法。但这不能保证可能遗漏了某种白棋能赢的方式,所以二十世纪初五子棋的普遍的观点是黑棋应该是必胜,但近百年年都没有人能够真正“证明”出来白棋无论怎么下都是必败的——这个结论最终还是通过电脑来严格证明的。&br&&br&其中&b&1992年Victor Allis通过编程证明不带禁手的五子棋,黑必胜的&/b&,文章地址在这里:&a href=&//link.zhihu.com/?target=https%3A//project.dke.maastrichtuniversity.nl/games/files/phd/SearchingForSolutions.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&project.dke.maastrichtuniversity.nl&/span&&span class=&invisible&&/games/files/phd/SearchingForSolutions.pdf&/span&&span class=&ellipsis&&&/span&&/a&&br&&br&——然后说说带禁手的五子棋——&br&&br&禁手规则是只针对黑棋的,简而言之是黑棋只允许使用冲四活三这一种赢法(当然不排除白棋故意冲四不挡这种方法)。设计的目的也是为了限制黑棋的巨大优势,白棋也多了逼禁手这儿一种赢法。但后来人们也逐步发现带禁手后,黑棋依然似乎能不败。直到后来,也有人证明,带禁手执黑也可以必胜。&br&&b&2001年Janos Wagner第一次证明的带禁手的五子棋,也是黑必胜的&/b&,文章地址在这里:&a href=&//link.zhihu.com/?target=http%3A//www.sze.hu/%7Egtakacs/download/wagnervirag_2001.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&sze.hu/~gtakacs/downloa&/span&&span class=&invisible&&d/wagnervirag_2001.pdf&/span&&span class=&ellipsis&&&/span&&/a&&br&&br&这个后面的证明比前面的证明要强很多,因为按照带禁手的走法,不带禁手也一定必胜,但倒过来未必。&br&黑棋的优势到底有多大呢?&b&在26个职业开局里,已经发现有19个是黑棋必胜的(一打必胜)。&/b&&br&&br&&br&&br&——然后说说五手两打——&br&&br&这还不说,为了进一步削弱黑棋的优势,国际上推出五手两打(就是黑棋的第三步需要下两个点,但由白棋挑选让其下较弱的哪一个)的规则。可是人们发现黑棋带禁手依然是必胜。也就是说,黑棋必胜不仅仅有一种方法,而是至少有两种以上(来回应各种变种的第四步),像浦月、花月这种黑棋超级优势开局都有三种以上的必胜法。&br&&br&从实践的角度来讲,网上是可以搜索“地毯谱”( 更新:目前花月、浦月、云月、雨月、峡月、溪月、金星、水月、寒星、明星、岚月、新月、名月,山月,残月都是五手两打必胜),一般在几百兆左右,可以用renlib软件打开,所谓地毯谱的意思就是&b&黑棋会指定下法,但白棋每一步都可以选择棋盘任意位置,最后黑棋必胜&/b&。也就是说,只要按照此棋谱下棋,五子棋世界冠军都一定会输给你。&br&&br&——正式比赛怎么玩——&br&&br&所以正式的比赛才会有三手交换五手两打,山口规则(五手n打)这些复杂的规则来平衡比赛。另外业余的平台有时候还会下一手交换(第一步黑棋不下棋盘中间的天元)。但这些规则的各个分支也是逐渐被人破解,五子棋的比赛已经很大程度不是在考验自己的临场发挥,而是考验选手对于少量黑白平衡 分支的记忆情况。&br&&br&另外针对有人质疑既然五子棋必胜,为什么还要玩:&br&&blockquote&必胜并不代表去网上黑先开浦月、花月就一定人挡杀人,佛挡杀佛。必胜的各种分支套路也不是那么容易记住的,诸位可以和tito2014或者弈心执黑体验一下(高手绕道)。所以虽然理论上如果黑棋必胜那么各种对战平台上的胜率应该是50%,但实际情况是,非禁手区/禁手区均有不少胜率超过80%甚至90%的高手。&/blockquote&&br&——广义的“五子棋”——&br&&br&另外不带禁手的五子棋是属于一类更为普遍的m,n,k游戏(&a href=&//link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/M%2Cn%2Ck-game& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&m,n,k-game&/a&)的一种特例,既15,15,5。m,n,k游戏是指m行n列,轮流下子,连成k个算赢。这个在数学中专门的研究如果在最理想下法(Perfect Play)的情况下有什么样不同的结果,比如标准的三连棋(Tic-tac-toe)是3,3,3是一个平局,同样只有六路棋盘的五子棋也是平局,当然上面我们已经说明了15,15,5是先手必胜,还有研究发现11,11,5也是先手必胜。m,n,k游戏只有先手必胜和平局两种结果。由于每下一个子都一定会对下子一方那一方有优势,所以可以通过反证法证明m,n,k游戏里不可能有后手胜利的情况。如果后手有胜利的方法,那么先手可以提前“借鉴”过来实现必胜(Strategy stealing)。&br&&br&——如果不加复杂的开局规则,怎么办——&br&&br&另外除了规定复杂的开局和禁手规则,其实还有一个出路:&br&&blockquote&除了采取对先手采取各种限制的方法,2003年被吴毅成教授发明的&a href=&//link.zhihu.com/?target=http%3A//zh.wikipedia.org/wiki/%25E9%%25E5%2585%25AD%25E6%25A3%258B& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&連六棋&/a&(Connect6)也非常类似五子棋,难度很高,但六子棋没有先手优势——因为每一步都下两个子,除了第一步下一个子,这样保证双方每次下棋时,都可以比对方多一个子。AI目前计算的结果也是,没有发现先手比后手有更大的优势。&/blockquote&既然双方都没有优势,六子棋下满整个(围棋19x19棋盘)都没有分出高低都是有可能的。(这个游戏已经不再是m,n,k游戏了)&br&不得不说的是,虽然有个别比赛(gomocup说你呢)还是在用限定规则的五子棋做ai比赛,但是正经的编程奥赛是没有五子棋的比赛(93年就没了好不好),而被connect6这种简约的规则所取代。Connect6的解决难度几乎与围棋相当。&br&&br&——有关五子棋AI——&br&&br&感兴趣传统五子棋和连珠的AI算法的可以参考这个问题:&br&&ul&&li&&a href=&http://www.zhihu.com/question/& class=&internal&&现在的五子棋AI在职业比赛规则下与人对决是什么水平? - 人工智能&/a&&br&&/li&&li&&a class=&internal& href=&http://www.zhihu.com/question/&&想写一个机器学习类的五子棋,可能么?可能的话需要看什么书,参考什么,求指点&/a&(英文)&br&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.aiexp.info/gomoku-renju-resources-an-overview.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AI EXP&/a&&/li&&/ul&
通常大家玩的五子棋分为带禁手和不带禁手两个版本(前者称之为连珠,后者一般称之为五子棋),无论哪一个版本,先手黑棋均必胜。后面还会讲到,26种职业开局一多半都是先手必胜。 所谓黑必胜的意思是,只要黑棋按照一定的方式下,白棋选择棋盘上…
已有帐号?
无法登录?
社交帐号登录
4972 条内容
345 条内容
676 人关注
2099 条内容
266 条内容}

我要回帖

更多关于 五子棋程序代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信