俄罗斯方块 with C++ and ege

#include<iostream>
#include<graphics.h>
#include<conio.h>
#include<windows.h>
#include<stdlib.h>
#include<ctime>
#pragma comment(lib,"Winmm.lib")
#define wall_width 15
#define rock_width 20
#define under_width 23
#define width 230
#define rwidth 200
int level=30;	//初始化睡眠时间为30 
int _time=0;
int m=0;	//用于记录横坐标偏移量
int kind=rand()%7;	//方块的种类标记
int a,b,c;	//方块颜色 
int score=0;	//分数 

//随机生成方块的七种基本形状中的一种 
int randNum(){
	srand((unsigned)time(0));
	int a=rand()%7;
	return a;
}

//方块结构体,用一个元素个数都为4的二维数组表示方块4*4的结构 
struct Rock{
	bool _rock[4][4];
}initR[19];

char clear(){
	rewind(stdin);
	char ch=getch();
	return ch;
}

//画围墙 
void initWall(){
	for(int i=0;i<20;i++){
		setfillcolor(EGERGB(0xff,0xff,0xaa));
		bar(0,i*rock_width,wall_width,(i+1)*rock_width);
		bar(width-wall_width+1,i*rock_width,width+1,(i+1)*rock_width);
	}
	for(int i=0;i<10;i++){
		bar(i*under_width,20*rock_width+2,(i+1)*under_width,21*rock_width-3);
	}
	bar(0,20*rock_width,wall_width,20*rock_width+2);
	bar(width-wall_width+1,20*rock_width,width+1,20*rock_width+2);
	bar(width,20*rock_width+2,width+1,21*rock_width-3);
}

//不同睡眠时间对应等级
void levelchange(){
	if(level==5){
		outtextxy(370,150,"9");
	}else if(level==10){
		outtextxy(370,150,"8");
	}else if(level==15){
		outtextxy(370,150,"7");
	}else if(level==20){
		outtextxy(370,150,"6");
	}else if(level==25){
		outtextxy(370,150,"5");
	}else if(level==30){
		outtextxy(370,150,"4");
	}else if(level==35){
		outtextxy(370,150,"3");
	}else if(level==40){
		outtextxy(370,150,"2");
	}else if(level==45){
		outtextxy(370,150,"1");
	}
}

//十九种方块对应的点阵
void rockStruct(){
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			if(j==1){
				initR[0]._rock[i][j]=1;
			} else{
				initR[0]._rock[i][j]=0;
			}	//横直线型
			if(i==0&&j==0||i==1&&j==0||i==0&&j==1||i==1&&j==1){
				initR[1]._rock[i][j]=1;
			}else{
				initR[1]._rock[i][j]=0;
			}	//田字型 
			if(j==0&&i!=3||i==1&&j==1){
				initR[2]._rock[i][j]=1;
			}else{
				initR[2]._rock[i][j]=0;
			}	//正T型 
			if(j==0&&i!=3||i==0&&j==1){
				initR[3]._rock[i][j]=1;
			}else{
				initR[3]._rock[i][j]=0;
			}	//L顺时针旋转90度型 
			if(j==0&&i!=3||i==2&&j==1){
				initR[4]._rock[i][j]=1;
			}else{
				initR[4]._rock[i][j]=0;
			}	//反L逆时针旋转90度型 
			if(i==0&&j==0||i==1&&j==0||i==1&&j==1||i==2&&j==1){
				initR[5]._rock[i][j]=1;
			}else{
				initR[5]._rock[i][j]=0;
			}	//正Z型 
			if(i==1&&j==0||i==2&&j==0||i==0&&j==1||i==1&&j==1){
				initR[6]._rock[i][j]=1;
			}else{
				initR[6]._rock[i][j]=0;
			}	//反Z型 
			if(i==1){
				initR[7]._rock[i][j]=1;
			}else{
				initR[7]._rock[i][j]=0;
			}	//竖直线型 
			if(i==1&&j!=3||i==0&&j==1){
				initR[8]._rock[i][j]=1;
			}else{
				initR[8]._rock[i][j]=0;
			}	//指左T型 
			if(i==0&&j!=3||i==1&&j==1){
				initR[9]._rock[i][j]=1;
			}else{
				initR[9]._rock[i][j]=0;
			}	//指右T型 
			if(j==1&&i!=3||i==1&&j==0){
				initR[10]._rock[i][j]=1;
			}else{
				initR[10]._rock[i][j]=0;
			}	//倒T型 
			if(i==0&&j!=3||i==1&&j==2){
				initR[11]._rock[i][j]=1;
			}else{
				initR[11]._rock[i][j]=0;
			}	//正L型 
			if(i==1&&j!=3||i==0&&j==0){
				initR[12]._rock[i][j]=1;
			}else{
				initR[12]._rock[i][j]=0;
			}	//L旋转180度型 
			if(j==1&&i!=3||i==2&&j==0){
				initR[13]._rock[i][j]=1;
			}else{
				initR[13]._rock[i][j]=0;
			}	//L逆时针旋转90度型 
			if(i==1&&j!=3||i==0&&j==2){
				initR[14]._rock[i][j]=1;
			}else{
				initR[14]._rock[i][j]=0;
			}	//反L型 
			if(j==1&&i!=3||i==0&&j==0){
				initR[15]._rock[i][j]=1;
			}else{
				initR[15]._rock[i][j]=0;
			}	//反L顺时针旋转90度型 
			if(i==0&&j!=3||i==1&&j==0){
				initR[16]._rock[i][j]=1;
			}else{
				initR[16]._rock[i][j]=0;
			}	//反L旋转180度型 
			if(i==1&&j==0||i==1&&j==1||i==0&&j==1||i==0&&j==2){
				initR[17]._rock[i][j]=1;
			}else{
				initR[17]._rock[i][j]=0;
			}	//异正Z型
			if(i==0&&j==0||i==0&&j==1||i==1&&j==1||i==1&&j==2){
				initR[18]._rock[i][j]=1;
			}else{
				initR[18]._rock[i][j]=0;
			}	//异反Z型 
		}
	}
}

//实时分数转化为字符串类型并在固定位置显示方程,分数大于等于0 
int scoreToString(int x){
    setfillcolor(BLACK);
	bar(340,170,450,185);
	int n=0;
	int i=1;
	while(x/i>0){
		n++;
		i*=10;
	}
	char ch[n];
	if(x==0){
		setfont(17,8,"幼圆");
		setcolor(EGERGB(0xff,0x99,0x22));
		outtextxy(340,170,'0');
		return 0;
	}
	int l=0;
	i/=10;
	for(int j=0;j<n;j++){
		if(x/i==1){
			ch[j]='1';
		}else if(x/i==2){
			ch[j]='2';
		}else if(x/i==3){
			ch[j]='3';
		}else if(x/i==4){
			ch[j]='4';
		}else if(x/i==5){
			ch[j]='5';
		}else if(x/i==6){
			ch[j]='6';
		}else if(x/i==7){
			ch[j]='7';
		}else if(x/i==8){
			ch[j]='8';
		}else if(x/i==9){
			ch[j]='9';
		}else if(x/i==0){
			ch[j]='0';
		}
		x=x%i;
		i/=10;
	}
	for(int j=0;j<n;j++){
		setfont(15,7,"幼圆");
		setcolor(EGERGB(0xff,0x99,0x22));
		outtextxy(340+j*8,170,ch[j]);
	}
	return 1;
} 

//最大分数转化为字符串类型并在固定位置显示方程,分数大于等于0 
int maxToString(int x){
    setfillcolor(BLACK);
	bar(350,350,450,365);
	int n=0;
	int i=1;
	while(x/i>0){
		n++;
		i*=10;
	}
	char ch[n];
	if(x==0){
		setfont(15,7,"幼圆");
		setcolor(EGERGB(0x15,0xdd,0xe4));
		outtextxy(350,350,"0"); 
		return 0;
	}
	int l=0;
	i/=10;
	for(int j=0;j<n;j++){
		if(x/i==1){
			ch[j]='1';
		}else if(x/i==2){
			ch[j]='2';
		}else if(x/i==3){
			ch[j]='3';
		}else if(x/i==4){
			ch[j]='4';
		}else if(x/i==5){
			ch[j]='5';
		}else if(x/i==6){
			ch[j]='6';
		}else if(x/i==7){
			ch[j]='7';
		}else if(x/i==8){
			ch[j]='8';
		}else if(x/i==9){
			ch[j]='9';
		}else if(x/i==0){
			ch[j]='0';
		}
		x=x%i;
		i/=10;
	}
	for(int j=0;j<n;j++){
		setfont(15,7,"幼圆");
		setcolor(EGERGB(0x15,0xdd,0xe4));
		outtextxy(350+j*8,350,ch[j]);
	}
	return 1;
} 

//沉底确定的方块 
struct FinalRock{
	int finalX;
	int finalY;
	bool alive;
	bool used;
}finalRock[200];	//理论上200为方块最大可能存在数 
int fr_len=0;

bool flag2=0,flag3=0;
bool change[18]={0};
//方块的各种行为
void rockAction(int &n){	//此处的引用符号“&”非常重要 
	if(kbhit()){
		char c=clear();
		switch(c){
			case 'a':	//左移 
			case 'A':
				if(flag3==0){
					m-=rock_width;break;
				}else break;
			case 'd':	//右移 
			case 'D':
				if(flag2==0){
					m+=rock_width;break;
				}else break;
			case 's':	//加速 
			case 'S':
				if(_time!=0){
					_time-=5;
				}
				break;
			case 'f':	//恢复原速 
			case 'F':
				_time=level;break;
			case 'w':	//变形
			case 'W':
				if(change[0]==0&&n==0){
					n=7;
				}else if(change[1]==0&&n==7){
					n=0;
				}else if(change[2]==0&&n==2){
					n=8;
				}else if(change[3]==0&&n==8){
					n=10;
				}else if(change[4]==0&&n==10){
					n=9;
				}else if(change[5]==0&&n==9){
					n=2;
				}else if(change[6]==0&&n==3){
					n=12;
				}else if(change[7]==0&&n==12){
					n=13;
				}else if(change[8]==0&&n==13){
					n=11;
				}else if(change[9]==0&&n==11){
					n=3;
				}else if(change[10]==0&&n==4){
					n=14;
				}else if(change[11]==0&&n==14){
					n=15;
				}else if(change[12]==0&&n==15){
					n=16;
				}else if(change[13]==0&&n==16){
					n=4;
				}else if(change[14]==0&&n==5){
					n=17;
				}else if(change[15]==0&&n==17){
					n=5;
				}else if(change[16]==0&&n==6){
					n=18;
				}else if(change[17]==0&&n==18){
					n=6;
				}break;
			case 'r':	//刷新界面 
			case 'R':
				for(int i=0;i<fr_len;i++){
					finalRock[i].alive=0;
				}
				fr_len=0;
				setfillcolor(BLACK);
				bar(wall_width,0,wall_width+10*rock_width,20*rock_width);
				score=0;
				scoreToString(score);
				getch();
				break;
			case ' ':	//暂停 
				getch();break;
			default:
				break;
		}	
	}
} 


//下界分类
int xiajie(int n){
	int underline;
	if(n==0||n==1||n==2||n==3||n==4||n==5||n==6||n==10||n==13||n==15){
		underline=19*rock_width;
	}else if(n==8||n==9||n==11||n==12||n==14||n==16||n==17||n==18){
		underline=18*rock_width;
	}else if(n==7){
		underline=17*rock_width;
	}
	return underline;
} 


int it=0;
int x=0,y=0,initx=0,inity=0;
//设置左右屏障
void lrObstacle(int n){
	//左屏障 
	if(n!=7){
		if(m==(-3)*rock_width){
			flag3=1;
		}
	}else{
		if(m==(-4)*rock_width){
			flag3=1;
		}
	}
	
	//右屏障 
	if(n==0){
		if(m==3*rock_width){
			flag2=1;
		}
	}else if(n==1||n==8||n==9||n==11||n==12||n==14||n==16||n==17||n==18){
		if(m==5*rock_width){
			flag2=1;
		}
	}else if(n==2||n==3||n==4||n==5||n==6||n==10||n==13||n==15){
		if(m==4*rock_width){
			flag2=1;
		}
	}else if(n==7){
		if(m==5*rock_width){
			flag2=1;
		}
	}
} 

//右边提示下一个即将出现的方块
void nextRock(int n){
	rockStruct();
	int _initx;
	int _inity;
	setfillcolor(BLACK);
	bar(320,250,320+4*rock_width,250+4*rock_width);
	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			if(initR[n]._rock[i][j]==1){   //若数组元素为1,则在此位置画小方块 
				_initx=i*rock_width+320;
				_inity=j*rock_width+250;
				setfillcolor(EGERGB(0xaa,0xaa,0xaa));
				bar(_initx,_inity,_initx+rock_width,_inity+rock_width);
				//画方块的方框 
				setcolor(BLACK);
				line(_initx,_inity,_initx+rock_width,_inity);
				line(_initx+rock_width,_inity,_initx+rock_width,_inity+rock_width);
				line(_initx+rock_width,_inity+rock_width,_initx,_inity+rock_width);
				line(_initx,_inity+rock_width,_initx,_inity);
			}
		}
	}
}

//禁止改变方程(若方块变形与沉底方块或围墙冲突则禁止变形) 
void ifChange(int p,int q,int l,int n){
	change[l]=0;
	for(x=0;x<4;x++){
		for(y=0;y<4;y++){
			if(n==p){
				if(initR[q]._rock[x][y]==1){
					initx=x*rock_width+wall_width+3*rock_width+m;
					inity=(y-1)*rock_width+it;
					if(inity>19*rock_width||initx<wall_width||initx>wall_width+9*rock_width){
						change[l]=1;
					}
					for(int i=0;i<fr_len;i++){
						if(finalRock[i].alive==1&&initx==finalRock[i].finalX&&(inity+rock_width>finalRock[i].finalY&&inity<finalRock[i].finalY||inity>finalRock[i].finalY&&inity+rock_width<finalRock[i].finalY)){
							change[l]=1;
						}
					}
				}
			}
		}
	}
} 

//画方块方程
void drawRock(int p,int q){
	srand((unsigned)time(0));
	a=rand()%256,b=rand()%256,c=rand()%256;
	setfillcolor(RGB(a,b,c));
	bar(p,q,p+rock_width,q+rock_width);
	//画方块的方框 
	setcolor(BLACK);
	line(p,q,p+rock_width,q);
	line(p+rock_width,q,p+rock_width,q+rock_width);
	line(p+rock_width,q+rock_width,p,q+rock_width);
	line(p,q+rock_width,p,q);
}

//历史最高纪录显示方程
void bestScore(){
	FILE *out=fopen("ScoreBase.txt","a+");
	fclose(out);
	FILE *open;
	open=fopen("ScoreBase.txt","rb");
	if(open==NULL){
		printf("can not open the file!\n");
		exit(1); 
	}
	int _max=0;
	int f_len=0;
	while(getw(open)!=-1) f_len++;
	rewind(open);
	int score_temp[f_len];
	for(int i=0;i<f_len;i++){
		score_temp[i]=getw(open);
	}
	for(int i=0;i<f_len;i++){
		if(_max<score_temp[i]) _max=score_temp[i];
	}
	maxToString(_max);
	setfont(15,7,"幼圆");
	setcolor(EGERGB(0x15,0xdd,0xe4));
	outtextxy(250,350,"历史最高纪录:");
	rewind(open);
	fclose(open);
} 

//是否破纪录
void ifBreakRecord(int n){
	FILE *out;
	out=fopen("ScoreBase.txt","a+");
	putw(n,out);
	fclose(out);
	FILE *in;
	in=fopen("ScoreBase.txt","rb");
	int file_len=0;
	while(getw(in)!=-1) file_len++;
	int _n[file_len];
	rewind(in);
	for(int i=0;i<file_len-1;i++){
		_n[i]=getw(in);
	}
	rewind(in);
	int max=getw(in);
	rewind(in);
	fclose(in);
	for(int i=0;i<file_len-1;i++){
		if(max<_n[i]) max=_n[i];
	}
	if(n>max){
		setfont(35,16,"幼圆");
		setcolor(EGERGB(0xff,0x44,0x44));
		outtextxy(100,130,"恭喜创下新纪录!");
	}
} 

bool rmline=0;
int rmLineNum=0;
//主体程序 
void play(){
	rockStruct();
	int b=0;
	score=0;
	kind=randNum();
	while(1){
		scoreToString(score);
		m=0;
		b=kind;
		kind=randNum();
		nextRock(kind);
		int _xiajie=17*rock_width;
		_time=level;
		for(it=0;it<=_xiajie;it++){
			rockAction(b);
			flag2=0,flag3=0;
			_xiajie=xiajie(b);
			lrObstacle(b);
			//生成方块 
			bool flag1=0;
			for(x=0;x<4;x++){
				for(y=0;y<4;y++){
					if(initR[b]._rock[x][y]==1){   //若数组元素为1,则在此位置画小方块 
						initx=x*rock_width+wall_width+3*rock_width+m;
						inity=(y-1)*rock_width+it;
						for(int i=0;i<fr_len;i++){
							if(finalRock[i].alive==1&&initx==finalRock[i].finalX&&inity+rock_width==finalRock[i].finalY){
								//判断是否掉到前面的方块上方 
								flag1=1;
							}else if(finalRock[i].alive==1&&initx+rock_width==finalRock[i].finalX&&inity>finalRock[i].finalY-rock_width&&inity<finalRock[i].finalY+rock_width){
								//判断是否与前面的方块碰壁(不让右移) 
								flag2=1;
							}else if(finalRock[i].alive==1&&initx-rock_width==finalRock[i].finalX&&inity>finalRock[i].finalY-rock_width&&inity<finalRock[i].finalY+rock_width){
								//判断是否与前面的方块碰壁(不让左移) 
								flag3=1;
							}
						}
					}
				}
			}
			ifChange(0,7,0,b);
			ifChange(7,0,1,b);
			ifChange(2,8,2,b);
			ifChange(8,10,3,b);
			ifChange(10,9,4,b);
			ifChange(9,2,5,b);
			ifChange(3,12,6,b);
			ifChange(12,13,7,b);
			ifChange(13,11,8,b);
			ifChange(11,3,9,b);
			ifChange(4,14,10,b);
			ifChange(14,15,11,b);
			ifChange(15,16,12,b);
			ifChange(16,4,13,b);
			ifChange(5,17,14,b);
			ifChange(17,5,15,b);
			ifChange(6,18,16,b);
			ifChange(18,6,17,b);
			for(x=0;x<4;x++){
				for(y=0;y<4;y++){
					if(initR[b]._rock[x][y]==1){   //若数组元素为1,则在此位置画小方块 
						initx=x*rock_width+wall_width+3*rock_width+m;
						inity=(y-1)*rock_width+it;
						drawRock(initx,inity);
					}
				}
			}
			if(flag1==1&&rmline==0) break;
			rmline=0;
			Sleep(_time);
			//清除原方块 
			for(x=0;x<4;x++){
				for(y=0;y<4;y++){
					if(initR[b]._rock[x][y]==1){
						initx=x*rock_width+wall_width+3*rock_width+m;
						inity=(y-1)*rock_width+it;
						setfillcolor(BLACK);	//用背景色掩盖 
						bar(initx,inity,initx+rock_width,inity+rock_width);
					}
				}
			}
		}
		for(x=0;x<4;x++){
			for(y=0;y<4;y++){
				if(initR[b]._rock[x][y]==1){
					finalRock[fr_len].finalX=x*rock_width+wall_width+3*rock_width+m;
					finalRock[fr_len].finalY=(y-1)*rock_width+it;
					finalRock[fr_len].alive=1;
					fr_len++;
				}
			}
		}
		int temp10[10]={0};
		rmLineNum=0;
		for(int i=0;i<fr_len;i++){
			int x_len=1;
			int temp10_len=0;
			for(int j=0;j<10;j++){
				temp10[j]=0;
			}
			for(int j=i+1;j<fr_len;j++){
				if(finalRock[i].finalY==finalRock[j].finalY&&finalRock[i].alive==1&&finalRock[j].alive==1){
					x_len++;
					temp10[0]=i;
					temp10_len++;
					temp10[temp10_len]=j;
				}
			}
			if(x_len==10){
				rmline=1;
				rmLineNum++;
				for(int j=0;j<10;j++){
					finalRock[temp10[j]].alive=0;
					finalRock[temp10[j]].used=0;
				}
			}
		}
		//Sleep(_time);
		
		//分数增加机制 
		if(rmLineNum==1){
			score++;
		}else if(rmLineNum==2){
			score+=4;
		}else if(rmLineNum==3){
			score+=7;
		}else if(rmLineNum==4){
			score+=12;
		}
		
		//消行机制 
		if(rmline==1){
			int i,j;
			setfillcolor(BLACK);
			bar(wall_width,0,wall_width+rwidth,20*rock_width+1);
			Sleep(200);
			int temp=0;
			for(i=0;i<fr_len;i++){
				if(finalRock[i].alive==0&&finalRock[i].used==0){
					temp=i;
					break;
				}
			}
			int temp2[2]={0};
			int temp3[3]={0};
			if(rmLineNum==2){
				for(j=0;j<fr_len;j++){
					if(finalRock[j].alive==0&&finalRock[j].used==0){
						temp2[0]=finalRock[j].finalY;
						break;
					}
				}
				for(j=0;j<fr_len;j++){
					if(finalRock[j].alive==0&&finalRock[j].used==0&&finalRock[j].finalY!=temp2[0]){
						temp2[1]=finalRock[j].finalY;
						break;
					}
				}
			}
			if(rmLineNum==3){
				for(j=0;j<fr_len;j++){
					if(finalRock[j].alive==0&&finalRock[j].used==0){
						temp3[0]=finalRock[j].finalY;
						break;
					}
				}
				for(j=0;j<fr_len;j++){
					if(finalRock[j].alive==0&&finalRock[j].used==0&&finalRock[j].finalY!=temp3[0]){
						temp3[1]=finalRock[j].finalY;
						break;
					}
				}
				for(j=0;j<fr_len;j++){
					if(finalRock[j].alive==0&&finalRock[j].used==0&&finalRock[j].finalY!=temp3[0]&&finalRock[j].finalY!=temp3[1]){
						temp3[2]=finalRock[j].finalY;
						break;
					}
				}
				int tempChar=temp3[0];
				for(j=0;j<3;j++){
					for(int k=j+1;k<3;k++){
						if(temp3[j]>temp3[k]){
							tempChar=temp3[j];
							temp3[j]=temp3[k];
							temp3[k]=tempChar;
						}
					}
				}
			}
			for(i=0;i<fr_len;i++){
				if(finalRock[i].alive==0&&finalRock[i].used==0){
					finalRock[i].used=1;
				}
			}
			for(j=0;j<fr_len;j++){
				if(rmLineNum==1||rmLineNum==4){
					if(finalRock[j].alive==1&&finalRock[j].finalY<finalRock[temp].finalY){
						if(rmLineNum==1){
							finalRock[j].finalY+=rock_width;
						}else if(rmLineNum==4){
							finalRock[j].finalY=finalRock[j].finalY+4*rock_width; 
						}
						drawRock(finalRock[j].finalX,finalRock[j].finalY);		
					}else if(finalRock[j].alive==1&&finalRock[j].finalY>finalRock[temp].finalY){
						drawRock(finalRock[j].finalX,finalRock[j].finalY);
					}
				}else if(rmLineNum==2||rmLineNum==3){
					if(rmLineNum==2){
						int tempBetween=0,tempUnder=0,tempBetweenUp=0,tempBetweenUnder=0;
						bool between1=0,between2=0;
						if(temp2[0]>temp2[1]&&temp2[0]-2*rock_width==temp2[1]){
							between1=1;
							tempBetween=temp2[0]-rock_width;
						}else if(temp2[0]<temp2[1]&&temp2[0]+2*rock_width==temp2[1]){
							between1=1;
							tempBetween=temp2[0]+rock_width;
						}else if(temp2[0]>temp2[1]&&temp2[0]-3*rock_width==temp2[1]){
							between2=1;
							tempBetweenUp=temp2[1]+rock_width;
							tempBetweenUnder=temp2[1]+2*rock_width;
						}else if(temp2[0]<temp2[1]&&temp2[0]+3*rock_width==temp2[1]){
							between2=1;
							tempBetweenUp=temp2[1]-2*rock_width;
							tempBetweenUnder=temp2[1]-rock_width;
						}
						if(between1==1){
							if(finalRock[j].alive==1&&finalRock[j].finalY==tempBetween){
								finalRock[j].finalY+=rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY<tempBetween){
								finalRock[j].finalY=finalRock[j].finalY+2*rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY>tempBetween){
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}
						}else if(between2==1){
							if(finalRock[j].alive==1&&(finalRock[j].finalY==tempBetweenUp||finalRock[j].finalY==tempBetweenUnder)){
								finalRock[j].finalY+=rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY<tempBetweenUp){
								finalRock[j].finalY=finalRock[j].finalY+2*rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY>tempBetweenUnder){
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}
						}else{
							if(finalRock[j].alive==1&&finalRock[j].finalY<finalRock[temp].finalY){
								finalRock[j].finalY=finalRock[j].finalY+2*rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY>finalRock[temp].finalY){
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}
						}
					}else if(rmLineNum==3){
						bool between1=0,between2=0;
						int tempBetween=0;
						if(temp3[0]+rock_width==temp3[1]&&temp3[1]+2*rock_width==temp3[2]){
							between1=1;
							tempBetween=temp3[1]+rock_width; 
						}else if(temp3[0]+2*rock_width==temp3[1]){
							between2=1;
							tempBetween=temp3[0]+rock_width;
						}
						if(between1==1){
							if(finalRock[j].alive==1&&finalRock[j].finalY==tempBetween){
								finalRock[j].finalY+=rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY<tempBetween){
								finalRock[j].finalY=finalRock[j].finalY+3*rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY>tempBetween){
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}
						}else if(between2==1){
							if(finalRock[j].alive==1&&finalRock[j].finalY==tempBetween){
								finalRock[j].finalY=finalRock[j].finalY+2*rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY<tempBetween){
								finalRock[j].finalY=finalRock[j].finalY+3*rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY>tempBetween){
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}
						}else{
							if(finalRock[j].alive==1&&finalRock[j].finalY<finalRock[temp].finalY){
								finalRock[j].finalY=finalRock[j].finalY+3*rock_width;
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}else if(finalRock[j].alive==1&&finalRock[j].finalY>finalRock[temp].finalY){
								drawRock(finalRock[j].finalX,finalRock[j].finalY);
							}
						}
					}
				}
			}
			
		}else{
			for(int j=0;j<fr_len;j++){
				if(finalRock[j].alive==1){
					drawRock(finalRock[j].finalX,finalRock[j].finalY);
				}
			}
		}
		//判断游戏是否结束
		bool breakOut=0;
		for(int i=0;i<fr_len;i++){
			if(finalRock[i].alive==1&&finalRock[i].finalX>=wall_width+3*rock_width&&finalRock[i].finalX<=wall_width+6*rock_width&&finalRock[i].finalY<rock_width){
				breakOut=1;
				break;
			}
		}
		
		//被消方块剔除算法(数组finalRock中,若方块alive=0且used=1,后面的方块逐一前移) 
		if(rmline==1){
			for(int i=0;i<fr_len;i++){
				if(finalRock[i].alive==0&&finalRock[i].used==1){
					fr_len--;
					for(int j=i;j<fr_len;j++){
						finalRock[j].alive=finalRock[j+1].alive;
						finalRock[j].finalX=finalRock[j+1].finalX;
						finalRock[j].finalY=finalRock[j+1].finalY;
						finalRock[j].used=finalRock[j+1].used;
					}
				}
			}
		}
		
		if(breakOut==1){
			setfont(25,12,"幼圆");
			setcolor(EGERGB(0x15,0xdd,0xe4));
			outtextxy(70,120,"游戏结束!");
			break;
		}
	}
	ifBreakRecord(score);
}

//画界面
void initjiemian(){
	bestScore();
	setfont(15,7,"幼圆");
	setcolor(EGERGB(0x15,0xdd,0xe4));
	outtextxy(250,30,"按空格键开始/暂停游戏");
	outtextxy(250,50,"按R键刷新界面");
	outtextxy(250,70,"按W键变形,S键加速,F键变为原速"); 
	outtextxy(250,90,"按A/D键左右移动"); 
	outtextxy(250,110,"按+、-键调节难度");
	outtextxy(300,150,"难度级别:");
	outtextxy(300,170,"得分:");
	outtextxy(250,200,"下一个:");
	outtextxy(250,400,"版权公告|611上官姬霸版权所有"); 
	outtextxy(370,150,"4");
	for(;;){
		char b=clear();
		switch(b){
			case '+':
				if(level!=5){
					level-=5;
					levelchange();
				}
				break;
			case '-':
				if(level!=50){
					level+=5;
					levelchange();
				}
				break;
			default:
				break;
		}
		if(b==' ') break;
	}
} 

//主函数
int main(){
	initgraph(480,420);
	initWall();
	initjiemian();
	mciSendString("open background.mp3 alias mymusic", NULL, 0, NULL);
	mciSendString("play mymusic", NULL, 0, NULL);
	play();
	getch();
	closegraph();
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值