📄 gameprocess.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 + -