C语言 俄罗斯方块

C语言实现的俄罗斯方块,

仅能在windows平台编译运行。

#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<windows.h>
#define MAX_Y 30
#define MAX_X 20
#define false 0
#define true 1
int gameBox[7][4][4]={
	{	0,0,0,0,
	 	0,0,0,0,
	 	1,1,1,1,
	 	0,0,0,0,
	},
	{
		0,0,0,0,
	 	0,1,1,0,
	 	0,1,0,0,
	 	0,1,0,0,
	},
	{
		0,0,0,0,
	 	0,0,1,1,
	 	0,0,0,1,
	 	0,0,0,1,
	},
	{
		0,0,0,0,
		0,1,1,0,
		0,0,1,1,
		0,0,0,0, 
	},
	{
		0,0,0,0,
		0,0,1,1,
		0,1,1,0,
		0,0,0,0,
	},
	{
		0,0,0,0,
		0,0,1,0,
		0,1,1,1,
		0,0,0,0,
	},
	{
		0,0,0,0,
		0,1,1,0,
		0,1,1,0,
		0,0,0,0,
	}
};

int mapBox[MAX_Y+8][MAX_X+8];
int X=8,Y=0;
long t1;
int fen=0;
int change(int box[4][4],int newBox[4][4]){
	int i1,i2;
	for(i1=0;i1<4;i1++){
		for(i2=0;i2<4;i2++){
		newBox[i1][i2]=box[3-i2][i1];
		}
	}
	return 0;
}

int timer(long t){
	static int a;
	long t2=clock();
	if((t2-t1)>t){
	t1=t2;
	return 1;
	}
	return 0;
}

void gotoxy(int x, int y)
{
	COORD pos = {x,y};
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
}

int initMap(int max_y,int max_x){
	int i1,i2;
	t1=clock();
	for(i1=0;i1<max_y;i1++){
		for(i2=0;i2<max_x;i2++){
			if(i1!=MAX_Y){
				if((i2==3||i2==(MAX_X+4))&&i1<MAX_Y)mapBox[i1][i2]=1;
				else mapBox[i1][i2]=0;
			}
			else if(i2>=3&&i2<=MAX_X+4)mapBox[i1][i2]=1;
		}
	}
	return 0;
}

int drawMap(void){
	int i,i1,i2;
	gotoxy(0,0);
		for(i1=0;i1<MAX_Y+8;i1++){
			for(i2=0;i2<MAX_X+8;i2++){
				if(mapBox[i1][i2]==1)printf("■");
				else printf("  ");
			}printf("\n");
		}
	gotoxy(26*2,10);printf("分数:%d",fen);
}

int drawBox(int box[4][4],int x,int y,int mode){
	int i1,i2;
	for(i1=0;i1<4;i1++){
		for(i2=0;i2<4;i2++){
			if(box[i1][i2]==1){gotoxy((x+i2)*2,y+i1);if(mode==1)printf("□");else printf("  ");}
			
		}
	}
}

int test(int box[4][4],int x,int y){
	int i1,i2;
	for(i1=0;i1<4;i1++)
		for(i2=0;i2<4;i2++){
			 if(box[i1][i2]&mapBox[y+i1][x+i2])return 0;
		} 
	return 1;
}

int write(int box[4][4],int x,int y){
	int i1,i2;
	for(i1=0;i1<4;i1++)
		for(i2=0;i2<4;i2++){
			 mapBox[y+i1][x+i2]=box[i1][i2]||mapBox[y+i1][x+i2];
		}
	return 1;
}

int checkMap(void){
	int i1,i2,i11,i22;
	int flag=0;
	for(i1=0;i1<MAX_Y;i1++){ 
		for(i2=4;i2<25;i2++){ 
			if(mapBox[i1][i2]!=1)flag=1;
		} 
		if(flag==0){
		Beep(264,110);Beep(495,100);fen=fen+10;
			for(i11=i1;i11>0;i11--){
				for(i22=4;i22<25;i22++){
					mapBox[i11][i22]=mapBox[i11-1][i22];
				}
			}
		}
		flag=0;
	} 
}

int main(void){
	int box[4][4];
	int tempBox[4][4];
	int i1,i2,n,i,daly_time=500,life=1;
	srand((unsigned)time(NULL));
	system("mode con cols=64 lines=40");
	n=rand()%7;
	for(i1=0;i1<4;i1++)
		for(i2=0;i2<4;i2++)
		box[i1][i2]=gameBox[n][i1][i2];
	initMap(MAX_Y+8,MAX_X+8);
		drawMap();
		drawBox(box,X,Y,1);
	while(life){
		if(timer(daly_time)){
		drawBox(box,X,Y,0);
		if(test(box,X,Y+1))Y++;
			else{
				write(box,X,Y);
				drawMap();
				checkMap();
				drawMap();
				n=rand()%7;
				for(i1=0;i1<4;i1++)
					for(i2=0;i2<4;i2++)
						box[i1][i2]=gameBox[n][i1][i2];
				X=8;Y=0;
				if(!test(box,X,Y))life=0;
			}
		drawBox(box,X,Y,1);
		}
		if(kbhit()){
			switch(getch()){
				case 'w' :	if(X<4){if(test(box,4,Y)){drawBox(box,X,Y,0);X--;drawBox(box,4,Y,1);}X=4;}
							if(X>20){if(test(box,20,Y)){drawBox(box,X,Y,0);X--;drawBox(box,20,Y,1);}X=20;}
					change(box,tempBox);
								if(test(tempBox,X,Y)){
									drawBox(box,X,Y,0);
										for(i1=0;i1<4;i1++)
											for(i2=0;i2<4;i2++)
												box[i1][i2]=tempBox[i1][i2];
											drawBox(box,X,Y,1); 
							}break;
				case 's' :daly_time=10;break;
				case 'a' :if(test(box,X-1,Y)){drawBox(box,X,Y,0);X--;drawBox(box,X,Y,1);}break;
				case 'd' :if(test(box,X+1,Y)){drawBox(box,X,Y,0);X++;drawBox(box,X,Y,1);}break;
			}
		}
		else daly_time=500;
	}
	printf("\a");
	printf("你挂了!游戏结束!");
}




* *俄罗斯方块源程序 */ #include #include #include #include /*图形函数库*/ /*定义按键码*/ #define VK_LEFT 0x4b00 #define VK_RIGHT 0x4d00 #define VK_DOWN 0x5000 #define VK_UP 0x4800 #define VK_ESC 0x011b #define TIMER 0x1c /*设置中断号*/ /*定义常量*/ #define MAX_BOX 19 /*总共有19种各形态的方块*/ #define BSIZE 20 /*方块的边长是20个象素*/ #define Sys_x 160 /*显示方块界面的左上角x座标*/ #define Sys_y 25 /*显示方块界面的左上角y座标*/ #define Horizontal_boxs 10 /*水平的方向以方块为单位的长度*/ #define Vertical_boxs 15 /*垂直的方向以方块为单位的长度,也就说长是15个方块*/ #define Begin_boxs_x Horizontal_boxs/2 /*产生第一个方块时出现的起始位置*/ #define FgColor 3 /*前景颜色,如文字.2-green*/ #define BgColor 0 /*背景颜色.0-blac*/ #define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46 /*右边状态栏的x座标*/ #define false 0 #define true 1 /*移动的方向*/ #define MoveLeft 1 #define MoveRight 2 #define MoveDown 3 #define MoveRoll 4 /*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的正方形*/ /*定义全局变量*/ int current_box_numb; /*保存当前方块编号*/ int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y;/*x,y是保存方块的当前坐标的*/ int flag_newbox=false; /*是否要产生新方块的标记0*/ int speed=0; /*下落速度*/ int score=0; /*总分*/ int speed_step=30; /*每等级所需要分数*/ void interrupt (*oldtimer)(void);/* 指向原来时钟中断处理过程入口的中断处理函数指针 */ struct BOARD /*游戏底板结构,表示每个点所具有的属性*/ { int var; /*当前状态 只有0和1,1表示此点已被占用*/ int color; /*颜色,游戏底板的每个点可以拥有不同的颜色.增强美观*/ }Table_board[Vertical_boxs][Horizontal_boxs]; /*方块结构*/ struct SHAPE { char box[2]; /*一个字节等于8位,每4位来表示一个方块的一行 如:box[0]="0x88",box[1]="0xc0"表示的是: 1000 1000 1100 0000*/ int color; /*每个方块的颜色*/ int next; /*下个方块的编号*/ };
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值