【单片机开发】基于stm32的掌上游戏机设计 (俄罗斯方块)

项目相关链接:
1.STM32掌机:音乐播放器
2.STM32掌机:贪吃蛇
3.STM32掌机:俄罗斯方块

(一)效果展示

思想上也就是创造一个二维矩阵,对LCD与矩阵同时操作,通过矩阵判断状态,这里将定时器3的值作为随机数来源,随机性良好。
本人技术有限,基本思想还是从网上大神那里学来的,反正我自己写不外来。
在这里插入图片描述

(二)软件设计



#include "BOX.h"
#include "sys.h"
#include "lcd.h"
#include "gui.h"
#include "adc.h"
#include "stdlib.h"
#include "delay.h"


/***********************************************************
说明:以下函数用于基础图形绘制
**********************************************************/

void Draw_realbox1(u16 x,u16 y)
{
	u8 i,n;
	for(i=1;i<=3;i++)
	{
		for(n=1;n<=3;n++)
		{
			GUI_DrawPoint((x+i),(y+n),GRAY);	
		}	
	}
	for(i=0;i<=4;i++)
	{
		GUI_DrawPoint((x+i),y,BLACK	);
		GUI_DrawPoint((x+i),(y+4),BLACK	);		
		GUI_DrawPoint(x,(y+i),BLACK	);		
		GUI_DrawPoint((x+4),(y+i),BLACK	);				
	}	
}


/*************************************************
函数名 Deal_realbox
功能:删除一个俄罗斯方块;
入口参数:xy坐标
返回值:无
*************************************************/

void Deal_realbox1(u16 x,u16 y)
{
	u8 i,n;
	for(i=0;i<=4;i++)
	{
		for(n=0;n<=4;n++)
		{
			GUI_DrawPoint((x+i),(y+n),WHITE);	
		}	
	}
}




void Draw_tuxing1(u16 x,u16 y,u8 what)
{
	switch (what)
	{
		case 1:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x+5,y+5);
		}
		break;
		
		case 2:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x+10,y);
		Draw_realbox1(x+15,y);
		}
		break;
		
		case 3:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x,y+10);
		Draw_realbox1(x,y+15);
		}
		break;
		
		case 4:
		{
		Draw_realbox1(x+5,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x+10,y+5);
		}
		break;
		
		case 5:
		{
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x,y+10);
		}
		break;

		case 6:
		{
		Draw_realbox1(x,y+5);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x+5,y+10);
		}
		break;
		
		case 7:
		{
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x,y);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x+10,y);
		}
		break;
	
		case 8:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x,y+10);
		Draw_realbox1(x+5,y+10);
		}
		break;
		
		case 9:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x+10,y);
		}
		break;
		
		case 10:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x+5,y+10);
		}
		break;
		
		case 11:
		{
		Draw_realbox1(x,y+5);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x+10,y+5);
		Draw_realbox1(x+10,y);
		}
		break;
		
		case 12:
		{
		Draw_realbox1(x+5,y);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x+5,y+10);
		Draw_realbox1(x,y+10);
		}
		break;
		
		case 13:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x+10,y);
		Draw_realbox1(x+10,y+5);
		}
		break;
		
		case 14:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x,y+10);
		}
		break;
		
		case 15:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x+10,y+5);
		}
		break;
		
		
		case 16:
		{
		Draw_realbox1(x+5,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x,y+10);
		}
		break;
		
		case 17:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x+10,y+5);
		}
		break;
		
		case 18:
		{
		Draw_realbox1(x,y);
		Draw_realbox1(x,y+5);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x+5,y+10);
		}
		break;
		
		case 19:
		{
		Draw_realbox1(x,y+5);
		Draw_realbox1(x+5,y+5);
		Draw_realbox1(x+5,y);
		Draw_realbox1(x+10,y);
		}
		break;
	
	
	
	
	}

}



void Deal_tuxing1(u16 x,u16 y,u8 what)
{
	switch (what)
	{
		case 1:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x+5,y+5);
		}
		break;
		
		case 2:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x+10,y);
		Deal_realbox1(x+15,y);
		}
		break;
		
		case 3:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x,y+10);
		Deal_realbox1(x,y+15);
		}
		break;
		
		case 4:
		{
		Deal_realbox1(x+5,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x+10,y+5);
		}
		break;
		
		case 5:
		{
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x,y+10);
		}
		break;

		case 6:
		{
		Deal_realbox1(x,y+5);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x+5,y+10);
		}
		break;
		
		case 7:
		{
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x,y);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x+10,y);
		}
		break;
	
		case 8:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x,y+10);
		Deal_realbox1(x+5,y+10);
		}
		break;
		
		case 9:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x+10,y);
		}
		break;
		
		case 10:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x+5,y+10);
		}
		break;
		
		case 11:
		{
		Deal_realbox1(x,y+5);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x+10,y+5);
		Deal_realbox1(x+10,y);
		}
		break;
		
		case 12:
		{
		Deal_realbox1(x+5,y);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x+5,y+10);
		Deal_realbox1(x,y+10);
		}
		break;
		
		case 13:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x+10,y);
		Deal_realbox1(x+10,y+5);
		}
		break;
		
		case 14:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x,y+10);
		}
		break;
		
		case 15:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x+10,y+5);
		}
		break;
		
		
		case 16:
		{
		Deal_realbox1(x+5,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x,y+10);
		}
		break;
		
		case 17:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x+10,y+5);
		}
		break;
		
		case 18:
		{
		Deal_realbox1(x,y);
		Deal_realbox1(x,y+5);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x+5,y+10);
		}
		break;
		
		case 19:
		{
		Deal_realbox1(x,y+5);
		Deal_realbox1(x+5,y+5);
		Deal_realbox1(x+5,y);
		Deal_realbox1(x+10,y);
		}
		break;
	
	
	}

}


/*************************************************
函数名 Down_mov
功能:
入口参数:xy坐标
返回值:无
*************************************************/


void Down_tuxing_move(u16 x,u16 y,u8 what)
{
	Deal_tuxing1(x,y,what);
	Draw_tuxing1(x,y+5,what);
}

/*************************************************
函数名 Left_mov
功能:
入口参数:xy坐标
返回值:无
*************************************************/


void Left_tuxing_move(u16 x,u16 y,u8 what)
{
	Deal_tuxing1(x,y,what);
	Draw_tuxing1(x-5,y,what);
}

/*************************************************
函数名 Right_mov
功能:
入口参数:xy坐标
返回值:无
*************************************************/

void Right_tuxing_move(u16 x,u16 y,u8 what)
{
	Deal_tuxing1(x,y,what);
	Draw_tuxing1(x+5,y,what);
}


/***************************************************************
说明下列函数用于对状态二维数组的处理
*******************************************************************/


u8 what,speed=80,i=0,game2=1,leave=1,suijishu[5]={1,2,3,4,5},RAND=1;
u16 x=60,y=0,fengshu=0;
u8 shuaxing=0;
u8 zhuangtai[20][20]=
{
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********0**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********1**********//
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********2**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********3**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********4**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********5**********//
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********6**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********7**********//
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********8**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********9**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********10**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********11**********//
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********12**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********13**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********14**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********15**********//
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********16**********//
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********17**********//
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//**********18**********//
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//**********19**********//
};




/*************************************************
功能:更新一个状态到数组
*************************************************/
void Draw_a_zhuangtai(u16 x,u16 y)
{
	  zhuangtai[y/5][x/5]=1;
}


/*************************************************
功能:删除一个状态到数组
*************************************************/
void Deal_a_zhuangtai(u16 x,u16 y)
{
	  zhuangtai[y/5][x/5]=0;
}



/*************************************************
功能:画对应的状态图形
*************************************************/
void Draw_zhuangtai_tuxing(u16 x,u16 y,u8 what)
{
	switch (what)
	{
		case 1:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x+5,y+5);
		}
		break;
		
		case 2:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x+10,y);
		Draw_a_zhuangtai(x+15,y);
		}
		break;
		
		case 3:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x,y+10);
		Draw_a_zhuangtai(x,y+15);
		}
		break;
		
		case 4:
		{
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x+5,y+5);
		}
		break;
		
		case 5:
		{
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x,y+10);
		}
		break;

		case 6:
		{
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x+5,y+10);
		}
		break;
		
		case 7:
		{
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x+10,y);
		}
		break;
	
		case 8:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x,y+10);
		Draw_a_zhuangtai(x+5,y+10);
		}
		break;
		
		case 9:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x+10,y);
		}
		break;
		
		case 10:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x+5,y+10);
		}
		break;
		
		case 11:
		{
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x+10,y+5);
		Draw_a_zhuangtai(x+10,y);
		}
		break;
		
		case 12:
		{
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x+5,y+10);
		Draw_a_zhuangtai(x,y+10);
		}
		break;
		
		case 13:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x+10,y);
		Draw_a_zhuangtai(x+10,y+5);
		}
		break;
		
		case 14:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x,y+10);
		}
		break;
		
		case 15:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x+5,y+5);
		}
		break;
		
		
		case 16:
		{
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x,y+10);
		}
		break;
		
		case 17:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x+10,y+5);
		}
		break;
		
		case 18:
		{
		Draw_a_zhuangtai(x,y);
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x+5,y+10);
		}
		break;
		
		case 19:
		{
		Draw_a_zhuangtai(x,y+5);
		Draw_a_zhuangtai(x+5,y+5);
		Draw_a_zhuangtai(x+5,y);
		Draw_a_zhuangtai(x+10,y);
		}
		break;
	
	
	
	
	}

}



/*************************************************
功能:删除对应的状态图形
*************************************************/
void Deal_zhuangtai_tuxing(u16 x,u16 y,u8 what)
{
	switch (what)
	{
		case 1:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x+5,y+5);
		}
		break;
		
		case 2:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+10,y);
		Deal_a_zhuangtai(x+15,y);
		}
		break;
		
		case 3:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x,y+10);
		Deal_a_zhuangtai(x,y+15);
		}
		break;
		
		case 4:
		{
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+10,y+5);
		}
		break;
		
		case 5:
		{
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x,y+10);
		}
		break;

		case 6:
		{
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+5,y+10);
		}
		break;
		
		case 7:
		{
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+10,y);
		}
		break;
	
		case 8:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x,y+10);
		Deal_a_zhuangtai(x+5,y+10);
		}
		break;
		
		case 9:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+10,y);
		}
		break;
		
		case 10:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+5,y+10);
		}
		break;
		
		case 11:
		{
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+10,y);
		}
		break;
		
		case 12:
		{
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+5,y+10);
		Deal_a_zhuangtai(x,y+10);
		}
		break;
		
		case 13:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+10,y+5);
		}
		break;
		
		case 14:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x,y+10);
		}
		break;
		
		case 15:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+10,y+5);
		}
		break;
		
		case 16:
		{
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x,y+10);
		}
		break;
		
		case 17:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+10,y+5);
		}
		break;
		
		case 18:
		{
		Deal_a_zhuangtai(x,y);
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+5,y+10);
		}
		break;
		
		case 19:
		{
		Deal_a_zhuangtai(x,y+5);
		Deal_a_zhuangtai(x+5,y+5);
		Deal_a_zhuangtai(x+5,y);
		Deal_a_zhuangtai(x+10,y);
		}
		break;
	}

}

/*************************************************
功能:向下移动状态
*************************************************/

void Down_zhuangtai_move(u16 x,u16 y,u16 what)
{
	Deal_zhuangtai_tuxing(x,y,what);
	Draw_zhuangtai_tuxing(x,y+5,what);
}

/*************************************************
功能:向左移动状态
*************************************************/
void Left_zhuangtai_move(u16 x,u16 y,u8 what)
{
	Deal_zhuangtai_tuxing(x,y,what);
	Draw_zhuangtai_tuxing(x-5,y,what);
}

/*************************************************
功能:向右移动状态
*************************************************/
void Right_zhuangtai_move(u16 x,u16 y,u8 what)
{
	Deal_zhuangtai_tuxing(x,y,what);
	Draw_zhuangtai_tuxing(x+5,y,what);
}









void Down(u16 x,u16 y,u8 what)
{
	Down_zhuangtai_move(x,y,what);
	Down_tuxing_move(x,y,what);			
}


void Left(u16 x,u16 y,u8 what)
{
	Left_zhuangtai_move(x,y,what);
	Left_tuxing_move(x,y,what);			
}


void Right(u16 x,u16 y,u8 what)
{
	Right_zhuangtai_move(x,y,what);
	Right_tuxing_move(x,y,what);			
}


void Deal(u16 x,u16 y,u8 what)
{
	Deal_tuxing1(x,y,what);
	Deal_zhuangtai_tuxing(x,y,what);			
}



void Draw(u16 x,u16 y,u8 what)
{
	Draw_tuxing1(x,y,what);
	Draw_zhuangtai_tuxing(x,y,what);			
}


void change()
{
	
	switch(what)
	{
		case 1:break;
		
		case 2:Deal(x,y,2);Draw(x,y,3);what=3;break;
		case 3:Deal(x,y,3);Draw(x,y,2);what=2;break;
		
		case 4:Deal(x,y,4);Draw(x,y,5);what=5;break;
		case 5:Deal(x,y,5);Draw(x,y,7);what=7;break;
		case 6:Deal(x,y,6);Draw(x,y,4);what=4;break;
		case 7:Deal(x,y,7);Draw(x,y,6);what=6;break;
		
		case 8:Deal(x,y,8);Draw(x,y,9);what=9;break;
		case 9:Deal(x,y,9);Draw(x,y,10);what=10;break;
		case 10:Deal(x,y,10);Draw(x,y,11);what=11;break;
		case 11:Deal(x,y,11);Draw(x,y,8);what=8;break;
		
		case 12:Deal(x,y,12);Draw(x,y,15);what=15;break;
		case 13:Deal(x,y,13);Draw(x,y,12);what=12;break;
		case 14:Deal(x,y,14);Draw(x,y,13);what=13;break;
		case 15:Deal(x,y,15);Draw(x,y,14);what=14;break;
		
		case 16:Deal(x,y,16);Draw(x,y,17);what=17;break;
		case 17:Deal(x,y,17);Draw(x,y,16);what=16;break;
		
		case 18:Deal(x,y,18);Draw(x,y,19);what=19;break;
		case 19:Deal(x,y,19);Draw(x,y,18);what=18;break;
	
	}

}


void change1()
{
	
	switch(what)
	{
		case 1:break;
		
		case 2:Deal_zhuangtai_tuxing(x,y,2);Draw_zhuangtai_tuxing(x,y,3);break;
		case 3:Deal_zhuangtai_tuxing(x,y,3);Draw_zhuangtai_tuxing(x,y,2);break;
		
		case 4:Deal_zhuangtai_tuxing(x,y,4);Draw_zhuangtai_tuxing(x,y,5);break;
		case 5:Deal_zhuangtai_tuxing(x,y,5);Draw_zhuangtai_tuxing(x,y,7);break;
		case 6:Deal_zhuangtai_tuxing(x,y,6);Draw_zhuangtai_tuxing(x,y,4);break;
		case 7:Deal_zhuangtai_tuxing(x,y,7);Draw_zhuangtai_tuxing(x,y,6);break;
		
		case 8:Deal_zhuangtai_tuxing(x,y,8);Draw_zhuangtai_tuxing(x,y,9);break;
		case 9:Deal_zhuangtai_tuxing(x,y,9);Draw_zhuangtai_tuxing(x,y,10);break;
		case 10:Deal_zhuangtai_tuxing(x,y,10);Draw_zhuangtai_tuxing(x,y,11);break;
		case 11:Deal_zhuangtai_tuxing(x,y,11);Draw_zhuangtai_tuxing(x,y,8);break;
			
		case 12:Deal_zhuangtai_tuxing(x,y,12);Draw_zhuangtai_tuxing(x,y,15);break;
		case 13:Deal_zhuangtai_tuxing(x,y,13);Draw_zhuangtai_tuxing(x,y,12);break;
		case 14:Deal_zhuangtai_tuxing(x,y,14);Draw_zhuangtai_tuxing(x,y,13);break;
		case 15:Deal_zhuangtai_tuxing(x,y,15);Draw_zhuangtai_tuxing(x,y,14);break;
		
		case 16:Deal_zhuangtai_tuxing(x,y,16);Draw_zhuangtai_tuxing(x,y,17);break;
		case 17:Deal_zhuangtai_tuxing(x,y,17);Draw_zhuangtai_tuxing(x,y,16);break;
		
		case 18:Deal_zhuangtai_tuxing(x,y,18);Draw_zhuangtai_tuxing(x,y,19);break;
		case 19:Deal_zhuangtai_tuxing(x,y,19);Draw_zhuangtai_tuxing(x,y,18);break;
	
	}



}


int panduan1(u16 x,u16 y,u8 what,u8 fangxiang)

{
	u16 sum1=0,sum2=0;
	u8 i,n;
	u8 sbuff[20][20];
	x=x/5+1;
	y=y/5;
  for(i=0;i<20;i++)
	{
	
		for(n=0;n<20;n++)
		{
			sbuff[i][n]=zhuangtai[i][n];
			sum1=sum1+zhuangtai[i][n];	
		}
	  
	}
			
	
	switch(fangxiang)
	{
		case 1:Left_zhuangtai_move((x-1)*5,5*y,what);break;
		case 2:Down_zhuangtai_move((x-1)*5,5*y,what);break;
		case 3:Right_zhuangtai_move((x-1)*5,5*y,what);break;
		case 4:change1();break;
		
	}
		for(i=0;i<20;i++)
	{
		
		for(n=0;n<20;n++)
		{
			sum2=sum2+zhuangtai[i][n];	
			zhuangtai[i][n]=sbuff[i][n];			
    }
	}
	
		
		return !(sum1==sum2);
}



void lie_move(u16 y)
{
	u8 i;
	y=y/5;
	for(i=1;i<19;i++)
	{
		if(zhuangtai[y][i]==1)
		{
			zhuangtai[y][i]=zhuangtai[y+1][i];
			zhuangtai[y+1][i]=1;
			
				Deal_realbox1((i-1)*5,y*5);
			Draw_realbox1((i-1)*5,(y+1)*5);
		}
		else if(zhuangtai[y][i]==0)
		{
			zhuangtai[y][i]=zhuangtai[y+1][i];
			zhuangtai[y+1][i]=0;
			
				Deal_realbox1((i-1)*5,y*5);
			Deal_realbox1((i-1)*5,(y+1)*5);
		}
	}
}


void Deal_lie(u16 y)
{
	u8 i;
	y=y/5;
	for(i=1;i<19;i++)
	{
		zhuangtai[y][i]=0;
		Deal_realbox1((i-1)*5,y*5);
	}
}


void xiaochu()
{
	u8 n;
	for(n=17;n>0;n--)
	{
		if(n>=17)
		{
			n=17;
		
		
		}
		if(
					
					(
                    zhuangtai[n+1][1]&&zhuangtai[n+1][2]&&zhuangtai[n+1][3]&&zhuangtai[n+1][4]&&zhuangtai[n+1][5]&&zhuangtai[n+1][6]&&zhuangtai[n+1][7]&&zhuangtai[n+1][8]&&zhuangtai[n+1][9]&&zhuangtai[n+1][10]&&zhuangtai[n+1][11]&&zhuangtai[n+1][12]&&zhuangtai[n+1][13]&&zhuangtai[n+1][14]&&zhuangtai[n+1][15]&&zhuangtai[n+1][16]&&zhuangtai[n+1][17]&&zhuangtai[n+1][18]
					) 
				 &&
					!(
					zhuangtai[n][1]&&zhuangtai[n][2]&&zhuangtai[n][3]&&zhuangtai[n][4]&&zhuangtai[n][5]&&zhuangtai[n][6]&&zhuangtai[n][7]&&zhuangtai[n][8]&&zhuangtai[n][9]&&zhuangtai[n][10]&&zhuangtai[n][11]&&zhuangtai[n][12]&&zhuangtai[n][13]&&zhuangtai[n][14]&&zhuangtai[n][15]&&zhuangtai[n][16]&&zhuangtai[n][17]&&zhuangtai[n][18]
					) 


		   )
		  
		

		{
			lie_move(5*n);

			n=n+2;
		}
		
		if(
					(
					!zhuangtai[n][1]&&!zhuangtai[n][2]&&!zhuangtai[n][3]&&!zhuangtai[n][4]&&!zhuangtai[n][5]&&!zhuangtai[n][6]&&!zhuangtai[n][7]&&!zhuangtai[n][8]&&!zhuangtai[n][9]&&!zhuangtai[n][10]&&!zhuangtai[n][11]&&!zhuangtai[n][12]&&!zhuangtai[n][13]&&!zhuangtai[n][14]&&!zhuangtai[n][15]&&!zhuangtai[n][16]&&!zhuangtai[n][17]&&!zhuangtai[n][18]
					)
		  )
		{
			for(n=0;n<19;n++)
	{
		if(
				(
				zhuangtai[n][1]&&zhuangtai[n][2]&&zhuangtai[n][3]&&zhuangtai[n][4]&&zhuangtai[n][5]&&zhuangtai[n][6]&&zhuangtai[n][7]&&zhuangtai[n][8]&&zhuangtai[n][9]&&zhuangtai[n][10]&&zhuangtai[n][11]&&zhuangtai[n][12]&&zhuangtai[n][13]&&zhuangtai[n][14]&&zhuangtai[n][15]&&zhuangtai[n][16]&&zhuangtai[n][17]&&zhuangtai[n][18]
					)
				)
		  
		{
			Deal_lie(n*5);fengshu++;
				if(fengshu%10==0)
				{
					speed=speed+10;
					leave++;				
				}
		}	
	}
	break;		
		}
	}
}
/********************************
说明:该函数用于游戏界面显示
******************************/
void boxshow(void)
{
  
	 LCD_Clear(WHITE);
	for(i=0;i<=95;i=i+5) 
	{
		Draw_realbox1(0,i);
	}
	for(i=0;i<=95;i=i+5) 
	{
		Draw_realbox1(95,i);
	}
	for(i=0;i<=95;i=i+5) 
	{
		Draw_realbox1(i,95);
	}

	 Show_Str(0, 101, BLACK,WHITE,"SCORE:",16,1);
     LCD_ShowNum(90,101,0,1,16);
  
}

/*********************************
说明:该函数用于游戏结束
以及结束显示
*********************************/
 void boxgameover()
{
	
	LCD_Clear(WHITE);
	Show_Str(0, 0, BLACK,WHITE,"game over",16,1);
	delay_ms(1000);
	LCD_Clear(WHITE);
	Show_Str(0, 32, BLACK,WHITE,"SCORE:",16,1);
	LCD_ShowNum(90,32,fengshu,1,16);
	while(1);
}



void begin()
{
	

	
	what=suijishu[4];
	suijishu[4]=suijishu[3];
	suijishu[3]=suijishu[2];
	suijishu[2]=suijishu[1];
	suijishu[1]=suijishu[0];
	srand(RAND*TIM_GetCounter(TIM3)*TIM_GetCounter(TIM3));
	RAND++;
	suijishu[0]=rand()%19+1;


	x=60,y=0;
	
	Draw(60,0,what);	
	if(panduan1(x,y,what,2))
	{
		boxgameover();
	}
	
}





void boxtouch(void)
{	u8 key;
	key= PS2_Scan();	
	switch(key)
	{
	case 0:if(!panduan1(x,y,what,2)){Down(x,y,what);y=y+5;}else{	xiaochu();begin();} break;
	case 2:if(!panduan1(x,y,what,1)){Left(x,y,what);x=x-5;}break;
	case 1:if(!panduan1(x,y,what,3)){Right(x,y,what);x=x+5;}break;
	case 4:if(!panduan1(x,y,what,4))change();break;
	}

}


void TIM3_Init(u16 per,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}


void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)!= RESET)
	{   
		delay_ms(1000/speed);
		boxtouch();
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);	
	}
}  




void BOX_TASK(void)
{
   Adc_Init();		  		//ADC初始化
   LCD_Clear(WHITE); 
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
   boxshow();
   begin();
   TIM3_Init(500,7199);//启动定时器
  

}


4)main函数


#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "gui.h"
#include "Picture.h"
#include  "music.h"
#include "24cxx.h"
#include "FILE.h"
#include  "SNAKE.h"
#include "BOX.h"
int main(void)
{
    u8 key,ps2value;
    uart_init(9600);
    delay_init();//Delay init.
	OnUart_GPIO();
	 
    KEY_Init();
	LCD_Init();	   //液晶屏初始化
    LCD_Clear(BLACK); //清屏低功耗
 /**************************************************************************
	功能:初始化界面,按下一键自动进入
	作者:杨越
    时间:2019/5/14
	***************************************************************/	
	
  while(1)
{	

        
	


	key=0;
	while(key!=1)
	{
		key=KEY_Scan();	
	}
	

    music1();

		
	
	
	delay_ms(10);
    Fullscreen_showimage(gImage_WHU);
	delay_ms(300);
	LCD_Clear(WHITE); 
	 
	GUI_DrawFont32(30, 30,BLACK, WHITE, "自",0);
	GUI_DrawFont32(62, 30,BLACK, WHITE, "强",0);
    delay_ms(100);
    LCD_Clear(WHITE);	
	GUI_DrawFont32(30, 30,BLACK, WHITE, "弘",0);
	GUI_DrawFont32(62, 30,BLACK, WHITE, "毅",0);
    delay_ms(100);

	LCD_Clear(WHITE);
	GUI_DrawFont32(30, 30,BLACK, WHITE, "求",0);
	GUI_DrawFont32(62, 30,BLACK, WHITE, "是",0);
    delay_ms(100);

	LCD_Clear(WHITE);
    GUI_DrawFont32(30, 30,BLACK, WHITE, "拓",0);
	GUI_DrawFont32(62, 30,BLACK, WHITE, "新",0);
	delay_ms(100);

    LCD_Clear(WHITE);	
	Gui_StrCenter(0, 0,RED, WHITE, "终有一天",16,0);
	Gui_StrCenter(0, 16,RED, WHITE, "我们都会成为",16,0);
	Gui_StrCenter(0, 32,RED, WHITE, "那个最好的自己",16,0);
	delay_ms(100);
    LCD_Clear(WHITE);
	Gui_StrCenter(0, 0,YELLOW, WHITE, "欢迎使用",16,0);
	Gui_StrCenter(0, 18,YELLOW, WHITE, "傻妞牌手机",16,0);
    delay_ms(500);
    /**************************************************************************
	功能:菜单显示界面
	作者:杨越
    时间:2019/5/14
	***************************************************************/
	LCD_Clear(WHITE);
	LCD_ShowNum(0,0,1,1,16);
	LCD_ShowNum(0,16,2,1,16);
	LCD_ShowNum(0,32,3,1,16);
	LCD_ShowNum(0,48,4,1,16);
	LCD_ShowNum(0,64,5,1,16);
	LCD_ShowNum(0,80,6,1,16);
	LCD_ShowNum(0,96,7,1,16);
	LCD_ShowNum(0,108,8,1,16);
	
	
	Show_Str(8, 0, BLACK,WHITE,"拨号",16,0);
	Show_Str(8, 16, BLACK,WHITE,"文件管理",16,0);
	Show_Str(8, 32, BLACK,WHITE,"发送短信",16,0);
    Show_Str(8, 48, BLACK,WHITE,"查看短信",16,0);
	Show_Str(8, 64, BLACK,WHITE,"音乐播放",16,0);
	Show_Str(8, 80, BLACK,WHITE,"贪吃蛇" ,16,0);
    Show_Str(8, 96, BLACK,WHITE,"俄罗斯方块" ,16,0);
	Show_Str(8, 108, BLACK,WHITE,"体感游戏" ,16,0);
	
key=0;
while(key==0)
{
	key=KEY_Scan();
} 
	switch(key)
  {
	  case 1: printf("尚未开发");break;
//	  case 2: FILE_TASK();break;
	  case 3: printf("尚未开发");break;
	  case 4: printf("尚未开发");break;	  
	  case 5: MUSIC_TASK();break;
//	  case 6: SNAKE_TASK();break;
	  case 7: BOX_TASK();break;
      case 8: printf("尚未开发");break;
	  case 9: printf("尚未开发");break;
	 
	 default : printf("瞎搞");break;
}	
	
}

}
  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
基于STM32俄罗斯方块游戏设计是使用STM32微控制器来实现俄罗斯方块游戏的功能。这款游戏的全部源码已经根据STM32进行设计,可以在正点原子开发板上运行。该代码采用寄存器风格编写,并且有详细的注释。 在方块的编码形式上,借用了Ucos-II的思想。通过定义一个一维数组,将19种方块利用枚举法进行编码,从而实现方块的随机生成。这样,每次游戏开始时可以生成不同的方块。 在游戏过程中,每当方块下落一次,需要进行满行的检测。当某一行存在满行时,该行会被消除,并且位于其上方的方块会整体下落。这个过程会给玩家加分。通过遍历一维数组,如果存在某个值为0xFFFF,表示该行可以被消除,之后会将该行上方的方块下移。 整个游戏的界面是基于一维数组进行设计,通过不断的方块下落和消除满行的操作,实现了俄罗斯方块游戏的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于STM32设计俄罗斯方块小游戏.zip](https://download.csdn.net/download/xiaolong1126626497/20706125)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于STM32F407的俄罗斯方块游戏代码分析](https://blog.csdn.net/capture3333/article/details/125779728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与光同程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值