来蓝杰以来,自己独立做的第一个小游戏就是五子棋了,可以说花了点功夫,感悟也有一些,借这篇博客分享一下。
首先,五子棋有许多的参数如startx,starty,size,vline,hline……所以我们可以创建一个接口来存储这些数据参数,让其他类来实现这一接口。这样做有一好处就是如果以后想修改游戏数据就很方便。只需要在接口中改一次,并不用在类里面一个一个地修改了。
画棋盘棋子这些东西都很容易,我就不一一赘述了。当时我遇到的第一个问题是:如何把棋子下到交叉点上?这个其实很容易,我的方法是用你获取的x、y减去startx和starty,再对size求余数!这样,比较余数与二分之一size的大小来判断这颗棋子是前一个还是后一个交点。
交点的问题解决了,不过你又会发现,你下的始终是黑棋,要怎么样才能实现黑白交替下子呢?我的话是用了一个count的int型参数,作用是计数黑白,每成功下一颗棋子就count++一次,每一次下子之前都判断count是奇数还是偶数来决定下黑子还是白子。
新的问题又随之而来,黑白交替是实现了,但是在同一个位置却可以下多次棋子,这是不合实际的!于是我们应该一开始就用数组存储下子的情况(这里可以用一维数组也可以用二维数组),没下过的地方对应数组存储初始值0,下黑棋存1,下白棋存2(或者你也可以存储boolean类型,用true或false表示黑棋和白棋)。关于数组,我这里要多说几句。用二维数组的话,就只要用一个二维数组,第一二维分别存入xy坐标,数组内存0,1,2,这样的话有利于后面判断输赢的实现;用一维数组的话,这里要用两个一维数组,下标存第几步,数组内分别存xy坐标,而要表示黑子还是白子的话,就还要一个一维数组,之后的判断输赢,又要一个一维数组!总之我是用了4个一维数组,资源上是比较浪费的,但却有个隐藏的好处—便于悔棋和再来一局!总之,万法不离其宗吧,看你怎么选择。
最后,判断输赢。我有两种思路。第一,一个一个地遍历,从4个方向检查出五子相连;第二,从最后一次下子的地方开始向周围检测(后面做的黑白棋也是如此判断翻棋)。
对于悔棋,我用一维数组就很容易了,毕竟下标存的是步数,悔一次棋就将对应的步数的下标的数组内容归0即可~
五子棋是我做的第一个游戏,也是算做得比较认真的一个游戏了,毕竟是初期学习嘛。在做五子棋的过程中,我明白了写程序不要想着一蹴而就一步登天,而是应该一点一点来,问题是一个一个解决的,程序也是一点一点完善的,毕竟我们现在的水平不够,不能做到顾全大局。