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 + -
显示快捷键?