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