gameprocess.c

来自「用proteus模拟仿真实现俄罗期方块游戏」· C语言 代码 · 共 192 行

C
192
字号
//*************************************************************************************************
//*																								  *
//*			 ******************************游戏动作处理程序**************************			  *
//*																								  *
//*************************************************************************************************

//*************************************************************************************************
//*																								  *
//*			 ******************************头文件及宏定义**************************				  *
//*																								  *
//*************************************************************************************************
#include "at89x51.h"
#include "LCDShowMap.h"
#include "LCD12864.h"
#include "GameGraph.h"
#include "MoveDecide.h"
#include "MoveBlock.h"
#include "BlockCreate.h"
#include "GetMark.h"


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

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<方块类型>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define TYPEONE 0
#define	TYPETWO 1
#define	TYPETHREE 2
#define	TYPEFOUR 3
#define	TYPEFIVE 4
#define	TYPESIX 5
#define	TYPESEVEN 6

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<方块状态>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define STATEONE 0
#define STATETWO 1
#define STATETHREE 2
#define STATEFOUR 3

//*************************************************************************************************
//*																								  *
//*			 ********************************全局变量*******************************			  *
//*																								  *
//*************************************************************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定义当前方块属性变量>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char uc_BlockType=TYPEFOUR;
unsigned char uc_BlockState=STATETHREE;
unsigned char uc_BlockRow=0;
unsigned char uc_BlockLine=4;

extern bit b_DownStart;		   //开启定时器定时下降标志位。

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


//*************************************************************************************************
//*																								  *
//*			 **********************************创建新方块******************************			  *
//*																								  *
//*************************************************************************************************
void vNewBlock()
{
	if(uc_BlockType==TYPESEVEN)			   //变换方块类型。
		uc_BlockType=TYPEONE;
	else
		uc_BlockType++;

	if(uc_BlockState==STATEFOUR)		   //变换方块状态。
		uc_BlockState=STATEONE;
	else
		uc_BlockState++;

	switch(uc_BlockState)				   //防止状态变量超出特定类型方块类型的取值范围。
		{
		case TYPEONE:uc_BlockState%=2;break;
		case TYPETWO:uc_BlockState=0;break;
		case TYPETHREE:uc_BlockState%=4;break;
		case TYPEFOUR:uc_BlockState%=4;break;
		case TYPEFIVE:uc_BlockState%=4;break;
		case TYPESIX:uc_BlockState%=2;break;
		case TYPESEVEN:uc_BlockState%=2;break;
		default:break;
		}

	uc_BlockRow=0;						 //初始化方块位置
	uc_BlockLine=4;
	vBlockCreate();						 //新建方块。
}


//*************************************************************************************************
//*																								  *
//*			 ********************************游戏初始化*******************************			  *
//*																								  *
//*************************************************************************************************
void vGameInitialize()
{
	unsigned char ucCountOne,ucCountTwo;

	vShowOneChin(1,2,uca_FEN);		   //显示“分数”。
	vShowOneChin(1,18,uca_SHU);

	vShowFrame();					   //显示边框。

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

	ui_GameMark=0;									   //清空游戏分数。
	vShowNumber(4,0,0);					  			   //显示初始分数。
	vNewBlock();									   //新建方块。
	b_DownStart=1;									   //开启定时器定时下降。
} 
//*************************************************************************************************
//*																								  *
//*			 ******************************判断游戏是否结束**************************			  *
//*																								  *
//*************************************************************************************************
unsigned char ucIsGameOver()
{
	unsigned char ucCount,ucCountTwo;

	for(ucCount=0;ucCount<12;ucCount++)
		if(ucReadBlock(0,ucCount)==1)
			{
			if(uc_BlockType==TYPETHREE&&(uc_BlockState==STATETWO||uc_BlockState==STATEFOUR))
				{
				for(ucCountTwo=3;ucCountTwo<8;ucCountTwo++)
					if(ucReadBlock(2,ucCountTwo)==1)
						return 1;

				}
			else
				{
				for(ucCountTwo=3;ucCountTwo<8;ucCountTwo++)
					if(ucReadBlock(1,ucCountTwo)==1)
						return 1;
				}
			}
	return 0;
}


//*************************************************************************************************
//*																								  *
//*			 ******************************游戏结束处理函数**************************			  *
//*																								  *
//*************************************************************************************************
void vGameOver()
{
	b_DownStart=0;
	vGameInitialize();
}

//*************************************************************************************************
//*																								  *
//*			 ******************************游戏动作处理函数****************************			  *
//*																								  *
//*************************************************************************************************
void vBlockAction(unsigned char ucAction)
{
	unsigned char ucCount;

	if(ucMoveDecide(ucAction))		   //判断方块是否可以移动。
		{
		vMoveBlock(ucAction);		   //如果可以,则移动方块。
		if(uc_BlockLine<3)			   //此处是为了弥补移动方块时可能产生的错误。
			for(ucCount=1;ucCount<7;ucCount++)
				{
				CS1=1;
				CS2=0;
				vWriteCMD(LCDPAGE+ucCount);
				vWriteCMD(LCDLINE+FRAMELEFT);
				vWriteData(0xFF);
				vWriteData(0xFF);
				}
		}
	else
		if(ucAction==ACTIONDOWN)
			{
			if(ucIsGameOver())
				vGameOver();
			else
				{
				vGetMark();
				vNewBlock();
				}
			}
}

⌨️ 快捷键说明

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