文章目录

  • 一、简介
  • 二、硬件资源
    • 1.硬件准备
    • 2.硬件连接
  • 四、软件设计
    • 1.软件结构
    • 2.主要代码
  • 五、实验现象

一、简介

本项目支持STM32F103/STM32F407控制器,使用TFTLCD触摸屏、按键、LED等。

项目功能:
系统运行后,TFTLCD触摸屏显示2048游戏界面,通过4个按键KEY_UP、KEY1、KEY2和KEY0控制游戏的四个方向上下左右。当得到2048数字后游戏通关,当屏幕数字填满或出现无法移动,可按复位键重新开始。
知识点:C语言二维数组、游戏算法等


二、硬件资源

1.硬件准备

项目所需要的硬件资源如下:
①STM32F103或STM32F407开发板1个
②TFTLCD液晶模块1个
③USB线1条(用于供电和程序下载)
④杜邦线若干

2.硬件连接

 TFTLCD触摸屏模块-->单片机IO按键模块-->单片机IOKEY_UP-->PA0KEY0-->PE4KEY1-->PE3KEY2-->PE2

四、软件设计

1.软件结构

2.主要代码

主要代码如下:

//游戏界面行列数
#define N               4   //行列数
#define GRID_SIZE       67  //格子的宽度和高度
#define INTERVAL        10  //格子间的间隔
#define Y_START_SHOW    70  //存储数据的数组
int grid[N][N];
int D=0;
int M=2048;//随机数种子
u32 gtime_cnt=0;//不同数字的颜色
u16 gcolor[12]={LGRAY,BLUE,BRED,GRED,GBLUE,RED,MAGENTA,GREEN,CYAN,YELLOW,BROWN,BRRED};//移动相加,返回1表示有移动,返回0表示无移动
int add(void)
{int i,j,cr,w,F=0;if(D==1)//top{for(i=1;i<N;i++)for(j=0;j<N;j++){cr=i;w=0;//0未合并,1合并过while(cr>=1 && grid[cr][j]!=0){if(grid[cr-1][j]==0)//上方有空位,上移{grid[cr-1][j]=grid[cr][j];grid[cr][j]=0;F=1;}else//上方无空位{if(grid[cr-1][j]==grid[cr][j] && w==0)//相等,相加{grid[cr-1][j]=grid[cr-1][j]*2;grid[cr][j]=0;w=1;F=1;}else//不等{break;}}cr--;}}}else if(D==2)//Down{for(i=N-2;i>=0;i--)for(j=0;j<N;j++){cr=i;w=0;//0未合并,1合并过while(cr<=N-2 && grid[cr][j]!=0){if(grid[cr+1][j]==0)//下方有空位,下移{grid[cr+1][j]=grid[cr][j];grid[cr][j]=0;F=1;}else//下方无空位{if(grid[cr+1][j]==grid[cr][j] && w==0)//相等,相加{grid[cr+1][j]=grid[cr+1][j]*2;grid[cr][j]=0;w=1;F=1;}else//不等{break;}}cr++;}}}else if(D==3)//left{for(i=1;i<N;i++)for(j=1;j<N;j++){cr=j;w=0;//0未合并,1合并过while(cr>=1 && grid[i][cr]!=0){if(grid[i][cr-1]==0)//左方有空位,左移{grid[i][cr-1]=grid[i][cr];grid[i][cr]=0;F=1;}else//左方无空位{if(grid[i][cr-1]==grid[i][cr] && w==0)//相等,相加{grid[i][cr-1]=grid[i][cr-1]*2;grid[i][cr]=0;w=1;F=1;}else//不等{break;}}cr--;}}}else if(D==4)//right{for(i=0;i<N;i++)for(j=N-2;j>=0;j--){cr=j;w=0;//0未合并,1合并过while(cr<=N-2 && grid[i][cr]!=0){if(grid[i][cr+1]==0)//右方有空位,右移{grid[i][cr+1]=grid[i][cr];grid[i][cr]=0;F=1;}else//右方无空位{if(grid[i][cr+1]==grid[i][cr] && w==0)//相等,相加{grid[i][cr+1]=grid[i][cr+1]*2;grid[i][cr]=0;w=1;F=1;}else//不等{break;}}cr++;}}}return F;
}//初始化
void init(void)
{u8 i=0;//设置随机数种子srand(gtime_cnt);//随机产生2个数,并且放到数组里面去for(i=0;i<2;i++){randomdata();}//    grid[0][0]=1024;
}//绘制
void showdata(void)
{u8 i=0;u8 k=0;for(i=0;i<N;i++){for(k=0;k<N;k++){//把每个格子左上角的坐标求出int x=k*GRID_SIZE+(k+1)*INTERVAL;int y=i*GRID_SIZE+(i+1)*INTERVAL;//grid[i][k]=2048=2^11int index=grid[i][k] ? log((double)grid[i][k])/log(2) : 0;//设置格子颜色LCD_Fill(x,y+Y_START_SHOW,x+GRID_SIZE,y+GRID_SIZE+Y_START_SHOW,gcolor[index]);//输出文字if(grid[i][k]){LCD_ShowxNum(x,y+Y_START_SHOW+15,grid[i][k],4,32,1);}}}
}//蜂鸣器提示
void beep_alarm(void)
{BEEP=1;delay_ms(50);BEEP=0;
}//2048游戏设计
void app_demo(void)
{char c;int mov,key,isf;BEEP_Init();KEY_Init();LED_Init();TIM4_Init(500-1,7200-1);  //定时50ms
//  My_EXTI_Init();TFTLCD_Init();TP_Init();LCD_ShowString(10+60,10,tftlcd_data.width,tftlcd_data.height,32,"2048");LCD_ShowFontHZ(10+4*16+60,10,"游戏设计");init();showdata();while(1){  key=getKey();//读取操作键if(key==0)continue;//不是上下左右键,重新读取键盘mov=add();//根据方向键合并相加,返回1表示有移动if(mov==1)showdata();//显示if(getMax()==M)//判断是否胜利{printf("你赢了!\n");LCD_ShowString(10,400,tftlcd_data.width,tftlcd_data.height,32,"You WIN!      ");LCD_ShowString(10,440,tftlcd_data.width,tftlcd_data.height,24,"Reset Start...");while(1);//循环}isf=isNotFull();//返回1表示还有空位if(isf==1 && mov==1)//有空位且有移动再随机{randomdata();//再随机showdata();//显示}if(isf==0)//没有空间则游戏结束{if(canAdd()==1){printf("请选择另一个方向滑动!\n");LCD_ShowString(10,440,tftlcd_data.width,tftlcd_data.height,24,"Select Dir...");}    else{printf("游戏结束\n");LCD_ShowString(10,400,tftlcd_data.width,tftlcd_data.height,32,"Game OVER!");LCD_ShowString(10,440,tftlcd_data.width,tftlcd_data.height,24,"Reset Start...");while(1);}  }}
}

五、实验现象

B站演示视频:https://space.bilibili.com/444388619

【STM32单片机】2048游戏设计相关推荐

  1. STM32单片机扫雷游戏TFT触摸操作单片机小游戏

    实践制作DIY- GC0015-怀旧扫雷小游戏 一.功能说明: 基于STM32单片机设计-扫雷游戏 功能介绍: 1.基于STM32F103R系列单片机,2.4寸电阻触摸屏,24c02存储器,. 2.1 ...

  2. 基于stm32单片机的电子称设计

    基于stm32单片机的电子称设计 **==完整论文和程序关注我获取==** 摘要 关键字 1 绪论 2 系统硬件方案设计 2.1系统总体设计方案比较与论证 2.2系统元器件选型及器件参数介绍 2.2. ...

  3. 基于android的2048游戏设计,基于Android平台的2048游戏设计与开发.docx

    基于Android平台的2048游戏设计与开发 高级操作系统论文(设计) 题 目 基于Android个人2048 小游戏的设计与开发姓 名 学 号 院. 系 信息学院 专 业 指导教师 职称(学历)目 ...

  4. STM32单片机小游戏触摸屏打地鼠2.8寸TFT液晶显示屏计分和关卡

    实践制作DIY- GC0075-单片机小游戏打地鼠 一.功能说明: 基于STM32单片机设计-单片机小游戏打地鼠 功能介绍: 硬件组成:STM32F103RCT6最小系统+2.8寸TFT电阻触摸屏+2 ...

  5. 基于stm32单片机的信号发生器设计

    硬件方案 硬件主要由stm32单片机核心板+LCD1602液晶显示屏+LM358运算放大电路+DAC0832数模电路+TL431基准参考电压电路+ICL7660稳压电路+按键电路等构成:如图: 设计功 ...

  6. 85、基于STM32单片机烟雾温度报警器设计火灾防火检测可燃气体监测系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.程序源码 六.资料包括 摘要 本设计采用使用STM32F103作为控制器件,MQ-2型 ...

  7. 基于python的2048游戏设计_用python写一个2048游戏

    self.randomGenerateNumberself.randomGenerateNumber 然后,当玩家按下方向键(↑↓←→)时,这个二维列表要根据玩家的操作指令进行更新,主要分为两个部分: ...

  8. 基于python的2048游戏设计_Python经典练习,游戏2048实现思路

    今天教大家弄一个Python版-控制台的2048,正好熟悉下Python语法,程序运行效果如下: 程序代码加上注释大概150行左右,利用了一些Python内置数据类型的操作节省了不少代码量.下面说说我 ...

  9. 嵌入式学习板开发:STC单片机扑克游戏设计(C语言)

    作品介绍 <扑克大师>是一款可玩性高.趣味性强的1V1棋牌游戏.游戏引入"送牌"."抽牌"."改牌"等全新扑克玩法,并保留了&q ...

最新文章

  1. Linux用户必须知道的常用终端快捷键
  2. docker容器相关
  3. ios打包报错:User interaction is not allowed
  4. select/poll原理(阻塞挂起) 正常(阻塞轮询)
  5. leetcode 279 四平方定理
  6. 三月磨一剑---也来晒晒我们的开发产品 欢迎拍砖
  7. c语言全局变量默认值
  8. AndroidStudio3.0多渠道打包
  9. java base64转Binary
  10. numpy 常见 用法 取自np100题
  11. CTF 内存取证 USB流量分析
  12. 电脑bios进入方法介绍
  13. “库存商品”和“原材料”科目的使用区别?
  14. kubectl源码分析之rollout undo
  15. 服务器怎么用固态盘安装系统,服务器使用固态盘安装
  16. IDEA将项目打包成jar包
  17. VScode任务栏图标异常
  18. 为什么黑客不攻击支付宝?
  19. 1970-01-01是什么?为什么计算机起始时间是1970年1月1日
  20. python使用级数pi的近似值_π近似莱布尼兹级数

热门文章

  1. (附源码)ssm基于SSM的南昌旅游网站管理系统设计与实现 毕业设计 101407
  2. CSSStyleSheet 对象(css 样式表)- 你不知道的有趣功能
  3. oppo通知栏的那些事儿(如何分析系统级应用)
  4. java 并口打印_linux 下java的串口,并口开发(RXTXcomm.jar)
  5. 5G成互联网大会最热关键词!
  6. BeeHive原理解析
  7. iOS大型项目解耦方案有难度?BeeHive设计优化来帮助
  8. 对于\n冲刷缓冲区,对Linux中fork()函数的理解
  9. 滴滴导航若干关键功能的技术突破与实践
  10. 配置阿里云的CDN加速