一、主要功能
1、OLED显示游戏地图和关卡
2、按键控制方向
3、通关地图切换
4、可使用上位机设计地图
二、使用步骤
系统运行后,OLED显示第一关推箱子游戏界面,通过KEY_UP、KEY1、KEY2和KEY0,4个按键控制玩家上、下、左和右移动方向。每将箱子全部移动到目的地,则进入下一关地图,默认项目中设计了4种地图,用户可根据配套上位机软件生成游戏地图。
三、硬件资源
1.硬件准备
项目所需要的硬件资源如下:
①STM32F103或STM32F407开发板1个
②0.96寸OLED(IIC)液晶模块1个
③USB线1条(用于供电和程序下载)
④杜邦线若干
2.硬件连接
OLED(IIC)模块-->单片机IO
VCC-->5V
GND-->GND
SCL-->PB6
SDA-->PB7
按键模块-->单片机IO
KEY_UP-->PA0
KEY0-->PE4
KEY1-->PE3
KEY2-->PE2
四、软件设计
1.软件结构
2.主要代码
主要代码如下:
//定义一个3维数组,用来表示推箱子的地图
u8 map[GAME_CENSOR][MAP_ROW][MAP_COL]=
{
{ //第1关
{0,0,0,0,0,0,0,0},
{0,0,1,1,1,0,0,0},
{0,0,1,2,1,1,1,1},
{1,1,1,3,3,0,2,1},
{1,2,3,4,0,1,1,1},
{1,1,1,1,3,1,0,0},
{0,0,0,1,2,1,0,0},
{0,0,0,1,1,1,0,0}
},
{ //第2关
{0,1,1,0,0,1,1,0},
{1,0,2,1,1,2,0,1},
{1,0,0,3,0,0,0,1},
{1,0,0,4,3,0,0,1},
{1,0,0,3,3,0,0,1},
{0,1,0,0,0,0,1,0},
{0,0,1,2,2,1,0,0},
{0,0,0,1,1,0,0,0},
},
{ //第3关
{0,1,1,1,1,1,1,0},
{1,0,4,0,3,0,2,1},
{1,0,0,3,0,3,2,1},
{1,0,0,2,0,0,0,1},
{1,0,0,0,0,3,0,1},
{1,0,0,0,0,0,2,1},
{1,0,0,0,1,0,1,1},
{0,1,1,1,1,1,1,0}
},
{ //第4关
{0,1,1,1,1,1,1,0},
{1,0,4,0,0,0,2,1},
{1,0,0,0,0,0,2,1},
{1,0,3,0,0,0,0,1},
{1,0,2,0,3,0,0,1},
{1,0,3,0,3,0,2,1},
{1,0,0,0,1,0,1,1},
{0,1,1,1,1,1,1,0}
},
};
//游戏地图绘制
void game_draw(void)
{
u8 i=0,k=0;
for(i=0;i<MAP_ROW;i++)
{
for(k=0;k<MAP_COL;k++)
{
switch(map[glevel][i][k])
{
case SPACE://空地
OLED_Fill_rectangle(k*GAME_SIZE,i*GAME_SIZE,GAME_SIZE-GAME_SPACE,GAME_SIZE-GAME_SPACE,0);
break;
case WALL://墙
OLED_Fill_rectangle(k*GAME_SIZE,i*GAME_SIZE,GAME_SIZE-GAME_SPACE,GAME_SIZE-GAME_SPACE,1);
break;
case DEST://目的地
OLED_DrawRectanglex(k*GAME_SIZE,i*GAME_SIZE,GAME_SIZE-GAME_SPACE,GAME_SIZE-GAME_SPACE,1);
break;
case BOX://箱子
OLED_Draw_Box(k*GAME_SIZE,i*GAME_SIZE,GAME_SIZE-GAME_SPACE,GAME_SIZE-GAME_SPACE,1);
break;
case PLAYER://人
OLED_Fill_circle(k*GAME_SIZE+GAME_SIZE/2-1,i*GAME_SIZE+GAME_SIZE/2-1,GAME_SIZE/2-1,1);
break;
case PLAYER+DEST://人+目的地
OLED_Fill_circle(k*GAME_SIZE+GAME_SIZE/2-1,i*GAME_SIZE+GAME_SIZE/2-1,GAME_SIZE/2-1,1);
break;
case BOX+DEST://箱子+目的地
OLED_Draw_Box(k*GAME_SIZE,i*GAME_SIZE,GAME_SIZE-GAME_SPACE,GAME_SIZE-GAME_SPACE,1);
break;
}
}
}
OLED_Refresh_Gram();
}
//游戏过关判定
//返回1过关,0未过关
u8 game_pass(void)
{
u8 i=0,k=0;
for(i=0;i<MAP_ROW;i++)
{
for(k=0;k<MAP_COL;k++)
{
if(map[glevel][i][k]==BOX)
return 0;
}
}
return 1;
}
//推箱子游戏设计
void app_demo(void)
{
BEEP_Init();
KEY_Init();
LED_Init();
OLED_Init();
OLED_Init();
TIM4_Init(5000-1,8400-1); //定时500ms
My_EXTI_Init();
while(1)
{
//游戏过关
if(game_pass())
{
glevel++;
if(glevel>GAME_CENSOR)
{
//游戏通过
OLED_Clear();
OLED_ShowString(10,10,"Game Pass",16);
OLED_ShowString(10,30,"Reset Start",16);
OLED_Refresh_Gram();
while(1);
}
}
OLED_ShowFontHZ(X_WIDTH-40,10,13,16,1);//第
OLED_ShowNum(X_WIDTH-24,10,glevel+1,1,16);
OLED_ShowFontHZ(X_WIDTH-16,10,14,16,1);//关
game_draw();//游戏界面绘制
key_event();//按键消息处理
}
}
五、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。