一、主要功能
1、TFTLCD显示游戏 2、按键控制板子移动方向 3、得分关卡显示 4、游戏结束,一键重启
二、使用步骤
系统运行后,TFTLCD触摸屏显示游戏界面,通过按键KEY2和KEY0控住左右方向。当小球打到砖块且接住小球时,分数加10。当游戏结束后可按任意键重新回到游戏主界面。
三、硬件资源
1.硬件准备
项目所需要的硬件资源如下: ①STM32F103或STM32F407开发板1个 ②TFTLCD液晶模块1个 ③USB线1条(用于供电和程序下载) ④杜邦线若干
2.硬件连接
TFTLCD触摸屏模块-->单片机IO
按键模块-->单片机IO
KEY_UP-->PA0
KEY0-->PE4
KEY1-->PE3
KEY2-->PE2
四、软件设计
1.软件结构
2.主要代码
主要代码如下:
#define START_X 10
#define START_Y 50
#define ZK_WIDTH 30
#define ZK_HEIGHT 20
#define BZ_WIDTH 100
#define BZ_HEIGHT 5
#define COLS 10
#define ROWS 5
#define WINDOW_WIDTH (ZK_WIDTH*COLS)
#define WINDOW_HEIGHT 320
#define RADIUS 5
#define SPACE 5
#define BZ_SPACE 10
struct ZK
{
int x,y;
int w,h;
u16 color;
u8 isLive;
};
struct BZ
{
int x,y;
int w,h;
u16 color;
};
struct Ball
{
int x,y;
int radius;
u16 color;
int xfx,yfx;
};
struct ZK zk[ROWS][COLS];
struct BZ bz;
struct Ball ball;
u8 isContinue=1;
u8 glevel=1;
u32 gscore=0;
u32 gtime_cnt=0;
u16 gcolor[12]={BLACK,BLUE,BRED,GRED,GBLUE,RED,MAGENTA,GREEN,CYAN,YELLOW,
BROWN,BRRED,};
void initBall()
{
ball.radius=RADIUS;
ball.x=WINDOW_WIDTH/2+START_X;
ball.y=WINDOW_HEIGHT-BZ_HEIGHT-RADIUS+START_Y;
ball.color=BLUE;
ball.xfx=SPACE;
ball.yfx=-SPACE;
}
void initBz()
{
bz.w=BZ_WIDTH;
bz.h=BZ_HEIGHT;
bz.color=RED;
bz.x=(WINDOW_WIDTH-BZ_WIDTH)/2+START_X;
bz.y=WINDOW_HEIGHT-BZ_HEIGHT+START_Y;
}
void initZk()
{
int i,j;
for(i=0;i<ROWS;i++)
{
for(j=0;j<COLS;j++)
{
zk[i][j].x=j*ZK_WIDTH+START_X;
zk[i][j].y=i*ZK_HEIGHT+START_Y;
zk[i][j].w=ZK_WIDTH;
zk[i][j].h=ZK_HEIGHT;
zk[i][j].color=gcolor[rand()%12];
zk[i][j].isLive=1;
}
}
}
void initGame()
{
srand(gtime_cnt);
LCD_DrawRectangle_Color(START_X,START_Y,START_X+WINDOW_WIDTH,START_Y+WINDOW_HEIGHT,WHITE);
initZk();
initBz();
initBall();
isContinue=1;
drawAllZk();
drawBz();
drawBall();
}
void showGame()
{
LCD_DrawRectangle_Color(START_X,START_Y,START_X+WINDOW_WIDTH,START_Y+WINDOW_HEIGHT,WHITE);
drawBz();
drawBall();
LCD_ShowxNum(START_X+32*3,WINDOW_HEIGHT+START_Y+60,gscore,5,32,0);
}
void ctolGame()
{
ball_move();
check();
keyCtol();
}
void beep_alarm(void)
{
BEEP=1;
delay_ms(50);
BEEP=0;
}
void app_demo(void)
{
u8 key=0;
BEEP_Init();
KEY_Init();
LED_Init();
TIM4_Init(500-1,7200-1);
TFTLCD_Init();
TP_Init();
START:
gscore=0;
LCD_Clear(BACK_COLOR);
LCD_ShowPicture(0,(tftlcd_data.height-240)/2,320,240,(u8 *)gImage_picture);
LCD_ShowFontHZ((tftlcd_data.width-32*5)/2,10,"打砖块游戏");
while(1)
{
key=KEY_Scan(0);
if(key!=0)break;
}
LCD_Clear(BACK_COLOR);
LCD_ShowFontHZ((tftlcd_data.width-32*5)/2,10,"打砖块游戏");
LCD_ShowFontHZ(START_X,WINDOW_HEIGHT+START_Y+20,"关卡:");
LCD_ShowNum(START_X+32*3,WINDOW_HEIGHT+START_Y+20,glevel,1,32);
LCD_ShowFontHZ(START_X,WINDOW_HEIGHT+START_Y+60,"得分:");
LCD_ShowNum(START_X+32*3,WINDOW_HEIGHT+START_Y+60,gscore,5,32);
initGame();
while(isContinue)
{
showGame();
ctolGame();
}
LCD_ShowFontHZ((tftlcd_data.width-32*4)/2,(tftlcd_data.height-29)/2,"游戏结束");
LCD_ShowString((tftlcd_data.width-8*20)/2,(tftlcd_data.height-29)/2+30,tftlcd_data.width,tftlcd_data.height,16,"Press KEY ReStart...");
while(1)
{
key=KEY_Scan(0);
if(key!=0)goto START;
}
}
五、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
作者B站链接:https://space.bilibili.com/444388619 可提供手把手教学服务,资料获取请联系作者QQ:3443792007 专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。
|