【STM32单片机】弹弹球游戏设计

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用8*8LED点阵模块、按键、LED等。

主要功能:
系统运行后,弹弹球开始以默认速度运行,可通过K1、K3键控制球拍移动,支持连按操作。
游戏过程中还可通过K2键调节弹球运行速度,游戏过程中可按下K4键暂停或开始,处于暂停状态时,
D1指示灯闪烁,当游戏结束后,D1指示灯亮。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/



//球方向控制
void ball_dir_control(void)
{
	if(ball_struct.flag)//控制球的运行速度
	{
		ball_struct.flag=0;
		draw_ball(0);//消除之前球的位置
		//球运行方向控制、碰到墙壁控制
		switch(ball_struct.ball.dir)
		{
			case BALL_DIR_FOUR: 
				ball_struct.ball.x+=1;
				ball_struct.ball.y+=1;
				//碰到右墙壁
				if(ball_struct.ball.x==LEDDZ_WIDTH-1)ball_struct.ball.dir=BALL_DIR_THREE;
				break;
			case BALL_DIR_THREE:
				ball_struct.ball.x-=1;
				ball_struct.ball.y+=1;
				//碰到左墙壁
				if(ball_struct.ball.x==0)ball_struct.ball.dir=BALL_DIR_FOUR;
				break;
			case BALL_DIR_TWO:
				ball_struct.ball.x-=1;
				ball_struct.ball.y-=1;
				//碰到左上角起点位置
				if(ball_struct.ball.x==0&&ball_struct.ball.y==0)ball_struct.ball.dir=BALL_DIR_FOUR;
				//碰到左墙壁
				else if(ball_struct.ball.x==0)ball_struct.ball.dir=BALL_DIR_ONE;
				//碰到上墙壁
				else if(ball_struct.ball.y==0)ball_struct.ball.dir=BALL_DIR_THREE;
				break;
			case BALL_DIR_ONE:
				ball_struct.ball.x+=1;
				ball_struct.ball.y-=1;
				//碰到右上角起点位置
				if(ball_struct.ball.x==LEDDZ_WIDTH-1&&ball_struct.ball.y==0)ball_struct.ball.dir=BALL_DIR_THREE;
				//碰到上墙壁
				else if(ball_struct.ball.y==0)ball_struct.ball.dir=BALL_DIR_FOUR;
				//碰到右墙壁
				else if(ball_struct.ball.x==LEDDZ_WIDTH-1)ball_struct.ball.dir=BALL_DIR_TWO;
				break;
		}
		draw_ball(1);//显示新球的位置

		//判断球拍是否接到球
		if(ball_struct.ball.y==ball_struct.bat.y-1)
		{
			//球拍接到球
			if(ball_struct.ball.x>=ball_struct.bat.x && ball_struct.ball.x<=ball_struct.bat.x+ball_struct.bat.len-1)
			{
				ball_struct.score+=GET_SCORE_RATIO;//得分
				if(ball_struct.score>=100)ball_struct.score=0;	
				if(ball_struct.ball.dir==BALL_DIR_FOUR)
					ball_struct.ball.dir=BALL_DIR_ONE;
				else if(ball_struct.ball.dir==BALL_DIR_THREE)
					ball_struct.ball.dir=BALL_DIR_TWO;	
			}
			//球拍未接到球
			else
			{
				ball_struct.status=3;//游戏停止状态
				game_over();//游戏结束
			}			
		}
	}			
}

//应用控制系统
void app_sys_ctrl_demo(void)
{
	u8 key=0;

	LED_Init();
	USART1_Init(115200);
	KEY_Init();
	LEDDZ_Init();
	ball_init();//参数初始化
	TIM3_Init(20,36000-1);//定时10ms
	TIM4_Init(20,36000-1);//定时10ms
	TIM_Cmd(TIM3,ENABLE);//打开定时器
	TIM_Cmd(TIM4,ENABLE);//打开定时器
	
	while(1)
	{
		if(ball_struct.status==0)//运行中
		{
			key=KEY_Scan(0);
			if(key==KEY1_PRESS)//球拍左移
			{
				draw_bat(0);//清除上次的球拍
				if(ball_struct.bat.x>=1)
					ball_struct.bat.x-=1;
			}
			else if(key==KEY3_PRESS)//球拍右移
			{
				draw_bat(0);//清除上次的球拍
				if(ball_struct.bat.x<=LEDDZ_WIDTH-ball_struct.bat.len-1)
					ball_struct.bat.x+=1;		
			}
			else if(key==KEY2_PRESS)//调速
			{
				ball_struct.speed-=5;
				if(ball_struct.speed<SPEED_HIGH)ball_struct.speed=SPEED_NORMAL;	
			}
			else if(key==KEY4_PRESS)
			{
				ball_struct.status=1;	
			}
			draw_bat(1);//绘制新球拍
			draw_ball(1);//显示新球的位置
			ball_dir_control();	
		}
		else if(ball_struct.status==1)//游戏暂停状态
		{
			TIM_Cmd(TIM4,DISABLE);
			while(1)//暂停
			{
				LED0=!LED0;
				delay_ms(100);
				if(KEY_Scan(0)==KEY4_PRESS)
				{
					LED0=1;
					ball_struct.status=0;
					TIM_Cmd(TIM4,ENABLE);
					break;	
				}			
			}		
		}	
	}
}



三、实验现象

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


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(单片机,stm32,游戏,STM32最小系统,弹弹球游戏)