上一节中,我们已经成功的将卡牌添加到了游戏中,但只是显示在了界面上,并没有保存下来。我们在GameView中定义一个二维数组用来保存游戏界面的卡牌。
接下来,我们需要将初始化时候添加的卡片添加到cardMap数组中,如下图所示:
这样一来,我们就将游戏界面记录下来了。
但是上一节中,我们一下子就生成了16张卡片,这和平时游戏的时候不一致。而且我们只能生成卡片2。为了改进它,我们可以定义一个函数addRandomNumber,表示每次生成的数字(这里我们设置生成2和4的概率为9:1):
这里用到了一个emptyPoints变量,我们需要定义如下:
除此之外,我们还看到在上面的程序中,我们使用0表示空点,但是我们并不希望0显示在我们的游戏中,因此修改Card类的SetNumber函数如下:
同时,我们需要修改GameView中的addCards函数,使得一开始都生成空点:
接下来,我们可以开始游戏了,首先定义一个startGame函数,同时在onSizeChanged事件中调用它,如下图所示:
同时,定义startGame函数如下图所示:
运行查看结果,如下图所示:
接下来,我们需要实现游戏的逻辑,也就是方块的合并。我们需要操作MoveLeft等四个函数。如下图所示:
接下来的三个方向的移动只需要对上面的代码进行稍微修改即可,MoveRight如下图所示:
MoveUp函数如下图所示:
MoveDown函数如下图所示:
至此,我们的移动功能已基本完成,测试如下:
最后,我们来完成积分的模块,每次操作得分都等于合并方块的数字之和。切换到MainActivy类,添加以下代码以获取tvScore这个标签:
接下去,为了能够在外界操作MainActivy中的tvScore,我们修改代码如下:
最后添加计分变量以及相关的操作函数:
接下去,切换到GameView中,将下面的代码添加到四个移动操作的相应位置:
接下来,我们需要在开始的时候清空分数:
运行测试:
接下去,我们需要在每次操作后都添加新的卡片:
其它三种情况请读者自行根据上述代码进行修改。测试结果如下图所示:
最后,我们还需要判断游戏是否结束。游戏结束的条件是没有空位并且无法继续合并。定义一个函数checkGame,如下图所示,并且在所有移动后添加新卡片时都调用一次:
checkGame函数实现如下:
至此,游戏的基本框架都已经全部完成,我们将在下一节中介绍分数的保存以及界面的美化。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。