陆战军旗

2010-4-7

army

AI版(AI很笨):http://cnbang.net/army

前言

小时候玩的棋类游戏中,军旗算是玩得比较多的,接下来就是跳棋了。不知有多少年没碰过军旗,上次偶然在姐家下了一盘,挺怀念的,网上查了一下,四国军棋是挺多,但我们的玩法是不断翻开盖住的棋子的,据说这叫翻翻棋,边锋游戏有,下载后发现不咋地,应该是十几年前做的了,我想自己做一个网页版的。奇怪怎么这么久还没有大型的网页版的棋牌游戏,总比QQ游戏方便很多吧。

前期

前期得先把棋盘画好,定好棋子在上面的走动规则。话说这棋盘画得我自己挺满意的,呵,高仿真啊,我是把棋盘拍照下来照着画的,不过缺点是高度太大了,对于小电脑一个屏幕可能还看不到整个棋盘。棋子就不咋地,很一般,不过想换肤很容易。

程序的实现方面,这次我还是用了jquery,本来想用YUI练习下的,但发现YUI本来就不适合用来做这样的游戏,只适合用于分模块构建中大型网站,另外它没有在dom里保存data的功能,所以还是用回jquery。

联机对战版

一开始只想做联机对战版,做联机对战再怎样都得要有VPS自己配置环境才可以放在网上用,我没VPS,所以一开始就没打算将它做成一个真正投入使用的游戏,只是练习练习。查了一些资料,似乎用FLASH的socket好一点,但这次不太想用FLASH,webQQ这些可以直接在网页上通信,想试试这方面的。

了解了comet和cometd这个框架,配环境配了很久才搞定,cometd真是很简单方便,联机对战那一块很快就写好,java代码一个字都不用写,直接js跟js通信了。

实现了最简单的联机对战后,设想着给房间几百个座位互不影响,还要处理各种各样的网络问题的,例如突然断线其中一方保存棋局连上后再发送,似乎双方下棋过程中除了棋子移动的通信还得不断发送另一个消息检测对方是否断线,不知QQ游戏是怎样的,对comet来说要这么不断发消息似乎太耗资源了。

基本的实现了,其他的是处理真正使用时出现的问题,都没机会放上去使用,就没动力做下去了,暂停了。

可以在这看到源码http://code.google.com/p/bangswork/source/browse/#svn/trunk/army/Army-Cometd

AI版

停了联机版后闲着就想尝试下做这个游戏的AI,似乎高智商的AI难做,但低智商的AI还是挺好做的,于是想尽力做做看,算法是我一直不擅长的,能做到啥程度就啥程度,就当玩玩~

了解了极大极小值算法,alpha-beta剪枝,就差不多了,动手做,先整理代码为AI做准备,再写AI,算法很快写出来,也成功运行了,但就是有逻辑上的错误,AI棋步跟预想不一样,接下来的debug就痛苦了,由于是递归搜索树,调试我都不知道怎么调,一输出来就一大串东西,只能一遍遍检查代码了,整个AI的代码从头到尾看了应该有十几遍,找到了一些错误,改正了。

现在没发现什么错误了,但电脑棋步还是经常不合理,可能是评估函数和搜索层数的关系了,现在搜索到4层浏览器就有点受不了,默认是只搜索3层了。查错查到挺累的,现在AI智商偏低,但不太想继续做下去了。

AI计算过程中会出现停滞,曾想过用setTimeout解决画面停滞问题的,但它似乎只适合用于大数据量的迭代,不适合用于递归,想半天没想出来怎么把每次递归用setTimeout排队执行,没办法。递归的优化中有个缓存的方法,但这个棋局的递归没有相同的值,无法用这缓存,于是想试试web workers,实现后在firefox效果不错,但在chrome/safari就没法用了,因为要传整个棋盘作为参数,这两个浏览器只能传字符串作为参数。目前只在Firefox3.5以上版本开启web workers,其他浏览器运行起来可能会有点卡。

最后

这次做的这个算是纯学习性的东西了,联机对战版无法投入使用,做的这个AI版似乎也没啥意义,just for fun~~

评论

2010年4月7日 13:48

玩了一盘,赢了~

2010年4月7日 14:11

玩了一盘,输了。

2010年4月7日 16:17

做联机版确实不容易,首先是处理comet的网络连接,之后就是服务端逻辑,网上有个用erlang实现的openpoker开源联机游戏服务端例子,不过即使用erlang这种专门面向并发的语言来写,服务端也有很大的工作量。网络这块用websocket来处理会少一些工作量。 我写了个websocket连twitter stream api的测试例子,实现起来很简单,http://is.gd/bif42 ,chrome only。

2010年4月7日 22:52

怀念~~~~~~~

2010年4月10日 17:25

真棒,要是把棋盘改一种颜色,和红方棋子区分就更好了。

2010年4月10日 21:10

暗棋。。。。。

2010年10月28日 20:25

玩了一盘,虽然是实验作品还是很给力的啊,不过最后出现bug:敌方唯一可行动棋子被两颗地雷和我方占据的行营夹在中间,然后轮到我方时无法行动,如图http://cyca.info/x/jqbug.png(我方为红子)
再提两个建议
1.最好能提示上一步的动做,比如刚翻开或者移动的子闪动一下,不然动作太快了
2.然后如果能提供悔棋功能就好了哈哈~