一. 前言
在我们的DIY套件上,终于集成了第三个小游戏----2048。怎么感觉做成了个游戏机呢(#.#)。
这款游戏也是非常流行的,玩起来也是非常的轻松,要想过关的话,还是需要一点的技巧。
二. 游戏规则简介
1.游戏地图为 4 * 4。
2.每次移动所以方块都会向指定的方向移动,同时会在地图上随机生成值为2或者4的方块。
3.在移动的过程中,如果相邻的两个方块的值一样,那么它们就会融合成一个值为它们之合的方块,每一次移动,只能进行一次融合。
4.如果方块中的值为2048,则游戏胜利。如果整个地图都被方块添满了,则游戏失败。
三. 核心代码介绍
方块的随机生成,和胜利的判断的实现都较为容易。整个游戏的核心部分为第三点,方块的移动和融合,这个部分如果弄懂了的话,整个游戏实现起来会非常容易。
先在Visual Studio实现这一过程的准确性,然后在搬运到keil中去,这一方便debug发现问题。
这里先合并,后移动
1.通过定义一个长度为4的数组,来模拟一行数据。
- int Map[4] = { 0,8,0,8 };
复制代码
2.通过循环来找到可以合并的两个数,将其合并
- for (j = i + 1; j < 4; j++)
- {
- //如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过
- if (Map[j] != Map&& Map[j] != 0)
- break;
- //如果有相等的两个方块,且中没有其余方块,进行融合
- if (Map[j] == Map)
- {
- Map[j] = 0; //先将这方块消除掉
- unsigned char k;
- for (k = i + 1; k < 3; k++)
- {
- Map[k] = Map[k + 1]; //移动一次方块
- }
- Map += Map;//更新融合后的方块的值
- Map[3] = 0;
- flag = 1;
- break;
- }
- }
复制代码
3.移动所有方块,直到所有方块都靠在一起
- while (1)
- {
- int j, flag = 0;
- for (i = 0; i < 3; i++)
- {
- if (Map == 0) //有空的方块,说明可以移动
- {
- Map = Map[i + 1];
- Map[i + 1] = 0;
- }
- }
- for (j = 0; j < 3; j++)
- {
- if (Map[j] == 0)
- {
- int k;
- for (k = j + 1; k < 4; k++)
- {
- if (Map[k] != 0) //判断是否继续移动
- {
- flag = 1;
- break;
- }
- }
- }
- }
- if (flag == 0)
- break;
- }
复制代码
4.测试结果展示
完整测试代码
- int main(void)
- {
- int Map[4] = { 0,2,4,8};
- int i,flag = 0;
- int flags = 0;
- for (i = 0; i < 4; i++)
- printf("%d\t", Map);
- printf("\n");
- for (i = 0; i < 3; i++)
- {
- unsigned char j;
- for (j = i + 1; j < 4; j++)
- {
- //如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过
- if (Map[j] != Map && Map[j] != 0)
- break;
- //如果有相等的两个方块,且中没有其余方块
- if (Map[j] == Map)
- {
- Map[j] = 0;
- unsigned char k;
- for (k = i + 1; k < 3; k++)
- {
- Map[k] = Map[k + 1];
- }
- Map += Map;
- Map[3] = 0;
- flags = 1;
- break;
- }
- }
-
- while (1)
- {
- int j, flag = 0;
- for (i = 0; i < 3; i++)
- {
- if (Map == 0)
- {
- Map = Map[i + 1];
- Map[i + 1] = 0;
- }
- }
- for (j = 0; j < 3; j++)
- {
- if (Map[j] == 0)
- {
- int k;
- for (k = j + 1; k < 4; k++)
- {
- if (Map[k] != 0)
- {
- flag = 1;
- break;
- }
- }
- }
- }
- if (flag == 0)
- break;
- }
- for (i = 0; i < 4; i++)
- printf("%d\t", Map);
- printf("\n");
-
- }
- return flags;
- }
复制代码
|