炮打洋鬼子创作总结

一、开发背景

本学期我一直在学习Android编程,为了巩固所学知识和提高自己的编程能力,我利用业余时间做了一个棋类的安桌小游戏。为了制作这个小游戏我花了两周熄灯之后的加班时间和周末自由活动时间。整个制作过程很辛苦,也遇到了很多困难。别人都在睡觉的时候,我却在学习室里默默的看代码,别人都在打游戏的时候,我却在痛苦的调试程序。但从中也确实学到了不少东西,比如深入研究了智能决策课程里讲的广度优先搜索算法,也更进一步理解了程序整体规划的重要性。

 

二、游戏介绍

这个游戏叫做炮打洋鬼子,也有的地方叫炮打小兵或狼吃小羊,是一个很偏的棋类小游戏,因为我问过很多人,很少有人听过这个游戏,更别提玩过了。小时候经常和伙伴们一起玩这个游戏,当时玩的可谓不亦乐乎。玩法很简单,两人对弈,一方为大炮,目的是把所有的鬼子打死。另一方为鬼子兵,目的是把大炮堵死。洋鬼子共有13个,只能上下左右一步一步的走。大炮总共有三门,可以上下左右一步一步的走,也可以隔一个空位打死一个洋鬼子。当大炮无路可走的时候就是洋鬼子赢了,当洋鬼子全部死光的时候就是大炮赢了。

    

我做的这款小游戏有三种玩法。第一种是两人对战,第二种是玩家用炮打洋鬼子,第三种是玩家用小兵把炮围死。具体的玩法很简单,先选子,点一下先中你要走的棋了,棋子有个黄圈围住时表示该棋子被选中。再走子,点一下要走的位置,如果着法正确则走棋成功。若着法不符合游戏规则,从新进入选子状态。

在这里要特别感谢一下张攀小童鞋,作为我的美工,帮了花了棋子,我感觉效果非常好,我非常喜欢。经过美化之后,我觉得这个游戏明显上了一个档次,看上去舒服多了。

                          

 

三、AI算法

棋类游戏开发最难的是什么?当然是怎么让电脑能够聪明的下棋。如何让电脑会下棋,专业的讲就是游戏的AI算法设计。游戏AI算法的好坏直接决定了电脑下棋的聪明程度,也直接决定了游戏的可玩度。而游戏的AI算法设计是棋类游戏最难的一部分也是最重要的一部分。所以我把这一部分单独列出来讲一下,因为我花一周多的时间都在写这个算法。如果这个算法详细地讲的话我可以再写一篇文章了,这里我只是简单的说说。

刚开始我用的是权值法,以前我写的五子棋游戏就是用的这个方法。原理很简单,就是为每一个可行落子点计算一个权值,这个权值的大小是根据周边的棋子布情况决定的。比如对炮来说,往棋盘的中间走要比往边界走要好,往周围都是洋鬼子的位置走应该不是一步好着法。可惜这种方法很不适合这个游戏,按照这个算法做出来的AI实在太笨了,智商在5岁以下,果断放弃。

这时我想到了在智能决策课程里王朝辉教员讲的广度优先搜索算法,虽然这门课我基本上是一路睡过来的,但半睡半醒的时候还是听了一点(呵呵…)。这种算法就是利用计算机强大的运算能力算出有限步内的所有着法,从中选出最好的一着进行走棋。以前我用深度优先搜索算法在Turbo C上写过一个搜索拼图游戏最优步法的一个程序,知道这个算法功能很强大,觉得能够解决这个问题。于是上网搜索了相关资料,发现原来很多棋类游戏的主要算法就是广度优先搜索算法。这个算法的原理就是模拟人走棋的方式。当我们思考该走哪一个位置的时候,往往是选择对自己最有利的位置。当然这个最有利的位置是根据我走这个位置之后,对方会走出对自己最不利的位置,然后自己先选择对自己有利的位置……。在棋类游戏中,一般的棋手能思考到3步之后的变化就比较牛了。这就是思考的步数。

广度优先搜索算法就是让计算机像人一样的思考,不仅思考范围比人广,而且思考深度也更深。什么才是最有利的着法,需要一个能对当前棋局形势有一个简单有效的量化的方法,在棋类AI算法里叫评估函数。评估函数的好坏也直接决定了算法的可行性和有效性。我设计的评估函数直接考虑了大炮的势力范围、鬼子兵的数量、死子这三个因素。大炮的势力范围是指第个炮棋子在三步内能走到的空位数量。鬼子兵的数量是指当前棋局里洋鬼子棋子的数量。死子是指在一步内能被大炮吃掉的洋鬼子的数量。这个评估函数达不到简单有效的要求,但是在我的能力范围内我也只能想到这种程度,希望有那位高人看到后希望不吝赐教,为我指点迷津。

经过我的测试目前这个AI只能计算到两步,因为再增加计算深度的话计算时间将超出一般人接受的范围(随着计算深度的增加计算量将进行指数级的增长),不过和它对战目前已经让我感觉有点吃力了。这个AI的智商还没有满足我的要求,下一步还要对其进行进一步的优化。在网上想找相关资料后发现还可以对这个算法进行alpha-beta剪枝优化,不过研究了半天还没有搞的太明白。以后有能力和时间再慢慢研究吧。

 

四、总结

目前游戏功能很简单也很单一,很多游戏效果和游戏功能都没有实现。比如游戏没有悔棋功能,没有计时,没有难度选择等等。现在就把他发布出来貌似有点为时过早,暂且把它定为一个试玩版吧。我主要想看看大家对它的反应怎么样,如果有一个人说这游戏做的还有点意思,都将给我带来莫大的鼓舞和动力,我会把它接着完善下去。如果没有一个人甩我,可能说明我确实不适合干这种技术活,还是老老实实站岗扫地叠被子吧(哈哈)。

 

维基百科对炮打洋鬼子游戏的定义是:

炮打洋鬼子,在山东称 炮轰洋毛子 、大炮打洋人 、洋炮专打鬼子兵 ,在邯郸称为 抗日棋、 中国打日本,其他地有 鬼子大炮 、大炮轰小兵 、 小兵摆大炮 、大炮攻小兵等称呼,是流传于山东、河北邯郸一带的两人棋类,摆设类同狼吃小孩儿、长毛围官兵,但吃法不同。

棋具

棋盘为五横五竖的横纵线交叉,组成共二十五个棋点。

分为两方:

洋人方:有十五枚称为洋人的棋子。

大炮方:有三枚称为大炮的棋子。

规则

初始布置为洋人棋子皆放离己方最近的三横线;大炮棋子放在己方最近的底横线与第二、三、四纵线的交点。

一人一著。

每回合大炮方能选择以下两种行动之一:

移子:沿线一步至空棋点。

吃子:沿线移动两步,将同线隔一空邻点的敌棋移出棋盘。

每回合洋人仅能沿线一步至空棋点。

大炮方以消灭洋人所有棋子获胜。

洋人方以让所有大炮棋不能移动获胜。