你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32实现2048小游戏

[复制链接]
STMCU小助手 发布时间:2022-8-20 17:00
一. 前言
在我们的DIY套件上,终于集成了第三个小游戏----2048。怎么感觉做成了个游戏机呢(#.#)。
这款游戏也是非常流行的,玩起来也是非常的轻松,要想过关的话,还是需要一点的技巧。

二. 游戏规则简介
1.游戏地图为 4 * 4。
2.每次移动所以方块都会向指定的方向移动,同时会在地图上随机生成值为2或者4的方块。
3.在移动的过程中,如果相邻的两个方块的值一样,那么它们就会融合成一个值为它们之合的方块,每一次移动,只能进行一次融合。
4.如果方块中的值为2048,则游戏胜利。如果整个地图都被方块添满了,则游戏失败。
三. 核心代码介绍
方块的随机生成,和胜利的判断的实现都较为容易。整个游戏的核心部分为第三点,方块的移动和融合,这个部分如果弄懂了的话,整个游戏实现起来会非常容易。
先在Visual Studio实现这一过程的准确性,然后在搬运到keil中去,这一方便debug发现问题。

这里先合并,后移动

1.通过定义一个长度为4的数组,来模拟一行数据。
  1. int Map[4] = { 0,8,0,8 };
复制代码

2.通过循环来找到可以合并的两个数,将其合并
  1. for (j = i + 1; j < 4; j++)
  2. {
  3.         //如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过
  4.         if (Map[j] != Map&& Map[j] != 0)
  5.                 break;

  6.         //如果有相等的两个方块,且中没有其余方块,进行融合
  7.         if (Map[j] == Map)
  8.         {
  9.                 Map[j] = 0; //先将这方块消除掉
  10.                 unsigned char k;
  11.                 for (k = i + 1; k < 3; k++)
  12.                 {
  13.                         Map[k] = Map[k + 1]; //移动一次方块
  14.                 }
  15.                 Map += Map;//更新融合后的方块的值
  16.                 Map[3] = 0;
  17.                 flag = 1;
  18.                 break;
  19.         }
  20. }
复制代码

3.移动所有方块,直到所有方块都靠在一起
  1. while (1)
  2. {
  3.         int j, flag = 0;
  4.         for (i = 0; i < 3; i++)
  5.         {
  6.                 if (Map == 0) //有空的方块,说明可以移动
  7.                 {
  8.                         Map = Map[i + 1];
  9.                         Map[i + 1] = 0;
  10.                 }
  11.         }
  12.         for (j = 0; j < 3; j++)
  13.         {
  14.                 if (Map[j] == 0)
  15.                 {
  16.                         int k;
  17.                         for (k = j + 1; k < 4; k++)
  18.                         {
  19.                                 if (Map[k] != 0) //判断是否继续移动
  20.                                 {
  21.                                         flag = 1;  
  22.                                         break;
  23.                                 }
  24.                         }
  25.                 }
  26.         }
  27.         if (flag == 0)
  28.                 break;
  29. }
复制代码

4.测试结果展示

9cad061d212f444caed06d6622767e14.png
8d7b5600bc62482b922541dd76d91e60.png

8dd60d7867084c48b240887a90cf5531.png

18f931e61ce14bf0989fbb4f935d9c4f.png

完整测试代码


  1. int main(void)
  2. {
  3.         int Map[4] = { 0,2,4,8};
  4.         int i,flag = 0;
  5.         int flags = 0;
  6.         for (i = 0; i < 4; i++)
  7.                 printf("%d\t", Map);
  8.         printf("\n");

  9.         for (i = 0; i < 3; i++)
  10.         {
  11.                 unsigned char j;
  12.                 for (j = i + 1; j < 4; j++)
  13.                 {
  14.                         //如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过
  15.                         if (Map[j] != Map && Map[j] != 0)
  16.                                 break;

  17.                         //如果有相等的两个方块,且中没有其余方块
  18.                         if (Map[j] == Map)
  19.                         {
  20.                                 Map[j] = 0;
  21.                                 unsigned char k;
  22.                                 for (k = i + 1; k < 3; k++)
  23.                                 {
  24.                                         Map[k] = Map[k + 1];
  25.                                 }
  26.                                 Map += Map;
  27.                                 Map[3] = 0;
  28.                                 flags = 1;
  29.                                 break;
  30.                         }
  31.                 }
  32.                
  33.                         while (1)
  34.                         {
  35.                                 int j, flag = 0;
  36.                                 for (i = 0; i < 3; i++)
  37.                                 {
  38.                                         if (Map == 0)
  39.                                         {
  40.                                                 Map = Map[i + 1];
  41.                                                 Map[i + 1] = 0;
  42.                                         }
  43.                                 }
  44.                                 for (j = 0; j < 3; j++)
  45.                                 {
  46.                                         if (Map[j] == 0)
  47.                                         {
  48.                                                 int k;
  49.                                                 for (k = j + 1; k < 4; k++)
  50.                                                 {
  51.                                                         if (Map[k] != 0)
  52.                                                         {
  53.                                                                 flag = 1;
  54.                                                                 break;
  55.                                                         }
  56.                                                 }
  57.                                         }
  58.                                 }
  59.                                 if (flag == 0)
  60.                                         break;
  61.                         }
  62.                         for (i = 0; i < 4; i++)
  63.                                 printf("%d\t", Map);
  64.                         printf("\n");
  65.                
  66.         }
  67.         return flags;
  68. }
复制代码





收藏 评论0 发布时间:2022-8-20 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版