大伙儿晚上今天得空,想跟各位聊聊我最近瞎捣鼓的一个小玩意儿——一个国际象棋游戏。这玩意儿说难不难,说简单也真不简单,反正我是折腾了好一阵子,今天就把这过程给大伙儿说道说道。
一切的开始:棋盘和棋子
最开始嘛总得有个棋盘不是?国际象棋那棋盘,大家都晓得,8x8的格子,一共64个,黑白相间的。我寻思着这玩意儿用代码画出来应该不难,就先弄了个二维数组来表示棋盘,每个格子要么是空的,要么放个棋子。颜色交替这个好办,循环的时候判断一下行号列号是奇数还是偶数就行了。对,还有个规矩,就是摆棋盘的时候,右下角那个格子必须是白色的。这个细节一开始我还真给忽略了,后来查了下资料才加上。
棋盘弄好了,就该上棋子了。每边16个棋子,浩浩荡荡一大堆:
- 1个国王 (就是那个最重要的,被将死了就输了的)
- 1个皇后 (最厉害的那个,满场飞)
- 2个车 (跟中国象棋的车差不多,直来直去)
- 2个马 (走日字的,这个得特别注意,能蹩脚,不,是能跳过其他棋子)
- 2个象 (只能斜着走,跟咱们的象可不一样)
- 8个兵 (小卒子,但人家到底线能变身,厉害着)
摆放这些棋子也是有讲究的。兵卒子们都站在最前面一排,也就是第二排和第七排。后面那排,俩车分别在两个角上,然后是马,再是象。中间俩位置,留给国王和皇后。这里还有个小窍门,就是白棋的皇后在白格,黑棋的皇后在黑格,这样国王和皇后就不会放反了。我一开始还真没注意这个,随便一摆,后来发现不对劲,查了才知道。
让棋子动起来:规则是真多
棋盘棋子都就位了,接下来就是重头戏——让它们动起来。这可把我给折腾得够呛,每个棋子的走法都不一样,得一个个写逻辑。
国王:这家伙最金贵,所以走得也小心翼翼,一次只能往任何方向走一格。而且他还不能自己走进被对方攻击的格子里,不然就是送人头了。
皇后:皇后可就厉害了,横着、竖着、斜着,想走多远走多远,只要中间没挡路的。写她逻辑的时候,基本上就是把车和象的走法合一起了。
车:车就简单多了,横平竖直,跟咱们中国象棋的车一样,没啥花里胡哨的。
马:马走日,这个“L”形走法,往前两格再拐一格,或者往前一格再拐两格。关键是马能“跳”过别的棋子,这个在判断的时候得特别处理,不能像其他棋子一样被挡住。
象:象只能斜着走,而且也是想走多远走多远,只要不被挡路。白格象永远在白格,黑格象永远在黑格,一辈子不串门。
兵:小兵看着不起眼,规矩可不少。第一步可以走一格,也可以走两格。之后就只能一步一步往前挪。吃子的时候是斜着吃,跟它前进的方向不一样。还有什么“吃过路兵”、“升变”(就是兵走到对方底线可以变成皇后、车、马、象中的任何一个,通常都变皇后),这些特殊规则写起来真是头大。
判断输赢和逻辑的考验
光让棋子动起来还不行,得有输赢判断。核心就是“将军”和“将死”。
每次棋子移动后,我都得检查一下,看是不是“将军”了对方的国王。如果是,就得提示。如果对方的国王被“将军”,而且没有任何一步棋可以让他摆脱被将军的状态(比如躲开、干掉将军的棋子、或者用其他棋子挡住),那就是“将死”了,游戏结束。
除了“将死”,还有“和棋”的情况。比如“逼和”,就是轮到一方走棋,但他的国王没被将军,可又无路可走,所有棋子都被堵死了或者动了就会导致国王被将军,这种也算和棋。还有什么双方同意和棋、三次重复局面、五十回合规则啥的,这些我一开始没做得太细,先把核心的“将死”给弄明白了。
实现这些逻辑,就是不停地写判断条件。比如判断一个格子是否被对方攻击,我就得遍历对方所有棋子,看它们按规则能不能走到这个格子上。这计算量,有时候还真不小。
的小结
前前后后,从搭架子到写规则,再到反复测试,真是花了不少功夫。特别是那些特殊规则,比如王车易位(国王和车一起动,一步棋完成俩动作),还有兵的升变,这些细节特别容易出bug。我就经常遇到马走出棋盘外,或者兵走到头了不知道该咋办的情况。
捣鼓这些东西虽然费劲,但看着自己写的代码能让这些小棋子在屏幕上按照国际象棋的规矩跑起来,心里还是挺有成就感的。我这只是个基础版,没有酷炫的界面,更没有啥人工智能对手,就是能让两个人对着电脑下下棋而已。但不管怎么说,也算是把这个想法给实现了。
今天就先分享到这儿,算是个实践记录,希望能给同样喜欢瞎折腾的朋友一点点小启发。以后有啥新玩意儿再跟大伙儿汇报!