STM32实现2048小游戏

简介: 笔记

一. 前言


在我们的DIY套件上,终于集成了第三个小游戏----2048。怎么感觉做成了个游戏机呢(#.#)。

这款游戏也是非常流行的,玩起来也是非常的轻松,要想过关的话,还是需要一点的技巧。

欢迎关注 微信公众号 FPGA之旅 回复 stm32实现2048 获取文件


链接:

演示视频


二. 游戏规则简介


游戏地图为 4 * 4。

每次移动所以方块都会向指定的方向移动,同时会在地图上随机生成值为2或者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[i] && Map[j] != 0)
    break;
  //如果有相等的两个方块,且中没有其余方块,进行融合
  if (Map[j] == Map[i])
  {
    Map[j] = 0; //先将这方块消除掉
    unsigned char k;
    for (k = i + 1; k < 3; k++)
    {
      Map[k] = Map[k + 1]; //移动一次方块
    }
    Map[i] += Map[i];//更新融合后的方块的值
    Map[3] = 0;
    flag = 1;
    break;
  }
}

3.移动所有方块,直到所有方块都靠在一起

while (1)
{
  int j, flag = 0;
  for (i = 0; i < 3; i++)
  {
    if (Map[i] == 0) //有空的方块,说明可以移动
    {
      Map[i] = 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.测试结果展示

11.png

完整测试代码

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[i]);
  printf("\n");
  for (i = 0; i < 3; i++)
  {
    unsigned char j;
    for (j = i + 1; j < 4; j++)
    {
      //如果不为0,且当前选择的值也不为0,且和这个数不相等,则跳过
      if (Map[j] != Map[i] && Map[j] != 0)
        break;
      //如果有相等的两个方块,且中没有其余方块
      if (Map[j] == Map[i])
      {
        Map[j] = 0;
        unsigned char k;
        for (k = i + 1; k < 3; k++)
        {
          Map[k] = Map[k + 1];
        }
        Map[i] += Map[i];
        Map[3] = 0;
        flags = 1;
        break;
      }
    }
      while (1)
      {
        int j, flag = 0;
        for (i = 0; i < 3; i++)
        {
          if (Map[i] == 0)
          {
            Map[i] = 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[i]);
      printf("\n");
  }
  return flags;
}

公众号:FPGA之旅

目录
相关文章
基于STM32设计的拼图小游戏
基于STM32设计的拼图小游戏
226 0
基于STM32设计的拼图小游戏
|
7月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
529 2
|
6月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
933 0
|
8月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
7月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
566 4
|
7月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
885 2
|
7月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
314 1
|
7月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
728 1
|
6月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
241 0