getmark.c

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

C
184
字号
//*************************************************************************************************
//*																								  *
//*			 **********************************获取分数处理函数*************************		  *
//*																								  *
//*************************************************************************************************
#include "LCD12864.h"
#include "GameProcess.h"
#include "GameGraph.h"

extern unsigned int ui_GameMark;

unsigned char uca_BlockScan[5];		//存储满行的行号。
unsigned char uc_ScanNumber;		//存储满行行数。

//*************************************************************************************************
//*																								  *
//*			 **********************************扫描指定行******************************			  *
//*																								  *
//*************************************************************************************************
unsigned char ucScanRow(unsigned char ucRow)	//0-改行为填满;
{												//1-改行被填满。
	unsigned char ucCount;
	for(ucCount=0;ucCount<12;ucCount++)
		if(ucReadBlock(ucRow,ucCount)==0)
			return 0;
	return 1;
}


//*************************************************************************************************
//*																								  *
//*			 **********************************扫描指定行******************************			  *
//*																								  *
//*************************************************************************************************
void vBlockScan()				//扫描是否有填满的行,如果有则把行号存在数组里。				
{												
	unsigned char ucCount;
	uc_ScanNumber=0;
	if(uc_BlockRow<4)
		{
		for(ucCount=0;ucCount<=uc_BlockRow;ucCount++)
			if(ucScanRow(uc_BlockRow-ucCount+1))
				{
				uca_BlockScan[uc_ScanNumber++]=uc_BlockRow-ucCount+1;
				}
		}
	else
		{
		if(uc_BlockRow<20)
			{
			for(ucCount=0;ucCount<5;ucCount++)
				if(ucScanRow(uc_BlockRow+1-ucCount))
					{
					uca_BlockScan[uc_ScanNumber++]=uc_BlockRow-ucCount+1;
					}
			}
		else
			{
			for(ucCount=0;ucCount<4;ucCount++)
				if(ucScanRow(uc_BlockRow-ucCount))
					{
					uca_BlockScan[uc_ScanNumber++]=uc_BlockRow-ucCount;
					}
			}
		}
}


//*************************************************************************************************
//*																								  *
//*			 **********************************清除指定行******************************			  *
//*																								  *
//*************************************************************************************************
void vCleanOneRow(unsigned char ucRow)
{
	unsigned char ucCount;
	for(ucCount=0;ucCount<12;ucCount++)
		vCleanBlock(ucRow,ucCount);
}


//*************************************************************************************************
//*																								  *
//*			 *****************************把改行的上一行移动到该行*********************			  *
//*																								  *
//*************************************************************************************************
void vMoveRow(unsigned char ucRow)
{
	unsigned char ucCount;
	
	vCleanOneRow(ucRow);
	
	for(ucCount=0;ucCount<12;ucCount++)
		{
		if(ucReadBlock(ucRow-1,ucCount)==1)
			vShowBlock(ucRow,ucCount);
		}
	vCleanOneRow(ucRow-1);
}


//*************************************************************************************************
//*																								  *
//*			 **********************************获取分数1*******************************			  *
//*																								  *
//*************************************************************************************************
void vGetMarkOne()
{
	unsigned char ucCount;
	for(ucCount=uca_BlockScan[0];ucCount>0;ucCount--)
		vMoveRow(ucCount);
}


//*************************************************************************************************
//*																								  *
//*			 **********************************获取分数2*******************************			  *
//*																								  *
//*************************************************************************************************
void vGetMarkTwo()
{
	unsigned char ucCount;
	for(ucCount=uca_BlockScan[1];ucCount>0;ucCount--)
		vMoveRow(ucCount);
	for(ucCount=uca_BlockScan[0];ucCount>0;ucCount--)
		vMoveRow(ucCount);
}


//*************************************************************************************************
//*																								  *
//*			 **********************************获取分数3*******************************			  *
//*																								  *
//*************************************************************************************************
void vGetMarkThree()
{
	unsigned char ucCount;
	for(ucCount=uca_BlockScan[2];ucCount>0;ucCount--)
		vMoveRow(ucCount);
	for(ucCount=uca_BlockScan[1];ucCount>0;ucCount--)
		vMoveRow(ucCount);
	for(ucCount=uca_BlockScan[0];ucCount>0;ucCount--)
		vMoveRow(ucCount);
}


//*************************************************************************************************
//*																								  *
//*			 **********************************获取分数4*******************************			  *
//*																								  *
//*************************************************************************************************
void vGetMarkFour()
{
	unsigned char ucCount;
	for(ucCount=uca_BlockScan[3];ucCount>0;ucCount--)
		vMoveRow(ucCount);
	for(ucCount=uca_BlockScan[2];ucCount>0;ucCount--)
		vMoveRow(ucCount);
	for(ucCount=uca_BlockScan[1];ucCount>0;ucCount--)
		vMoveRow(ucCount);
	for(ucCount=uca_BlockScan[0];ucCount>0;ucCount--)
		vMoveRow(ucCount);
}


//*************************************************************************************************
//*																								  *
//*			 **********************************获取分数********************************			  *
//*																								  *
//*************************************************************************************************
void vGetMark()
{
	vBlockScan();
	switch(uc_ScanNumber)
		{
		case 0:break;
		case 1:vGetMarkOne();ui_GameMark+=1;break;			//消除1行的1分;
		case 2:vGetMarkTwo();ui_GameMark+=3;break;			//一次消除两行得3分;
		case 3:vGetMarkThree();ui_GameMark+=7;break;		//一次消除三行得7分;
		case 4:vGetMarkFour();ui_GameMark+=15;break;		//一次消除四行得15分。
		default:break;
		}
	vShowNumber(4,0,ui_GameMark);
}

⌨️ 快捷键说明

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