立体五子棋中的一个有趣的bug

跟随邹老师在MSRA的USTC软件工程课程中有一个有趣的作业,实现一个立体的棋类游戏,可以两个对战也可以人机对战,觉得想法非常有创意,非常有兴趣,也是为了借机学习一下silverlight,就开始编写一个立体五子棋。大概进展是这样的:

一个星期:学习silverlight,熟悉VS环境

一个星期半:编写一个立体的人机交互界面,但不会旋转,可以在上面下棋,并判断输赢,关键是解决在模型层面立体棋盘上坐标系及正负位移统一表示的问题。

一个半星期:编写初步的博弈树算法,可以实现人机对弈,但机器属于“防守型”的选手,只会防守,不会进攻,即使防守,高超的技艺也不会,虽然能抵挡一阵,但最终被人所击败。

一个半星期:暂时搁置AI,研究如何让立体棋盘旋转起来,走了许多弯路,主要是对投影中绕Z轴旋转的问题不很清楚,最后只实现了绕一个自由度的旋转,如不借助第三方控件,用silverlight实现三个自由度的旋转有一定的难度。

半个星期:回头改进AI,加入剪枝技术和新的模式,经过改进机器的棋艺果然有了很大提高,会主动进攻了,与之博弈,稍不留神就被他赢了。但这时却出现了一个奇怪的BUG,困扰了很久。。。。。。

如图所示:

 

在该棋局中,机器持白棋后行,很成功地断掉敌人的“双冲四”的阴谋,非常成功。

但接下来。。。。。。

 

 

却出现了黑棋活三,白棋竟然不知道断!

但这是最基本的常识,早已解决了,并验证通过了,为什么在这里却没有发现活三呢!

经过长期的调试,终于发现原来这并不是程序的问题,而是对五子棋的业务不够了解造成的。五子棋规则中明确给出了黑棋的禁手,用于抵销黑棋先行的优势。双活三,双活四等都属于禁手,若黑棋下了禁手,并被对方发现,反而判定为输。 这就避免了白棋很快被搞死。

五子棋禁手详见:http://www.gz6hs.cn/lzoi/goband/jinshouguize.htm

由于不知规则,将禁手作为规则编入程序,这就可以解释为什么机器连最起码的活三都不知道救了。

原来,在当前的情况下,白棋实际上是又向下考虑了一步:如果救了活三,黑棋最坏的情况是又做了一双活三,也是死棋(按照给他编程的逻辑),等死,还不如冒险做个白活三呢,如对方看不到,我就搞死他。。。。。。

看来五子棋里面有很多玄妙的地方,不像原先想象的大众都会玩的简单棋类,这就是它为什么也像围棋一样也分段位的原因吧。

转载于:https://www.cnblogs.com/MSRAvisitor/articles/1912540.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值