偶然发现之前的C++小游戏还有一个俄罗斯方块
发出来纪念一下


程序代码:

#include<iostream>
#include<conio.h>
#include<ctime>
#include<cstdlib>
#define N 25
#define M 10
using namespace std;
char Map[N][N],background[N][N];	//地图数组及底板数组 
int score,type,type_next,IsChange=1;	
double speed;
char dirction;						//方向 
char block_next[3][3];				//下一个方块 
struct Position{int x,y;};			//坐标结构 

struct Block{
	char block[3][3];				//方块矩阵 
	char line[3];					//实体方块底边坐标 
	int left,right,bottom;			//矩阵两边及底边坐标 
	int cnt;						//变形样式 
	int left_boundry,right_boundry;
}one;
void Hello(){						//欢迎界面及地图初始化 
	cout << "\n\n\t\t\t■■■■■  ■■■■  ■■■■■  ■■■■     ■■■■   ■■■■■ \n";  
    cout << "\t\t\t    ■      ■            ■      ■      ■      ■      ■ 		\n";  
    cout << "\t\t\t    ■      ■            ■      ■      ■      ■      ■  		\n";  
	cout << "\t\t\t    ■      ■■■        ■      ■■■■        ■      ■■■■■ \n";  
	cout << "\t\t\t    ■      ■            ■      ■  ■          ■              ■ \n";  
	cout << "\t\t\t    ■      ■            ■      ■   ■         ■              ■ \n";  
	cout << "\t\t\t    ■      ■■■■      ■      ■    ■■   ■■■■   ■■■■■ \n";   
	getchar();
	score=0;
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			Map[i][j]=background[j][i]=' ';
		}
	}
	for(int i=1;i<N;i++) {
		Map[i][0]=Map[i][N-1]=Map[N-1][i]='+';
		background[i][0]=background[i][N-1]=background[N-1][i]='+';
	}
	
}
void Map_Upate(){					//地图更新 
	system("cls");
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++)
			cout<<Map[i][j]<<' ';
			if(i==2) cout<<"\t\t    下一个";
			if(i==3) cout<<"\t\t* * * * * * * *";
			if(i==4){
				cout<<"\t\t*    ";
				for(int w=0;w<=2;w++) cout<<block_next[0][w]<<' ';
				cout<<"   *";
			} 
			if(i==5){
				cout<<"\t\t*    ";
				for(int w=0;w<=2;w++) cout<<block_next[1][w]<<' ';
				cout<<"   *";
			} 
			if(i==6){
				cout<<"\t\t*    ";
				for(int w=0;w<=2;w++) cout<<block_next[2][w]<<' ';
				cout<<"   *";
			} 
			if(i==7) cout<<"\t\t* * * * * * * *";
			if(i==11) cout<<"\t Score:"<<score;
			if(i==16) cout<<"\t左移:A              右移:D  ";
			if(i==18) cout<<"\t\t 加速下降:S  ";
			if(i==20) cout<<"\t\t 旋转:空格";
		cout<<endl;
	} 
}
int Random(){						//随机函数 
	srand((unsigned)time(0));
	return rand()%4+1;
}
void SetBlock(){					//设置方块 
	speed=500.0;					//通用方法 
	for(int i=0;i<=2;i++)
		for(int j=0;j<=2;j++)
			one.block[i][j]=' ';
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){  	
			Map[j][i]=background[j][i];
		}
	}	
	if(Map[2][M-1]=='o'||Map[2][M]=='o'||Map[2][M+1]=='o'){ 		//初始方块处非空,游戏结束 
		cout<<"GAME OVER";
		exit(-1); 
	}
	//Random();
				//特殊方法	
	one.left=M-1;
	one.right=M+1;
	one.bottom=2;
	onet=0;
	one.left_boundry=one.left;
	one.right_boundry=one.right;
	/******************* T 字型方块  ****************************/ 
	if(type==1){ 
		one.line[0]=one.line[1]=one.line[2]=one.bottom;
		for(int i=0;i<=2;i++) one.block[2][i]='o';
		one.block[1][1]='o';
	} 
	/********************* 正方形方块  ***************************/ 
	if(type==2){ 
		one.line[0]=one.line[1]=one.line[2]=one.bottom;
		for(int i=0;i<=2;i++)
			for(int j=0;j<=2;j++) one.block[i][j]='o';
	} 
	/***********************  L 型方块  **************************/
	if(type==3){ 
		one.line[0]=one.line[1]=one.bottom;
		one.line[2]=-1; 
		for(int i=0;i<=2;i++) one.block[i][0]='o';
		one.block[2][1]='o';
	} 
	/**********************  一字型型方块  ************************/
	if(type==4){ 
		one.line[0]=one.line[1]=one.line[2]=one.bottom-1;
		for(int i=0;i<=2;i++) one.block[1][i]='o';
	} 
}
void NextBlock(){					//下一个方块 
	for(int i=0;i<=2;i++)
		for(int j=0;j<=2;j++)
			block_next[i][j]=' ';
	if(type_next==1){
		for(int i=0;i<=2;i++) block_next[2][i]='o';
		block_next[1][1]='o';
	}
	if(type_next==2){
		for(int i=0;i<=2;i++)
			for(int j=0;j<=2;j++)
				block_next[i][j]='o';
	}
	if(type_next==3){
		for(int i=0;i<=2;i++) block_next[i][0]='o';
		block_next[2][1]='o';
	}
	if(type_next==4){
		for(int i=0;i<=2;i++) block_next[1][i]='o';
	}
}
void Revolve(){						//方块旋转 
	if(dirction==' '){
		/*****************  T 型方块旋转  *************************/ 
		if(type==1){ 
			if(onet==0){
				for(int i=0;i<=2;i++) one.block[2][i]=' ';
				for(int j=0;j<=2;j++) one.block[j][2]='o';
				one.line[0]=-1;
				one.line[1]=one.bottom-1;
				one.line[2]=one.bottom;
				one.left_boundry=one.left+1;
				one.right_boundry=one.right;
				onet++;
			}
			else if(onet==1){
				for(int j=0;j<=2;j++) one.block[j][2]=' ';
				for(int i=0;i<=2;i++) one.block[0][i]='o';
				one.line[0]=one.bottom-2;
				one.line[1]=one.bottom-1;
				one.line[2]=one.bottom-2;
				one.left_boundry=one.left;
				one.right_boundry=one.right;
				onet++;
			}
			else if(onet==2){
				for(int i=0;i<=2;i++) one.block[0][i]=' ';
				for(int j=0;j<=2;j++) one.block[j][0]='o';
				one.line[0]=one.bottom;
				one.line[1]=one.bottom-1;
				one.line[2]=-1;
				one.left_boundry=one.left;
				one.right_boundry=one.right-1;
				onet++;
			}
			else if(onet==3){
				for(int i=0;i<=2;i++) one.block[i][0]=' ';
				for(int j=0;j<=2;j++) one.block[2][j]='o';
				one.line[0]=one.line[1]=one.line[2]=one.bottom;
				one.left_boundry=one.left;
				one.right_boundry=one.right;
				onet=0;
			}
		} 
		/*****************  正方形方块旋转  *************************/ 
		if(type==2){
			one.line[0]=one.line[1]=one.line[2]=one.bottom;
		} 
		/*****************  L 型方块旋转  ***************************/  
		if(type==3){ 
			if(onet==0){
				for(int i=0;i<=2;i++) one.block[i][0]=' ';
				for(int j=0;j<=2;j++) one.block[2][j]='o';
				one.block[1][2]='o';
				one.line[0]=one.bottom;
				one.line[1]=one.bottom;
				one.line[2]=one.bottom;
				one.left_boundry=one.left;
				one.right_boundry=one.right;
				onet++;
			}
			else if(onet==1){
				for(int j=0;j<=2;j++) one.block[2][j]=' ';
				for(int i=0;i<=2;i++) one.block[i][2]='o';
				one.block[0][1]='o';
				one.line[0]=-1;
				one.line[1]=one.bottom-2;
				one.line[2]=one.bottom;
				one.left_boundry=one.left+1;
				one.right_boundry=one.right;
				onet++;
			}
			else if(onet==2){
				for(int i=0;i<=2;i++) one.block[i][2]=' ';
				for(int j=0;j<=2;j++) one.block[0][j]='o';
				one.block[1][0]='o';
				one.line[0]=one.bottom-1;
				one.line[1]=one.bottom-2;
				one.line[2]=one.bottom-2;
				one.left_boundry=one.left;
				one.right_boundry=one.right;	
				onet++;
			}
			else if(onet==3){
				for(int i=0;i<=2;i++) one.block[0][i]=' ';
				for(int j=0;j<=2;j++) one.block[j][0]='o';
				one.block[2][1]='o';
				one.line[0]=one.line[1]=one.bottom;
				one.line[2]=-1;
				one.left_boundry=one.left;
				one.right_boundry=one.right-1;
				onet=0;
			}
		} 
		/*****************  一字型方块旋转  *************************/ 
		if(type==4){
			if(onet==0){
				for(int i=0;i<=2;i++) one.block[1][i]=' ';
				for(int j=0;j<=2;j++) one.block[j][1]='o';
				one.line[0]=-1;
				one.line[1]=one.bottom;
				one.line[2]=-1;
				one.left_boundry=one.left+1;
				one.right_boundry=one.right-1;
				onet++;
			}
			else if(onet==1){
				for(int j=0;j<=2;j++) one.block[j][1]=' ';
				for(int i=0;i<=2;i++) one.block[1][i]='o';	
				one.line[0]=one.bottom-1;
				one.line[1]=one.bottom-1;
				one.line[2]=one.bottom-1;
				one.left_boundry=one.left;
				one.right_boundry=one.right;
				onet--;
			}
		}
	}
}
void Clean(){						//清行及分数计算 
	int full=0;
	for(int i=N-2;i>0;i--){
		for(int j=1;j<N-1;j++){
			if(Map[i][j]==' ') break;
			if(j==N-2) full=1;
		}
		if(full==1) {
			for(int k=1;k<N-1;k++){
				Map[i][k]=background[i][k]=' ';
			} 
		/***************  闪烁效果  *********************/ 
			double start=clock() / CLOCKS_PER_SEC;
			while(clock()/CLOCKS_PER_SEC-start<=0.05);
			Map_Upate();
			Map_Upate();
		/***************  消行处理  *********************/ 
			full=0;
			for(int p=i;p>0;p--){
				for(int q=1;q<N-1;q++){
					Map[p][q]=Map[p-1][q];
					background[p][q]=background[p-1][q];
				}
			}
			score+=100;			//加分数 
		}
	}
}
int Arrive(){						//判断是否到达底边 
	if(background[one.line[0]+1][one.left]=='+'||background[one.line[2]+1][one.right]=='+'||background[one.line[1]+1][one.left+1]=='+'||
	background[one.line[0]+1][one.left]=='o'||background[one.line[2]+1][one.right]=='o'||background[one.line[1]+1][one.left+1]=='o') {
		for(int i=one.left,bi=0;i<=one.right;i++,bi++){
			for(int j=one.bottom-2,bj=0;j<=one.bottom;j++,bj++){
				if(background[j][i]==' ') background[j][i]=one.block[bj][bi];		//将方块加入底板 
			}
		}
		Clean();
		return 1;
	}
	return 0;
}
void Move(){						//方块移动 
	bool timeover = true;
	double start = (double)clock() / CLOCKS_PER_SEC;            //得到程序目前为止运行的时间     
    while ((timeover = ((double)clock() / CLOCKS_PER_SEC - start <=speed / 1000.0)) && !_kbhit());//自动经过1秒或者等待1秒内的键盘输入
	dirction='c';
	if (timeover)
    {
		dirction=_getch();    //获取方向
	}
	switch(dirction){
		case 'a':
			if(one.left_boundry-1>0){
				for(int i=one.left;i<=one.right;i++){
					for(int j=one.bottom-2;j<=one.bottom;j++)
					if(background[j][i]==' ')	Map[j][i]=' ';
				}
				one.left--;
				one.right--;
				one.left_boundry--;
				one.right_boundry--;
			}
			
			break;
		case 'd':
			
			if(one.right_boundry+1<N-1){
				for(int i=one.left;i<=one.right;i++){
					for(int j=one.bottom-2;j<=one.bottom;j++)
						if(background[j][i]==' ')Map[j][i]=' ';
				}
				one.left++;
				one.right++;
				one.left_boundry++;
				one.right_boundry++;
			}
			break;
		case 's':
			speed=10;
			break;
		case 'c':			//固有方向 
			for(int i=one.left;i<=one.right;i++){
					for(int j=one.bottom-2;j<=one.bottom;j++)
					if(background[j][i]==' ')	Map[j][i]=' ';
				}
			if(!Arrive()){
				one.bottom++;
			}
			
		/********************  T 型方块实体底边坐标更新  ************************/
		if(type==1){	
			if(onet==0){
				one.line[0]=one.line[1]=one.line[2]=one.bottom;		
			}
			else if(onet==1){
				one.line[0]=-1;
				one.line[1]=one.bottom-1;
				one.line[2]=one.bottom;	
			}
			else if(onet==2){
				one.line[0]=one.bottom-2;
				one.line[1]=one.bottom-1;
				one.line[2]=one.bottom-2;		
			}
			else if(onet==3){
				one.line[0]=one.bottom;
				one.line[1]=one.bottom-1;
				one.line[2]=-1;		
			}
		}
		/*****************  正方形方块体底边坐标更新   *************************/ 
		if(type==2){
			one.line[0]=one.line[1]=one.line[2]=one.bottom;
		} 
		/*****************  L 型方块体底边坐标更新   ***************************/  
		if(type==3){ 
			if(onet==0){
				one.line[0]=one.line[1]=one.bottom;
				one.line[2]=-1;
			}
			else if(onet==1){
				one.line[0]=one.bottom;
				one.line[1]=one.bottom;
				one.line[2]=one.bottom;
			}
			else if(onet==2){
				one.line[0]=-1;
				one.line[1]=one.bottom-2;
				one.line[2]=one.bottom;
			}
			else if(onet==3){
				one.line[0]=one.bottom-1;
				one.line[1]=one.bottom-2;
				one.line[2]=one.bottom-2; 
			}
		} 
		/*****************  一字型方块体底边坐标更新   *************************/ 
		if(type==4){
			if(onet==0){
				one.line[0]=one.bottom-1;
				one.line[1]=one.bottom-1;
				one.line[2]=one.bottom-1;
			}
			else if(onet==1){
				one.line[0]=-1;
				one.line[1]=one.bottom;
				one.line[2]=-1;
			}
		} 
			break;
		case ' ':
			Revolve();
			break;
	}
	
	
	/*****************************  将方块矩阵加入地图   ***********************************/ 
	int i,mi,j,mj;
	for(mi=one.left,i=0;i<=2;i++,mi++){
		for(mj=one.bottom-2,j=0;j<=2;j++,mj++)
			 //Map[mj][mi]=' ';
			 if(background[mj][mi]==' ') Map[mj][mi]=one.block[j][i];
	}
	
}

int main(){
	Hello();
	type=Random();
	SetBlock();
	while(1){
		Map_Upate();
		if(IsChange) {
			type_next=Random();
			IsChange=0;
			NextBlock();
		}
		if(Arrive()) {
			type=type_next;
			SetBlock();
			IsChange=1;
		}
		Move();
	}
} 

更多推荐

C++ 黑框框小游戏(3)—— 俄罗斯方块