五子棋,作为一个拥有着先手必胜属性的棋类,实际上是不公正的,就算是后人给加上了禁手,换子这样的规则,先手依旧有着极大的上风。
正是由于这样的不公正,五子棋的AI早就可以啪啪啪打去世人类几条街了,由于机器只假如先手,就很随意马虎推导出必胜下法。
本日我带来的五子棋AI,是一个无禁手的夹帐AI,理论上基本上是不能下赢人类的,不过你假如被这个AI下赢了的话,这辈子我推举你不要再碰五子棋了。
那么,闲谈也就先告一段落,接下来来详细说说思路与方法。
这里附带两张被奕心吊打的棋局,奕心被限定在深度探索两层,而这个ai没有深度探索,以是不被吊打才不正常。

一、思路。

对付全体五子棋AI来说,玩家只会在意两点,韶光和棋力。
我们的目标是打算韶光花费更短,且棋力达到不会很蠢的地步。

网上所能找到的大多数五子棋AI,都有着这样的特色,也便是每次局势更新的时候,都会对棋盘进行一次遍历估值,或许对付别的平台或者别的措辞来说,这并没有什么问题,但是,如果我们须要用mc来进行编写的话,第一道难关便是mojang的辣鸡优化。
事实证明,每次对局势遍历一次都将极大程度的延长打算韶光。
那么我们的紧张目标便是,通过代码的优化来填补这以先天不敷。
对付五子棋AI来说,则是减少须要读写的范围。
这里也有大量的AI将遍历区域缩小至棋子的周围四格,这是很合理并且很随意马虎实行的策略,这将是核心思路之一。

搞趣网我的世界五子棋AI怎么做  五子棋AI制作教程

在韶光压缩下来后,我们须要提高AI的棋力,常日市情上的解法是博弈树,但是这每每对付我们来说是无法忍受的,由于博弈树就代表深度探索,不仅要遍历棋局,更要遍历各种可能性,这就代表着韶光将呈指数级别的延长。
就算是一些高优化的AI,对付一些局势的探索也会须要几十秒乃至几分钟的打算,同样的打算量放在mc里就有可能须要几小时乃至几天来运行,那么这样的一个AI是没故意义的。
同样的,mc对付变量的管理办法虽然不至于像前几个版本那样贫瘠,但是也是远远不能达到一样平常程序的需求的,所谓在夹缝中求生存嘛。

那么我们只有仅进行当前局势估值,完备放弃可能性打算。
这也就代表了第一层的下法得尽可能的好。
此外,经由实验证明,过于频繁的棋型判断也会造成极大程度的延时,以是这一点我们也得尽可能的压缩。

二,实际演习训练。

提前说一下,下子以及胜利剖断之类的可更换操作我就不深入来说了,由于毕竟可更换也便是说有一万种方法来实现,能看懂这篇文章的也就代表能够自己制作出来了,以是篇幅留给核心算法。
由于是哀求快速的算法,以是基本上是简约不大略。

棋盘规格是1919。
以下这些不要问我为啥不用代码格式而用引用格式,被吞无数次,这是不得已的下策。

x

y

l

h 以上四个计分板是属于每个格子的固有属性,是代表着这个格子的行,列,以及第几条斜线,所存储的值是绝对不会变动的。

xc

yc

lc

hc以上四个是用来打算落子点与该格的行列差值的,0代表和落子点处于同一行。

b1

b2

b3

b4

w1

w2

w3

w4以上八个计分板是用来存储各个方向上的权值的。
b代表防守,w代表进攻,下同。
在开局时会根据格子位置给予一个眇小的初始量,如最中间的是10,最外围的是1。

b01 =b1+b2

b02 =b1+b3

b03 =b1+b4

b04 =b2+b3

b05 =b2+b4

b06 =b3+b4

w01

w02

w03

w04

w05

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[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

清理最优解缓存。

以上便是搞趣网

我的天下0.14.0版本更新大全

我的天下0.14.0下载

大略单纯欧式屋子建造教程

水车+水井建造教程

我的天下0.15.0更新内容汇总

我的天下0.14.0红石教程大全

我的天下故事模式第五章全剧情攻略

做事器汇总讲授视频新手攻略红石教程我的天下手机版攻略大全我的天下热门攻略合集载具合集建筑合集屋子设计图红石大全枪械大全附魔大百口具大全我的天下0.14.0更新内容汇总中继器漏斗投掷器发射器比较器物品展示框舆图附魔台TNT矿车运输矿车漏斗矿车大型陷阱箱沼泽小屋炼药锅鸡骑士女巫0.10.5资源大全0.11.0资源大全皮肤材质包皮肤材质包舆图存档建筑存档舆图存档建筑存档js下载游戏下载js下载游戏下载0.12.0资源大全0.13.0资源大全皮肤材质包皮肤材质包舆图存档建筑存档舆图存档建筑存档js下载游戏下载js下载游戏下载0.14.0资源大全0.15.0资源大全皮肤材质包皮肤材质包舆图存档建筑存档舆图存档建筑存档js下载游戏下载js下载游戏下载我的天下pc版攻略大全1.6资源大全1.7资源大全皮肤材质包皮肤材质包舆图存档建筑存档舆图存档建筑存档mod下载游戏下载mod下载游戏下载1.8资源大全1.9资源大全皮肤材质包皮肤材质包舆图存档建筑存档舆图存档建筑存档mod下载游戏下载mod下载游戏下载

下载更多我的天下攻略,敬请关注搞趣网我的天下专区。