【STM32单片机】推箱子游戏设计


一、主要功能

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设计,视频分享,技术交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值