⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameprocess.c

📁 单片机的俄罗斯方块程序,含Proteus 仿真文件及详细注释
💻 C
字号:
//*************************************************************************************************
//*																								  *
//*			 ******************************游戏动作处理程序**************************			  *
//*																								  *
//*************************************************************************************************
#include "includes.h"

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<方块动作>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ACTIONROTATE 0
#define ACTIONRIGHT 1
#define ACTIONDOWN 2
#define ACTIONLEFT 3

#define STARTROW ROW(-3)				 //方块起始位置。
#define STARTLINE LINE(5)				 
#define ROW(x) (100+x)					 //把方块位置加100,防止在--时产生负数。
#define LINE(x) (100+x)					 


//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定义当前方块属性变量>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BLOCK *psta_BlockCur=sta_BlockSet;	   	//指向当前方块设定的指针。

unsigned char uc_BlockRow,uc_BlockLine;	//当前方块位置。

bit b_GameStart=0;		   				//游戏开始标志位。

unsigned int ui_GameMark=0;	   			//当前游戏分数。

//*************************************************************************************************
//*																								  *
//*			 **********************************创建一个方块******************************		  *
//*																								  *
//*************************************************************************************************
void vCreateBlock()	 //在当前位置创建一个方块。
{
	unsigned char ucRowOffset,ucLineOffset;
	for(ucRowOffset=0;ucRowOffset<4;ucRowOffset++)
		for(ucLineOffset=0;ucLineOffset<4;ucLineOffset++)
			{
			if((0x01&(unsigned char)((psta_BlockCur->uiBlockMap)>>(ucRowOffset*4+ucLineOffset)))
					&&(uc_BlockRow+ucRowOffset)>=ROW(0))
				vShowBlock(uc_BlockRow+ucRowOffset-ROW(0),uc_BlockLine+ucLineOffset-LINE(0));
			}
}

//*************************************************************************************************
//*																								  *
//*			 **********************************删除一个方块******************************		  *
//*																								  *
//*************************************************************************************************
void vDeleteBlock()	 //在当前位置删除一个方块。
{
	unsigned char ucRowOffset,ucLineOffset;
	for(ucRowOffset=0;ucRowOffset<4;ucRowOffset++)
		for(ucLineOffset=0;ucLineOffset<4;ucLineOffset++)
			{
			if((0x01&(unsigned char)((psta_BlockCur->uiBlockMap)>>(ucRowOffset*4+ucLineOffset)))
					&&(uc_BlockRow+ucRowOffset)>=ROW(0))
				vCleanBlock(uc_BlockRow+ucRowOffset-ROW(0),uc_BlockLine+ucLineOffset-LINE(0));
			}
}


//*************************************************************************************************
//*																								  *
//*			 **********************************产生一个新的方块****************************		  *
//*																								  *
//*************************************************************************************************
void vNewBlock()
{
	unsigned char ucBlockSelect;		//用于选择方块类型及状态的数,通过取
	ucBlockSelect=(TH0+TH1)%18;			//定时器的值产生随机数。
	psta_BlockCur=&sta_BlockSet[ucBlockSelect];	
}
//*************************************************************************************************
//*																								  *
//*			 ********************************游戏初始化*******************************			  *
//*																								  *
//*************************************************************************************************
void vGameInitialize()
{
	unsigned char ucCountOne,ucCountTwo;

	vWriteCMD(0x01);		//清屏。
	vShowOneChin(1,2,uca_FEN);		//显示“分数”。
	vShowOneChin(1,18,uca_SHU);
	ui_GameMark=0;					//清空游戏分数。
	vShowNumber(4,0,ui_GameMark);	//显示初始分数。

	vShowFrame();					//显示边框。

	for(ucCountOne=0;ucCountOne<21;ucCountOne++)	   //清空游戏区域。
		for(ucCountTwo=0;ucCountTwo<12;ucCountTwo++)
			vCleanBlock(ucCountOne,ucCountTwo);

	uc_BlockRow=STARTROW;
	uc_BlockLine=STARTLINE;
	vNewBlock();
	vCreateBlock();					//新建方块。;
	b_GameStart=1;					//开启定时器定时下降。
} 
//*************************************************************************************************
//*																								  *
//*			 ******************************判断游戏是否结束**************************			  *
//*																								  *
//*************************************************************************************************
unsigned char ucIsGameOver()
{
	unsigned char ucCount;
	for(ucCount=0;ucCount<12;ucCount++)
		if(ucReadBlock(0,ucCount))
			return 1;		   
	return 0;
}


//*************************************************************************************************
//*																								  *
//*			 ******************************游戏结束处理函数**************************			  *
//*																								  *
//*************************************************************************************************
void vGameOver()
{
	b_GameStart=0;
	vShowGraph(3,40,70,2,uca_GameOver);
}

void vGetMark()
{
	unsigned char ucRow,ucLine,ucCount,ucTemp=0;
	for(ucRow=uc_BlockRow+3;ucRow>0;ucRow--)
		if((uca_BlockMap[ucRow*2]==0xFF)&&(uca_BlockMap[ucRow*2+1]==0x0F))
			{
			for(ucCount=ucRow;ucCount>0;ucCount--)
				for(ucLine=0;ucLine<12;ucLine++)
					{
					vCleanBlock(ucCount,ucLine);
					if(ucReadBlock(ucCount-1,ucLine))
						vShowBlock(ucCount,ucLine);
					}
			ucRow++;
			ui_GameMark+=(++ucTemp);
			}
	vShowNumber(4,0,ui_GameMark);
		
}
//*************************************************************************************************
//*																								  *
//*			 ******************************游戏动作处理函数****************************			  *
//*																								  *
//*************************************************************************************************
void vBlockAction(unsigned char ucAction)
{
	if(ucMoveDecide(ucAction))		   //判断方块是否可以移动。
		vMoveBlock(ucAction);		   //如果可以,则移动方块。
	else
		if(ucAction==ACTIONDOWN)
			{
			if(ucIsGameOver())
				vGameOver();
			else
				{
				vGetMark();
				uc_BlockRow=STARTROW;
				uc_BlockLine=STARTLINE;	
				vNewBlock();
				vCreateBlock();
				}
			}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -