寒假在家一起练项目5
这个是我在寒假时间基于硬核学堂的STM32 “口袋”嵌入式学习平台完成的“寒假在家一起练项目5”,我选择的是功能2,即移植或自己编写一款经典的游戏,我选择的是俄罗斯方块
标签
嵌入式系统
刘家杰
更新2021-03-05
1519

      这个是我在寒假时间基于硬核学堂的STM32 “口袋”嵌入式学习平台完成的“寒假在家一起练项目5”,我选择的是功能2,即移植或自己编写一款经典的游戏,需要用到板上的4个按键操作,同时蜂鸣器能够发出声音,姿态传感器能够感知板子旋转的方向,自动将屏幕调整到合适观看的角度。在项目的完成上我参考了CSDN上的博客https://blog.csdn.net/weixin_43237195/article/details/86765716。

      整个项目需要在板子上烧录进俄罗斯方块的代码,显示游戏开始界面,点击sw1按钮即可进入游戏,通过旋转板子可以从不同方向进行游戏。进入游戏后,左面是图形区,随机出现不同形状的方块,右上角显示接下来出现的几个方块的形状,以及得分和难度情况,以及按钮的功能。进行游戏操作时,每消除一行14个小方块就会得到14分,蜂鸣器发出声音,同时游戏的难度增加,当游戏结束后会显示黄色的GAMEOVER界面,点击SW1可以从新开始游戏。

      下面我将介绍每部分的实现思路:

      ①首先是按键的检测,用if条件判断哪个按键被按下,并返回对应的值。

u8 KEY_Scan(void)
{
	static u8 key=1;
	if(key==1&&(K_UP==0||K_DOWN==0||K_LEFT==0||K_RIGHT==0))//任意一个按键按下
	{
		delay_ms(20);
	
		key=0;
		if(K_UP==0)
		{
			return KEY_UP; 
		}
		else if(K_DOWN==0)
		{
			return KEY_DOWN; 
		}
		else if(K_LEFT==0)
		{
			return KEY_LEFT; 
		}			
		else if(K_RIGHT==0)
		{
			return KEY_RIGHT;
		}
	}
	else if(K_UP==1&&K_LEFT==1&&K_RIGHT==1)    //无按键按下
	{
		key=1;
	}
	return 0;
}

      ②之后是界面的绘制,包括开始,结束和游戏三个界面。这部分的代码较为简单,用相应的函数进行绘制即可,下面贴出部分代码以及界面的图片。

void welcome(void)
{
	LCD_Fill(20,60,220,180,GREEN);
	LCD_ShowString(50,80,"GAME START",BLUE,WHITE,32,1);
	LCD_ShowString(50,120,"(Press K1 Start)",RED,WHITE,16,1);
}

FuwvK6d3FDdOok_bqd4THB8ubbJlFvW_9HnQNGxGgb6ImreI1HaaLPgPFlWF2X76aKdQtbFDfPHmbpl6U80s

      ③之后是俄罗斯方块的绘制,俄罗斯方块共有19种组合方式,下面是绘制1个小方块的代码,为LCD上10*10的大小,用case语句进行循环和判断,可实现19种组合方块的绘制,即每种组合中有4~5个小方块。

void Draw_realbox(u16 x,u16 y)
{
	u8 i,n;
	for(i=1;i<=8;i++)
	{
		for(n=1;n<=8;n++)
		{
			Gui_DrawPoint((x+i),(y+n),GRAY0);	
		}	
	}
	for(i=0;i<=9;i++)
	{
		Gui_DrawPoint((x+i),y,BLACK	);
		Gui_DrawPoint((x+i),(y+9),BLACK	);		
		Gui_DrawPoint(x,(y+i),BLACK	);		
		Gui_DrawPoint((x+9),(y+i),BLACK	);				
	}	
}
void Deal_realbox(u16 x,u16 y)
{
	u8 i,n;
	for(i=0;i<=9;i++)
	{
		for(n=0;n<=9;n++)
		{
			Gui_DrawPoint((x+i),(y+n),WHITE);	
		}	
	}
}

      如何让绘制的方块随机产生也很重要,我没有选择rank()函数,因为这个是伪随机数,我选择的是数字电路中ADC产生的数据最后一位总是在变化的特性进行方块的产生。

      ④方块的移动操作,在游戏中按下按键后,方块需要进行旋转,左移,右移等操作,这三种操作的实现方法类似,都是删除后绘制新的方块,变换操作就是删除原来的方块换成旋转后的方块。

void Down_tuxing_move(u16 x,u16 y,u8 what)
{
	Deal_tuxing(x,y,what);
	Draw_tuxing(x,y+10,what);
}
void Left_tuxing_move(u16 x,u16 y,u8 what)
{
	Deal_tuxing(x,y,what);
	Draw_tuxing(x-10,y,what);
}
void Right_tuxing_move(u16 x,u16 y,u8 what)
{
	Deal_tuxing(x,y,what);
	Draw_tuxing(x+10,y,what);
}

      ⑤方块的下落以及碰撞检测,这部分是整个俄罗斯方块游戏设计的重点,下落的函数比较简单,需要用到一个变量来控制速度,我的做法是利用stm32里面的定时器,大概每10微秒中断一次,在中断函数里面,让一个变量自加。消除的块数越多,下落的速度就更快,难度更大。

      判断碰撞的函数我用了二维数组,1代表有方块,在最外部全部赋1就是当做墙壁用,如果方块的移动方向上有挨着的1,就说明发生了碰撞,无法移动。

      上面就是我的项目的大体的实现思路,通过几周的学习我基本完成了俄罗斯方块的小游戏,能够显示不同的界面,记录得分难度等操作,用到了姿态传感器检测板子的方向,以及蜂鸣器发出声音,基本完成了项目的要求。由于这是我第一次接触stm32,有很多东西都是参考的论坛的资料,今后还需要努力学习。

附件下载
俄罗斯方块.zip
团队介绍
北京理工大学
团队成员
刘家杰
北京理工大学电子信息工程专业大三
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号