【STM32单片机】2048游戏设计
文章目录
- 一、简介
- 二、硬件资源
- 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游戏设计相关推荐
- STM32单片机扫雷游戏TFT触摸操作单片机小游戏
实践制作DIY- GC0015-怀旧扫雷小游戏 一.功能说明: 基于STM32单片机设计-扫雷游戏 功能介绍: 1.基于STM32F103R系列单片机,2.4寸电阻触摸屏,24c02存储器,. 2.1 ...
- 基于stm32单片机的电子称设计
基于stm32单片机的电子称设计 **==完整论文和程序关注我获取==** 摘要 关键字 1 绪论 2 系统硬件方案设计 2.1系统总体设计方案比较与论证 2.2系统元器件选型及器件参数介绍 2.2. ...
- 基于android的2048游戏设计,基于Android平台的2048游戏设计与开发.docx
基于Android平台的2048游戏设计与开发 高级操作系统论文(设计) 题 目 基于Android个人2048 小游戏的设计与开发姓 名 学 号 院. 系 信息学院 专 业 指导教师 职称(学历)目 ...
- STM32单片机小游戏触摸屏打地鼠2.8寸TFT液晶显示屏计分和关卡
实践制作DIY- GC0075-单片机小游戏打地鼠 一.功能说明: 基于STM32单片机设计-单片机小游戏打地鼠 功能介绍: 硬件组成:STM32F103RCT6最小系统+2.8寸TFT电阻触摸屏+2 ...
- 基于stm32单片机的信号发生器设计
硬件方案 硬件主要由stm32单片机核心板+LCD1602液晶显示屏+LM358运算放大电路+DAC0832数模电路+TL431基准参考电压电路+ICL7660稳压电路+按键电路等构成:如图: 设计功 ...
- 85、基于STM32单片机烟雾温度报警器设计火灾防火检测可燃气体监测系统设计
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.程序源码 六.资料包括 摘要 本设计采用使用STM32F103作为控制器件,MQ-2型 ...
- 基于python的2048游戏设计_用python写一个2048游戏
self.randomGenerateNumberself.randomGenerateNumber 然后,当玩家按下方向键(↑↓←→)时,这个二维列表要根据玩家的操作指令进行更新,主要分为两个部分: ...
- 基于python的2048游戏设计_Python经典练习,游戏2048实现思路
今天教大家弄一个Python版-控制台的2048,正好熟悉下Python语法,程序运行效果如下: 程序代码加上注释大概150行左右,利用了一些Python内置数据类型的操作节省了不少代码量.下面说说我 ...
- 嵌入式学习板开发:STC单片机扑克游戏设计(C语言)
作品介绍 <扑克大师>是一款可玩性高.趣味性强的1V1棋牌游戏.游戏引入"送牌"."抽牌"."改牌"等全新扑克玩法,并保留了&q ...
最新文章
- Linux用户必须知道的常用终端快捷键
- docker容器相关
- ios打包报错:User interaction is not allowed
- select/poll原理(阻塞挂起) 正常(阻塞轮询)
- leetcode 279 四平方定理
- 三月磨一剑---也来晒晒我们的开发产品 欢迎拍砖
- c语言全局变量默认值
- AndroidStudio3.0多渠道打包
- java base64转Binary
- numpy 常见 用法 取自np100题
- CTF 内存取证 USB流量分析
- 电脑bios进入方法介绍
- “库存商品”和“原材料”科目的使用区别?
- kubectl源码分析之rollout undo
- 服务器怎么用固态盘安装系统,服务器使用固态盘安装
- IDEA将项目打包成jar包
- VScode任务栏图标异常
- 为什么黑客不攻击支付宝?
- 1970-01-01是什么?为什么计算机起始时间是1970年1月1日
- python使用级数pi的近似值_π近似莱布尼兹级数