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

2023-12-17 00:59

本文主要是介绍【单片机开发】基于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;
}	}}

这篇关于【单片机开发】基于stm32的掌上游戏机设计 (俄罗斯方块)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/502544

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE