2048游戏制作过程(Java描述):第四节、游戏逻辑

上一节中,我们已经成功的将卡牌添加到了游戏中,但只是显示在了界面上,并没有保存下来。我们在GameView中定义一个二维数组用来保存游戏界面的卡牌。

4-1 Card

接下来,我们需要将初始化时候添加的卡片添加到cardMap数组中,如下图所示:

4-2 界面记录这样一来,我们就将游戏界面记录下来了。

但是上一节中,我们一下子就生成了16张卡片,这和平时游戏的时候不一致。而且我们只能生成卡片2。为了改进它,我们可以定义一个函数addRandomNumber,表示每次生成的数字(这里我们设置生成2和4的概率为9:1):

4-3 addRandomNumber

这里用到了一个emptyPoints变量,我们需要定义如下:

4-4 变量定义

 

除此之外,我们还看到在上面的程序中,我们使用0表示空点,但是我们并不希望0显示在我们的游戏中,因此修改Card类的SetNumber函数如下:

4-5 SetNumber

同时,我们需要修改GameView中的addCards函数,使得一开始都生成空点:

4-6 addCards

接下来,我们可以开始游戏了,首先定义一个startGame函数,同时在onSizeChanged事件中调用它,如下图所示:

4-7 onSizeChanged

同时,定义startGame函数如下图所示:

4-8 startGame

 

运行查看结果,如下图所示:

4-9 阶段性结果

接下来,我们需要实现游戏的逻辑,也就是方块的合并。我们需要操作MoveLeft等四个函数。如下图所示:

4-10 MoveLeft

接下来的三个方向的移动只需要对上面的代码进行稍微修改即可,MoveRight如下图所示:

4-11 MoveRight

MoveUp函数如下图所示:

4-12 MoveUp

MoveDown函数如下图所示:

4-13 MoveDown

至此,我们的移动功能已基本完成,测试如下:

4-13 阶段性结果

最后,我们来完成积分的模块,每次操作得分都等于合并方块的数字之和。切换到MainActivy类,添加以下代码以获取tvScore这个标签:

4-14 tvScore

接下去,为了能够在外界操作MainActivy中的tvScore,我们修改代码如下:

4-15 MainActivity

最后添加计分变量以及相关的操作函数:

4-16 Score

接下去,切换到GameView中,将下面的代码添加到四个移动操作的相应位置:

4-17 AddScore

 

接下来,我们需要在开始的时候清空分数:

4-18 初始化

运行测试:

4-19 阶段性结果

接下去,我们需要在每次操作后都添加新的卡片:

4-20 添加卡片

其它三种情况请读者自行根据上述代码进行修改。测试结果如下图所示:

4-21 阶段性结果

最后,我们还需要判断游戏是否结束。游戏结束的条件是没有空位并且无法继续合并。定义一个函数checkGame,如下图所示,并且在所有移动后添加新卡片时都调用一次:

4-22 checkGame

checkGame函数实现如下:

4-23 checkGame

至此,游戏的基本框架都已经全部完成,我们将在下一节中介绍分数的保存以及界面的美化。

1 条评论2048游戏制作过程(Java描述):第四节、游戏逻辑

  1. 非常详细的教程 谢谢博主
    有个问题想请教博主, 为何我添加了 MainActivity.getMainActivity().clearScore(); 这行之后,运行测试时出现了loop的状况。
    本应4X4的格子成了4XN,向下延伸至屏幕之外,每4X4格子里会有两个自动生成的号码这点还是对的。
    当我uncomment了这行之后如下:
    //MainActivity.getMainActivity().clearScore();
    运行测试,格子维持原来的4X4但是应用操作几次之后就会奔溃。琢磨了一下午还是没有头绪。
    先行谢过,后会有期。

发表评论