现在的超难五子棋棋AI在职业比赛规则下与人对决是什么水平

本帖子已过去太久远了,不再提供回复功能。君,已阅读到文档的结尾了呢~~
五子棋必胜开局:五子棋先下的一定赢吗?有什么算法原理可以说明这个问题? 五子棋必胜开局
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
五子棋必胜开局:五子棋先下的一定赢吗?有什么算法原理可以说明这个问题? 五子棋必胜开局
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口资料图鉴:教程速查:
当前位置:
我的世界五子棋AI教程 五子棋AI制作思路与方法解析
小编:3F时间: 08:51
  我的世界五子棋AI教程 五子棋AI制作思路与方法解析。那下面给大家分享的就是玩家制作一个五子棋AI的教程哦~不知道怎么做的玩家不妨进来看看下面的教程哦~希望大家喜欢。
  游戏园我的世界官方群:(已满) 二群:&欢迎各路喜爱我的世界的小伙伴们加入讨论!
  玩服务器的小伙伴们可以加入:&群一起联机玩游戏哦!
  如果你是腐竹的话可以给我们投稿你的服务器哦~投稿地址:
  如果你有心仪的作品或者心得分享的话,欢迎来游戏园投稿,大家可以点击&&&&&&进行投稿哦~&有奖品哦~
  这阵子我捣鼓了一个五子棋AI,觉得速度上可以接受,下起来也不会显得太傻,所以今天我就发帖,来给大家说说,我是如何实现五子棋AI的。
  五子棋,作为一个拥有着先手必胜属性的棋类,实际上是不公平的,就算是后人给加上了禁手,换子这样的规则,先手依旧有着极大的优势。正是因为这样的不公平,五子棋的AI早就可以啪啪啪打死人类几条街了,因为机器只要是先手,就很容易推导出必胜下法。今天我带来的五子棋AI,是一个无禁手的后手AI,理论上基本上是不能下赢人类的,不过你要是被这个AI下赢了的话,这辈子我推荐你不要再碰五子棋了。
  那么,闲谈也就先告一段落,接下来来具体说说思路与方法。这里附带两张被奕心吊打的棋局,奕心被限制在深度探索两层,而这个ai没有深度探索,所以不被吊打才不正常。
  一、思路。
  对于整个五子棋AI来说,玩家只会在意两点,时间和棋力。我们的目标是计算时间消耗更短,且棋力达到不会很蠢的地步。
  网上所能找到的大多数五子棋AI,都有着这样的特征,也就是每次局面更新的时候,都会对棋盘进行一次遍历估值,或许对于别的平台或者别的语言来说,这并没有什么问题,但是,如果我们需要用mc来进行编写的话,第一道难关就是mojang的辣鸡优化。事实证明,每次对局面遍历一次都将极大程度的延长计算时间。那么我们的首要目标就是,通过代码的优化来弥补这以先天不足。对于五子棋AI来说,则是减少需要读写的范围。这里也有大量的AI将遍历区域缩小至棋子的周围四格,这是很合理并且很容易执行的策略,这将是核心思路之一。
  在时间压缩下来后,我们需要提高AI的棋力,通常市面上的解法是博弈树,但是这往往对于我们来说是无法忍受的,因为博弈树就代表深度探索,不仅要遍历棋局,更要遍历各种可能性,这就代表着时间将呈指数级别的延长。就算是一些高优化的AI,对于一些局面的探索也会需要几十秒甚至几分钟的计算,同样的计算量放在mc里就有可能需要几小时甚至几天来运行,那么这样的一个AI是没有意义的。同样的,mc对于变量的管理方式虽然不至于像前几个版本那样贫瘠,但是也是远远不能达到一般程序的需求的,所谓在夹缝中求生存嘛。
  那么我们只有仅进行当前局面估值,完全放弃可能性计算。这也就代表了第一层的下法得尽可能的好。此外,经过实验证明,过于频繁的棋型判断也会造成极大程度的延时,所以这一点我们也得尽可能的压缩。
  二,实际演练。
  提前说一下,下子以及胜利判定之类的可替换操作我就不深入来说了,因为毕竟可替换也就是说有一万种方法来实现,能看懂这篇文章的也就代表能够自己制作出来了,所以篇幅留给核心算法。因为是要求快速的算法,所以基本上是简约不简单。
  棋盘规格是19*19。以下这些不要问我为啥不用代码格式而用引用格式,被吞无数次,这是不得已的下策。
  h 以上四个计分板是属于每个格子的固有属性,是代表着这个格子的行,列,以及第几条斜线,所存储的值是绝对不会更改的。
  hc以上四个是用来计算落子点与该格的行列差值的,0代表和落子点处于同一行。
  w4以上八个计分板是用来存储各个方向上的权值的。b代表防守,w代表进攻,下同。在开局时会根据格子位置给予一个微小的初始量,如最中间的是10,最外围的是1。
  b01 =b1+b2
  b02 =b1+b3
  b03 =b1+b4
  b04 =b2+b3
  b05 =b2+b4
  b06 =b3+b4
  w06 以上12个计分板仅用来做取最大值的中间计分板。缓存用。
  以上是我全部的计分板。
  接下来来从指令层面讲解整体的流程。有关于一些特定棋型的判断就是通过叠加execute然后探测方块实现的,难是不难,就是很卡,所以为了防止你们想不到更好的答案,我这里就讲到这里。补充:如出现必须堵上的点会给这个点一个high的tag标记。
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] xc = @e[type=ArmorStand,c=1,r=0] x
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] yc = @e[type=ArmorStand,c=1,r=0] y
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] hc = @e[type=ArmorStand,c=1,r=0] h
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] lc = @e[type=ArmorStand,c=1,r=0] l
  以上四条是为了给每个单元的计算计分板读取所在的坐标值。
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] xc -= @e[name=b,c=1] x
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] yc -= @e[name=b,c=1] y
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] hc -= @e[name=b,c=1] h
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] lc -= @e[name=b,c=1] l
  以上四条是计算该点与刚刚落子的那一点的坐标差值,0即代表是和落子位处于同一斜线。
  execute @e[name=b] ~ ~ ~ scoreboard players add @e[r=6,score_yc=0,score_yc_min=0,name=o,score_b2=4100] b2 1300
  execute @e[name=b] ~ ~ ~ scoreboard players add @e[r=6,score_xc=0,score_xc_min=0,name=o,score_b1=4100] b1 1300
  execute @e[name=b] ~ ~ ~ scoreboard players add @e[r=4,score_hc=0,score_hc_min=0,name=o,score_b4=4100] b4 1300
  execute @e[name=b] ~ ~ ~ scoreboard players add @e[r=4,score_lc=0,score_lc_min=0,name=o,score_b3=4100] b3 1300
  execute @e[name=b] ~ ~ ~ scoreboard players remove @e[r=6,score_yc=0,score_yc_min=0,name=o,score_w2=4100] w2 1000
  execute @e[name=b] ~ ~ ~ scoreboard players remove @e[r=6,score_xc=0,score_xc_min=0,name=o,score_w1=4100] w1 1000
  execute @e[name=b] ~ ~ ~ scoreboard players remove @e[r=4,score_hc=0,score_hc_min=0,name=o,score_w4=4100] w4 1000
  execute @e[name=b] ~ ~ ~ scoreboard players remove @e[r=4,score_lc=0,score_lc_min=0,name=o,score_wl=4100] w3 1000
  这里是落子点对周围处在统一斜线上的空位权值的修正,这样每次最多只需要重新修改32个位置的权值,比重新遍历一遍棋盘不知道高到哪里去了。然后注意的是,防守的权值修正高于进攻权值修正,因为,反正后手劣势,不如以防守为主。这样的偏差虽然会导致一点微小的差错,但是基本上是难以预料到这一点的。
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b01 = @e[type=ArmorStand,c=1,r=0] b1
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b01 += @e[type=ArmorStand,c=1,r=0] b2
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b02 = @e[type=ArmorStand,c=1,r=0] b1
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b02 += @e[type=ArmorStand,c=1,r=0] b3
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b03 = @e[type=ArmorStand,c=1,r=0] b1
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b03 += @e[type=ArmorStand,c=1,r=0] b4
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b04 = @e[type=ArmorStand,c=1,r=0] b2
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b04 += @e[type=ArmorStand,c=1,r=0] b3
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b05 = @e[type=ArmorStand,c=1,r=0] b2
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b05 += @e[type=ArmorStand,c=1,r=0] b4
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b06 = @e[type=ArmorStand,c=1,r=0] b3
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b06 += @e[type=ArmorStand,c=1,r=0] b4
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w01 = @e[type=ArmorStand,c=1,r=0] w1
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w01 += @e[type=ArmorStand,c=1,r=0] w2
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w02 = @e[type=ArmorStand,c=1,r=0] w1
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w02 += @e[type=ArmorStand,c=1,r=0] w3
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w03 = @e[type=ArmorStand,c=1,r=0] w1
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w03 += @e[type=ArmorStand,c=1,r=0] w4
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w04 = @e[type=ArmorStand,c=1,r=0] w2
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w04 += @e[type=ArmorStand,c=1,r=0] w3
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w05 = @e[type=ArmorStand,c=1,r=0] w2
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w05 += @e[type=ArmorStand,c=1,r=0] w4
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w06 = @e[type=ArmorStand,c=1,r=0] w3
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w06 += @e[type=ArmorStand,c=1,r=0] w4
  这里是计算出之前结构的12个估值变量,注意,是每个格子都拥有各自的12个变量。
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b01 & @e[type=ArmorStand,c=1,r=0] b02
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b01 & @e[type=ArmorStand,c=1,r=0] b03
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b01 & @e[type=ArmorStand,c=1,r=0] b04
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b01 & @e[type=ArmorStand,c=1,r=0] b05
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] b01 & @e[type=ArmorStand,c=1,r=0] b06
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w01 & @e[type=ArmorStand,c=1,r=0] w02
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w01 & @e[type=ArmorStand,c=1,r=0] w03
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w01 & @e[type=ArmorStand,c=1,r=0] w04
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w01 & @e[type=ArmorStand,c=1,r=0] w05
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w01 & @e[type=ArmorStand,c=1,r=0] w06
  entitydata @e[name=b] {CustomName:&a&}
  每个格子都选出自己最大的当前权值。
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] w01 & @e[type=ArmorStand,c=1,r=0] b01
  判断进攻权值是否大于防御权值,取二者最大值。
  scoreboard players add @e[name=o,tag=high] w01 2000
  判断这个点是否是需要被特殊照顾一下,如果是,进一步加大权值。
  /scoreboard players operation @e[tag=head,c=1] x & @e[tag=Start,name=o] w01
  /scoreboard players operation @e[tag=Start,name=o] w01 -= @e[tag=head,c=1] x
  entitydata @r[type=ArmorStand,score_w01_min=0,c=1,name=o] {CustomName:&b&}
  选出拥有最大权值的格子,并给予落子标签。
  execute @e[tag=Start,name=b] ~ ~ ~ setblock ~ ~1 ~ stained_glass 0
  落子!
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] xc = @e[type=ArmorStand,c=1,r=0] x
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] yc = @e[type=ArmorStand,c=1,r=0] y
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] hc = @e[type=ArmorStand,c=1,r=0] h
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] lc = @e[type=ArmorStand,c=1,r=0] l
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] xc -= @e[name=b,c=1] x
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] yc -= @e[name=b,c=1] y
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] hc -= @e[name=b,c=1] h
  execute @e[tag=Start,name=!a] ~ ~ ~ /scoreboard players operation @e[type=ArmorStand,c=1,r=0] lc -= @e[name=b,c=1] l
  execute @e[name=b] ~ ~ ~ scoreboard players remove @e[r=6,score_yc=0,score_yc_min=0,name=o,score_b2=4100] b2 1300
  execute @e[name=b] ~ ~ ~ scoreboard players remove @e[r=6,score_xc=0,score_xc_min=0,name=o,score_b1=4100] b1 1300
  execute @e[name=b] ~ ~ ~ scoreboard players remove @e[r=4,score_hc=0,score_hc_min=0,name=o,score_b4=4100] b4 1300
  execute @e[name=b] ~ ~ ~ scoreboard players remove @e[r=4,score_lc=0,score_lc_min=0,name=o,score_b3=4100] b3 1300
  execute @e[name=b] ~ ~ ~ scoreboard players add @e[r=6,score_yc=0,score_yc_min=0,name=o,score_w2=4100] w2 1000
  execute @e[name=b] ~ ~ ~ scoreboard players add @e[r=6,score_xc=0,score_xc_min=0,name=o,score_w1=4100] w1 1000
  execute @e[name=b] ~ ~ ~ scoreboard players add @e[r=4,score_hc=0,score_hc_min=0,name=o,score_w4=4100] w4 1000
  execute @e[name=b] ~ ~ ~ scoreboard players add @e[r=4,score_lc=0,score_lc_min=0,name=o,score_w3=4100] w3 1000
  与之前相同的权值修正。
  entitydata @e[name=b] {CustomName:&a&}
  将落子点的标记修正成已落子的标记。
  /scoreboard players set @e[tag=head,c=1] x 0
  清理最优解缓存。
  PS:在此非常感谢我的世界玩家乙烯_中国的分享。
  以上就是我的世界五子棋AI教程 五子棋AI制作思路与方法解析。更多精彩尽在游戏园我的世界专区。
  相关攻略推荐:
分享到:更多
类型:休闲娱乐平台:PC,iOS,安卓
游戏大礼包手游开测表
挂机吧主公五四土豪青年礼包九阴真经3D五四大好青年礼包《皇图》五四青年节礼包HIT:我守护的一切五一限量金币礼包《口袋妖怪复刻》五一节礼包笑傲天龙五一飞速升级礼包
05-16公测05-04内测04-29内测04-28公测04-23公测04-22内测04-22封测04-14公测04-13公测04-07公测
攻略推荐本月最新
手游排行网游单机连珠五子棋_牛宝宝文章网 > 专题 > 中国现代连珠五子棋的开拓者那威九段,多年钻研五子棋,潜心发掘五子棋的中国民间阵法,他总结了五子棋行棋的要领和临阵对局的经验,得出一套 “ 秘诀 ”
,谓之《那氏五子兵法》: 先手要攻,后手要守,以攻
五子棋是一种两人对弈的纯策略型棋类游戏,其中五子棋的连珠是最有挑战性的走法。下面是有五子棋连珠入门教程讲解,欢迎参阅。五子棋连珠入门教程那么连珠是什么呢?其实,连珠就是五子棋,说的准确点,是改良后的五子棋。现代五子棋的《可视化程序设计》课程设计报告大庆师范学院《可视化程序设计》课程设计报告设计课题姓专班学名 业 级 号 连珠(五子棋) 岳景达、朱峰、刘新、商静龙 自动化
一班 、200901五子棋技巧大全中国现代连珠五子棋的开拓者那威九段,多年钻研五子棋,潜心发掘五子棋的中国民间阵法,他总结了五子棋行棋的要领和临阵对局的经验,得出一套 “ 秘诀
” ,谓之《那氏五子兵法》: 先手要攻,后五子棋技巧大全中国现代连珠五子棋的开拓者那威九段,多年钻研五子棋,潜心发掘五子棋的中国民间阵法,他总结了五子棋行棋的要领和临阵对局的经验,得出一套 “ 秘诀
” ,谓之《那氏五子兵法》: 先手要攻,后
很久很久以前,有一种棋类运动叫做连珠(RENJU)。那时,虽然玩者甚众,却已出现了衰微的迹象。而其中推波助澜者,是一种叫做必胜终结谱(俗称“地毯谱”)的东西。下面我们给你介绍一段久远的,关于必胜谱的故事。
五子棋必胜九段最高!以下是二○○三年十月二十一日颁布的《中国五子棋段级位制》 中国五子棋段级位制(试行) 第一章 总则 第一条
为充分调动和激发广大五子棋(连珠)爱好者参与五子棋活动的积极性,统一和规范我国五子
五子棋的开局阶段是十分短暂的,大约在七着与十几着之间。在这一阶段的争夺中,双方的布局、应答将对以后的胜负起着极为关键的作用。一般来说,黑棋以攻为主,而白棋则以防守为主。那么连珠的开局总共有多少种呢?[
网友胡天硕对[五子棋必胜开局]五子棋先下的一定赢吗?有什么算法原理可以说明这个问题?给出的答复:通常大家玩的五子棋分为带禁手和不带禁手两个版本(前者称之为连珠Renju,后者一般称之为五子棋Gomok
[连珠终结者]现在的五子棋AI在职业比赛规则下与人对决是什么水平?我知道有禁手无三手交换五手二打的AI已经黑棋必胜了。那在正规比赛的规则下,顶尖AI和顶尖人类的实力是怎样的关系呢?按照我粗浅的看法,五
好玩的弹珠游戏11-04-17阅:1游戏大全——以后年会什么的,不怕没有玩的了11-04-13阅:2象棋、五子棋、围棋棋谱知识教程11-04-09阅:2快乐拼图(小游戏)11-03-10阅:2《打老鼠分享到:推荐文章最新文章

我要回帖

更多关于 超难五子棋 的文章

 

随机推荐