📄 game.h
字号:
#include "stdlib.h"
#include "time.h"
int FanKai_Type[19]={0x0145,
0x0489,0x4568,0x0159,0x2456,
0x0156,0x4815,
0x048C,0x89AB,
0x0152,0x1459,0x589A,0x0485,
0x4512,0x0459,
0x1589,0x0456,0x0481,0x456A
};//储存19种方块类型的信息,用于计算出方块的坐标.
enum{A,B1,B2,B3,B4,C1,C2,D1,D2,
E1,E2,E3,E4,F1,F2,G1,G2,G3,G4};
enum FKCOLOR{NONE,RED,BLUE,GREEN,XIAORED,XIAOGREEN,
YELLOW,XIAOBLUE,ZI,XIAOZI};//方块信息。
struct FKSTRUCH{int fktype_nIndex;
FKCOLOR fkcolor;
int x;
int y;
};//方块信息组构体.
enum{START,PLAY,PAUSE,STOP,AUTOSTOP};
///////////////////////////全局变量.
int DS_FanKai[20][20]={NONE};//此二维数组储存的是屏幕上第个方块位的方块信息。
BOOL FullFK[20]={FALSE};
FKSTRUCH ThisFK,LastFK;
int GameStatus=START;
BOOL IsStop=TRUE;
int num=0;
///////////////////////////
void FKtoDS(FKSTRUCH& fk,FKCOLOR fkcolor)
{
int type=FanKai_Type[fk.fktype_nIndex];
int X[4]={0},Y[4]={0},i=0;
int temp,CuShu=0x000F;
while(i<4){
temp=type&CuShu;
switch(temp){
case 0x0000:X[i]=fk.x;Y[i]=fk.y;break;
case 0x0001:X[i]=fk.x+1;Y[i]=fk.y;break;
case 0x0002:X[i]=fk.x+2;Y[i]=fk.y;break;
case 0x0003:X[i]=fk.x+3;Y[i]=fk.y;break;
case 0x0004:X[i]=fk.x;Y[i]=fk.y+1;break;
case 0x0005:X[i]=fk.x+1;Y[i]=fk.y+1;break;
case 0x0006:X[i]=fk.x+2;Y[i]=fk.y+1;break;
case 0x0007:X[i]=fk.x+3;Y[i]=fk.y+1;break;
case 0x0008:X[i]=fk.x;Y[i]=fk.y+2;break;
case 0x0009:X[i]=fk.x+1;Y[i]=fk.y+2;break;
case 0x000A:X[i]=fk.x+2;Y[i]=fk.y+2;break;
case 0x000B:X[i]=fk.x+3;Y[i]=fk.y+2;break;
case 0x000C:X[i]=fk.x;Y[i]=fk.y+3;break;
case 0x000D:X[i]=fk.x+1;Y[i]=fk.y+3;break;
case 0x000E:X[i]=fk.x+2;Y[i]=fk.y+3;break;
case 0x000F:X[i]=fk.x+3;Y[i]=fk.y+3;break;
}
if(Y[i]<0){
type/=16;
i++;
continue;
}
if(X[i]>=20||Y[i]>19){
fk=LastFK;
IsStop=FALSE;
type=FanKai_Type[fk.fktype_nIndex];
i=0;
continue;
}
if(fkcolor!=NONE){
if(DS_FanKai[X[i]][Y[i]]!=NONE){
fk=LastFK;
IsStop=FALSE;
type=FanKai_Type[fk.fktype_nIndex];
i=0;
continue;
}
if(DS_FanKai[X[i]][Y[i]+1]||Y[i]==19)
IsStop=TRUE;
}
type/=16;
i++;
}
for(i=0;i<4;i++)
if(Y[i]>=0)
DS_FanKai[X[i]][Y[i]]=fkcolor;
}
int Rand(int min,int max,int s=0)
{
int r;
srand((unsigned int)time(NULL)+s);
r=rand()%max;
if(r<min) r=min+r%(max-min);
return r;
}
void InitFK()
{
static int s;
for(int i=0;i<20;i++)
if(DS_FanKai[i][0]!=NONE){
GameStatus=AUTOSTOP;
return;
}
ThisFK.fktype_nIndex=Rand(0,18);
ThisFK.fkcolor=(FKCOLOR)Rand(1,9,s);
ThisFK.x=Rand(0,15);
ThisFK.y=-3;
LastFK=ThisFK;
IsStop=FALSE;
s=Rand(0,333);
}
void MoveFK(int move_type)
{
LastFK=ThisFK;
if(move_type==0){
switch(ThisFK.fktype_nIndex){
case A: break;
case B1:ThisFK.fktype_nIndex=B2;break;
case B2:ThisFK.fktype_nIndex=B3;break;
case B3:ThisFK.fktype_nIndex=B4;break;
case B4:ThisFK.fktype_nIndex=B1;break;
case C1:ThisFK.fktype_nIndex=C2;break;
case C2:ThisFK.fktype_nIndex=C1;break;
case D1:ThisFK.fktype_nIndex=D2;break;
case D2:ThisFK.fktype_nIndex=D1;break;
case E1:ThisFK.fktype_nIndex=E2;break;
case E2:ThisFK.fktype_nIndex=E3;break;
case E3:ThisFK.fktype_nIndex=E4;break;
case E4:ThisFK.fktype_nIndex=E1;break;
case F1:ThisFK.fktype_nIndex=F2;break;
case F2:ThisFK.fktype_nIndex=F1;break;
case G1:ThisFK.fktype_nIndex=G2;break;
case G2:ThisFK.fktype_nIndex=G3;break;
case G3:ThisFK.fktype_nIndex=G4;break;
case G4:ThisFK.fktype_nIndex=G1;break;
}
}
if(move_type==1){
if(ThisFK.x>0)
ThisFK.x--;
}
if(move_type==2){
if(ThisFK.y<19)
ThisFK.y++;
}
if(move_type==3){
if(ThisFK.x<19)
ThisFK.x++;
}
FKtoDS(LastFK,NONE);
FKtoDS(ThisFK,ThisFK.fkcolor);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -