⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.h

📁 游戏俄罗斯方块源程序
💻 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 + -