c++俄罗斯方块

c++:俄罗斯方块

这个代码比贪吃蛇难一些,花的时间久一些,同样,还是会有一些bug,请求大佬们查错

“前置代码”们

前置数据

//头文件
#include<bits/stdc++.h> 
#include<windows.h> 
#include<conio.h>
//常量
#define _for(i,a,b) for(int i=a;i<b;i++) //重定义for
#define handle GetStdHandle(STD_OUTPUT_HANDLE) //标准输出句柄

前置函数

1. 控制台窗口初始化函数

去翻译了下 初始化 被译为了 initialize
∴ 这个函数长这样

void Initialize(){
	cursor(0); //把光标隐藏(下面有解释)
	system("color f0"); //用cmd里的color指令把控制台设为白底黑字
	RECT rect; 
	HWND hwnd=GetForegroundWindow(); //返回前台窗回的句柄
	GetWindowRect(hwnd,&rect); //得到窗口的位置
	//修改窗口的位置,这行代码就是将窗口移动到左上角(不改变窗口大小)
	MoveWindow(hwnd,0,0,rect.right-rect.left,rect.bottom-rect.top,TRUE); 
	system("mode con cols=90 lines=30"); //将窗口大小设定为宽90字符高30字符
}

2. 光标定位函数和颜色函数

void gotoxy(double x,int y){//光标定位
	COORD pos; //定义一个坐标
	pos.X=2*x; //设置X,因为一个中文是两个字符,所以*2
	pos.Y=y; //设置Y
	SetConsoleCursorPosition(handle,pos); //设置坐标位置
}
void color(int a){//颜色
	SetConsoleTextAttribute(handle,a);//修改
}

3. 延迟输出函数

void print(const char a[],int interval){ //传入文字和输出间隔(ms)
	int len=strlen(a); //获得文字长度
	_for(i,0,len){ //循环输出
		printf("%c",a[i]); 
		Sleep(interval); //暂停interval时间,Sleep来自于Window.h,可以把函数暂停一会儿(ms)
	}
}

4. 光标显示与隐藏

因为运行时还有一个光标在闪闪闪看着不舒服,所以就有了这么一个东西

void cursor(bool a){
	CONSOLE_CURSOR_INFO CursorInfo;//创建一个光标变量
	GetConsoleCursorInfo(handle, &CursorInfo);//获取光标
	CursorInfo.bVisible = a;//将光标显示状态设为 a
	SetConsoleCursorInfo(handle, &CursorInfo);//设置光标
}

5. enter()

这玩意说白了就是个广告


void enter(){
	print("本游戏由 AichiStudio爱知工作室(http://aichistudio.space) 制作",50);
	Sleep(1000);
}

这太容易了,就不解释了,反正也就是个广告

功能代码

对方块的定义

因为算法不方便也不好搞,就打表了

const bool blocks[8][4][5][5]={//定义方块,1表示有方块,0表示没有 
	{//第一种,T型方块
		{
			{1, 1, 1},
			{0, 1, 0}
		},{
			{0, 1},
			{1, 1},
			{0, 1}
		},{
			{0, 1, 0},
			{1, 1, 1}
		},{
			{1, 0},
			{1, 1},
			{1, 0}
		}
	},{//第二种,O型方块
		{
			{1, 1},
			{1, 1}
		},{
			{1, 1},
			{1, 1}
		},{
			{1, 1},
			{1, 1}
		},{
			{1, 1},
			{1, 1}
		}
	},{//第三种,I型方块 
		{
			{1, 1, 1, 1},
		},{
			{1},
			{1}, 
			{1}, 
			{1}
		},{
			{1, 1, 1, 1},
		},{
			{1},
			{1}, 
			{1}, 
			{1}
		}
	},{//第四种,J型方块
		{
			{1, 1, 1},
			{0, 0, 1}
		},{
			{0, 1},
			{0, 1},
			{1, 1}
		},{
			{1, 0, 0},
			{1, 1, 1}
		},{
			{1, 1},
			{1, 0},
			{1, 0}
		}
	},{//第五种,L型方块
		{
			{1, 1, 1},
			{1, 0, 0}
		},{
			{1, 1},
			{0, 1},
			{0, 1}
		},{
			{0, 0, 1},
			{1, 1, 1}
		},{
			{1, 0},
			{1, 0},
			{1, 1}
		}
	},{//第六种,S型方块  
		{
			{0, 1, 1},
			{1, 1, 0}
		},{
			{1, 0},
			{1, 1},
			{0, 1}
		},{
			{0, 1, 1},
			{1, 1, 0}
		},{
			{1, 0},
			{1, 1},
			{0, 1}
		}
	},{//第七种,Z型方块 
		{
			{1, 1, 0},
			{0, 1, 1},
		},{
			{0, 1},
			{1, 1},
			{1, 0}
		},{
			{1, 1, 0},
			{0, 1, 1},
		},{
			{0, 1},
			{1, 1},
			{1, 0}
		}
	}
};

对数据的定义

int block_x,block_y;//坐标,方块的位置 
int block_type;//方块的种类 
int block_direction;//方块的朝向
int block_color;//方块的颜色 
bool block[4][4];//现在的方块
bool gamemap[30][30];//游戏地图
int nextblock,score;//下一个方块和分数

方块构造

构造

void createblock(){
	block_type=nextblock;//设置方块种类
	srand(time(NULL));//设置随机数种子
	nextblock=rand()%7;//设置下一个方块
	nextblock_print();//在右上角绘制下一个方块
	//方块赋值
	_for(i,0,4){
		_for(j,0,4){
			block[i][j]=blocks[block_type][0][i][j];
		}
	}
	block_x=12;//设置方块X
	block_y=-2;//设置方块Y,让它从上面慢慢滑下
	block_direction=0;//方块朝向设为0,向上
	srand(rand());//设置随机数种子
	block_color=rand()%14+1;//设置方块颜色
}

输出“下一个方块”

void nextblock_print(){
	srand(rand());//设置随机数种子
	int clr=rand()%14+1;//随机输出的颜色
	_for(i,0,3)//遍历方块
		_for(j,0,4){
			gotoxy(j+30,i+6);//光标定位
			if(blocks[nextblock][0][i][j])//如果这部分有方块
				color(clr);//设置颜色
			else color(0);//否则颜色设为黑色
			printf("■");//输出
		}
}

方块的移动

void block_move(int direction){//传入 方向
	_for(i,0,4)//对这个方块进行循环遍历
		_for(j,0,4){
				//当方块某部分的Y+1>=0(表示这个部分在地图内,不然会数组越界)且方向是向下
				if(block_y+i+1>=0&&direction==1\
				//如果在方块这部分的下面在地图里有方块或这部分已经到达底部,结束方块
				&&(gamemap[block_y+i+1][block_x+j]||block_y+i+1>24)&&block[i][j]/*表示方块的这部分有东西*/){
					block_over();
					return;//返回
				}
				//当方块某部分的Y>=0(同样表示这个部分在地图内)且方向向左
				else if(block_y+i>0&&direction==2\
				//如果在方块这部分的左边在地图里有方块或者超出边界,不执行移动
				&&(gamemap[block_y+i][block_x+j-1]||block_x+j-1<0)&&block[i][j])
					return;
				//当方块的某部分Y>=0(依旧表示这部分在地图内)且方向向右
				else if(block_y+i>=0&&direction==3\
				//如果在方块的这部分的右边在地图里有方块或超出边界,不执行移动
				&&(gamemap[block_y+i][block_x+j+1]||block_x+j+1>24)&&block[i][j])
					return;
			}
	//如果本次移动没有问题,那么先清除原来显示的方块
	clean_block();
	//判断方向并进行移动
	if(direction==1)block_y++;
	else if(direction==2)block_x--;
	else if(direction==3)block_x++;
	//输出移动后的方块
	block_print();
}

方块转向

void block_turn(){
	//检测转向是否合法
	int temp=block_direction+1;
	if(temp==4)temp=0;
	_for(i,0,4)//遍历
		_for(j,0,4)
			if((gamemap[block_y+i][block_x+j]\
			//如果这转向后会与其他方块重合
			||block_x+j>24||0>block_x+j||block_y+i>24)\
			//或超出边界
			&&blocks[block_type][temp][i][j])//并且方块的这一部分有东西
				return;//取消转向
	//如果转向合法,则先清空原有方块
	clean_block();
	//转向
	block_direction++;
	if(block_direction==4)block_direction=0;
	_for(i,0,4)//赋值方块
		_for(j,0,4)
			block[i][j]=blocks[block_type][block_direction][i][j];
	block_print();//绘制方块
}

终结方块

void block_over(){
	//将方块加入地图
	_for(i,0,4)
		_for(j,0,4)
			if(block[i][j])
				gamemap[i+block_y][j+block_x]=1;
	map_test();//对地图进行检测
	createblock();//构造方块
	score+=4;//分数加 4
}

检测地图

void map_test(){
	bool t=1;//临时变量
	int subnum=0,verlen[30]={};//可以消除的行数和每一列的高度
	_for(i,0,25){
		t=1;//变量每次都定为1
		_for(j,0,25){
			if(!gamemap[i][j])t=0;//如果i行j列没有方块,则不能消除
			if(gamemap[j][i])verlen[i]++;//如果j列i行有方块,则这一列的高度++
			if(i==0&&gamemap[0][j])gameover();//如果第一行有方块,则游戏结束
		}
		if(t)subnum++;//如果这一行都有方块,则subnum++
	}
	if(subnum){//如果有一行可以消除
		memset(gamemap,0,sizeof(gamemap));//清空地图
		_for(i,0,25)//共25列
			for(int j=24;j>=24-verlen[i]+subnum+1;j--)//倒序循环24-verlen[i]行
				gamemap[j][i]=1;//第j行i列有方块
		score+=subnum*200;//添加分数
	}
	//重新输出地图
	_for(i,0,25)
		_for(j,0,25){
			gotoxy(j,i);
			if(gamemap[i][j])color(7);
			else color(0);
			printf("■");
		}
}

绘制与清除方块

清除方块

void clean_block(){
	color(0);//将颜色定为黑色
	_for(i,0,4)//遍历
		_for(j,0,4)
			if(block[i][j]&&block_x+j>=0&&block_y+i>=0&&block_x+j<=24&&block_y+i<=24){//如果这部分在地图内
				gotoxy(block_x+j,block_y+i);//光标定位
				printf("■");//输出
			}
}

绘制方块

void block_print(){
	color(block_color);//颜色设为方块的颜色
	_for(i,0,4)//遍历
		_for(j,0,4)
			if(block_y+i>=0&&block_x+j>=0&&block_x+j<=24&&block[i][j]){//如果这部分在地图内且这部分有东西
				gotoxy(block_x+j,block_y+i);//光标定位
				printf("■");//绘制
			}
}

gameover()函数

void gameover(){
	system("cls&color f0");
	//制作界面
	gotoxy(19,10);printf("GAME OVER");
	if(score<100){gotoxy(19,12);printf("SCORE: %d",score);}//分数只有两位就放在中间输出
	else if(score<1000){gotoxy(19,12);printf("SCORE:%d",score);}//有三位就删去一个空格
	else if(score<10000){gotoxy(18,12);printf("SCORE: %d",score);}//如果有四位就...
	gotoxy(19,14);printf("按 R 重玩");
	//就是把分数放在中间
	while(_kbhit());//将积累的按键事件清空
	char k=getch();//暂停并读取一个键值(可以理解为请按任意键退出)
	if((k=='r'||k=='R')){//如果按的是 R 就重启游戏
		score=0;
		main_interface();
	}
	exit(0);//退出
}

主界面

void main_interface(){
	system("cls&title 俄罗斯方块c++版");//清屏并设置标题
	//构造界面,这里不多解释
	gotoxy(28, 3);printf(" 下一个方块");
	gotoxy(28,12);printf("   SCORE: %d",score);
	gotoxy(28,14);printf("  S加速向下");
	gotoxy(28,15);printf("");
	gotoxy(28,16);printf("  A左旋转  D右旋转");
	gotoxy(28,17);printf("");
	gotoxy(28,18);printf("  Q暂停   R重玩");
	gotoxy(28,19);printf("");
	gotoxy(28,20);printf("  F打开Aichi网站");
	_for(i,0,26){gotoxy(27,i);printf("|");}
	//构造地图
	color(0);
	_for(i,0,5)
		_for(j,0,6){
			gotoxy(j+29,i+5);
			printf("■");
		}
	_for(i,0,25){
		_for(j,0,25){
			gotoxy(j,i);printf("■"); 
		}
	}
	color(240);
	int tim=0;//计时器
	bool running=1;//表示是否正在运行
	srand(time(NULL));
	nextblock=rand()%7;//生成下一个方块
	Sleep(2000);//等待2秒,让随机数种子发生变化
	createblock();//构造方块
	while(1){//循环
		if(tim==18){//时间达到900毫秒
			block_move(1);//向下移动
			gotoxy(28,12);color(240);printf("   SCORE: %d",score);//输出分数
			tim=0;//计时器归零
		}
		if(_kbhit()){//如果键盘被按下
			char k=_getch();//读取键码
			if((k=='w'||k=='W')&&running){//如果 W 被按下,那么进行转向 
				block_turn();
			}else if((k=='a'||k=='A')&&running){//如果 A 被按下,那么向左移动
				block_move(2);
			}else if((k=='d'||k=='D')&&running){//如果 D 被按下,那么向右移动
				block_move(3);
			}else if((k=='s'||k=='S')&&running){//如果 S 被按下,那么向下移动
				block_move(1);
			}else if((k=='p'||k=='P'))//如果 P 被按下,那么 暂停 或 继续
				running=!running;//将状态切换
			else if((k=='f'||k=='F')){//如果 F 被按下
				system("explorer.exe http://aichistudio.space");//打开网站
				running=0;//暂停
			}else if((k=='r'||k=='R')){//如果 R 被按下
				//重启游戏
				score=0;
				main_interface();
			}
		}
		Sleep(50);//等待50ms
		if(running)tim++;//如果正在运行,计时器累加
	} 
}

主函数

int main(){
	Initialize();//初始化
	enter();//启动界面
	main_interface();//主界面
	return 0;
}

完整代码

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#define _for(i,a,b) for(int i=a;i<b;i++)
#define handle GetStdHandle(STD_OUTPUT_HANDLE)
using namespace std;
//----------数据定义----------
const bool blocks[8][4][5][5]={//定义方块,1表示有方块,0表示没有 
	{//第一种,T型方块
		{
			{1, 1, 1},
			{0, 1, 0}
		},{
			{0, 1},
			{1, 1},
			{0, 1}
		},{
			{0, 1, 0},
			{1, 1, 1}
		},{
			{1, 0},
			{1, 1},
			{1, 0}
		}
	},{//第二种,O型方块
		{
			{1, 1},
			{1, 1}
		},{
			{1, 1},
			{1, 1}
		},{
			{1, 1},
			{1, 1}
		},{
			{1, 1},
			{1, 1}
		}
	},{//第三种,I型方块 
		{
			{1, 1, 1, 1},
		},{
			{1},
			{1}, 
			{1}, 
			{1}
		},{
			{1, 1, 1, 1},
		},{
			{1},
			{1}, 
			{1}, 
			{1}
		}
	},{//第四种,J型方块
		{
			{1, 1, 1},
			{0, 0, 1}
		},{
			{0, 1},
			{0, 1},
			{1, 1}
		},{
			{1, 0, 0},
			{1, 1, 1}
		},{
			{1, 1},
			{1, 0},
			{1, 0}
		}
	},{//第五种,L型方块
		{
			{1, 1, 1},
			{1, 0, 0}
		},{
			{1, 1},
			{0, 1},
			{0, 1}
		},{
			{0, 0, 1},
			{1, 1, 1}
		},{
			{1, 0},
			{1, 0},
			{1, 1}
		}
	},{//第六种,S型方块  
		{
			{0, 1, 1},
			{1, 1, 0}
		},{
			{1, 0},
			{1, 1},
			{0, 1}
		},{
			{0, 1, 1},
			{1, 1, 0}
		},{
			{1, 0},
			{1, 1},
			{0, 1}
		}
	},{//第七种,Z型方块 
		{
			{1, 1, 0},
			{0, 1, 1},
		},{
			{0, 1},
			{1, 1},
			{1, 0}
		},{
			{1, 1, 0},
			{0, 1, 1},
		},{
			{0, 1},
			{1, 1},
			{1, 0}
		}
	}
};
int block_x,block_y;//坐标,方块的位置 
int block_type;//方块的种类 
int block_direction;//方块的朝向
int block_color;//方块的颜色 
bool block[4][4];//现在的方块
bool gamemap[30][30];//游戏地图
int nextblock,score;//下一个方块和分数
//----------函数定义----------
void gotoxy(double x,int y);
void color(int a);
void print(const char a[],int interval);
void main_interface();
void enter();
void Initialize();
void cursor(bool a);
void createblock();
void nextblock_print();
void block_move();
void block_print();
void block_turn();
void block_over();
void clean_block();
void map_test();
void gameover();
//----------函数书写----------
void cursor(bool a){
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(handle, &CursorInfo);
	CursorInfo.bVisible = a;
	SetConsoleCursorInfo(handle, &CursorInfo);
}
void Initialize(){
	cursor(0); //把光标隐藏(下面有解释)
	system("color f0"); //用cmd里的color指令把控制台设为白底黑字
	RECT rect; 
	HWND hwnd=GetForegroundWindow(); //返回前台窗回的句柄
	GetWindowRect(hwnd,&rect); //得到窗口的位置
	//修改窗口的位置,这行代码就是将窗口移动到左上角(不改变窗口大小)
	MoveWindow(hwnd,0,0,rect.right-rect.left,rect.bottom-rect.top,TRUE); 
	system("mode con cols=90 lines=30"); //将窗口大小设定为宽90字符高30字符
}
void gotoxy(double x,int y){//光标定位
	COORD pos; //定义一个坐标
	pos.X=2*x; //设置X,因为一个中文是两个字符,所以*2
	pos.Y=y; //设置Y
	SetConsoleCursorPosition(handle,pos); //设置坐标位置
}
void color(int a){//颜色
	SetConsoleTextAttribute(handle,a);//修改
}
void print(const char a[],int interval){ //传入文字和输出间隔(ms)
	int len=strlen(a); //获得文字长度
	_for(i,0,len){ //循环输出
		printf("%c",a[i]); 
		Sleep(interval); //暂停interval时间,Sleep来自于Window.h,可以把函数暂停一会儿(ms)
	}
}
void enter(){
	print("本游戏由 AichiStudio爱知工作室(http://aichistudio.space) 制作",50);
	Sleep(1000);
}
void createblock(){
	block_type=nextblock;//设置方块种类
	srand(time(NULL));//设置随机数种子
	nextblock=rand()%7;//设置下一个方块
	nextblock_print();//在右上角绘制下一个方块
	//方块赋值
	_for(i,0,4){
		_for(j,0,4){
			block[i][j]=blocks[block_type][0][i][j];
		}
	}
	block_x=12;//设置方块X
	block_y=-2;//设置方块Y,让它从上面慢慢滑下
	block_direction=0;//方块朝向设为0,向上
	srand(rand());//设置随机数种子
	block_color=rand()%14+1;//设置方块颜色
}
void nextblock_print(){
	srand(rand());//设置随机数种子
	int clr=rand()%14+1;//随机输出的颜色
	_for(i,0,3)//遍历方块
		_for(j,0,4){
			gotoxy(j+30,i+6);//光标定位
			if(blocks[nextblock][0][i][j])//如果这部分有方块
				color(clr);//设置颜色
			else color(0);//否则颜色设为黑色
			printf("■");//输出
		}
}
void map_test(){
	bool t=1;//临时变量
	int subnum=0,verlen[30]={};//可以消除的行数和每一列的高度
	_for(i,0,25){
		t=1;//变量每次都定为1
		_for(j,0,25){
			if(!gamemap[i][j])t=0;//如果i行j列没有方块,则不能消除
			if(gamemap[j][i])verlen[i]++;//如果j列i行有方块,则这一列的高度++
			if(i==0&&gamemap[0][j])gameover();//如果第一行有方块,则游戏结束
		}
		if(t)subnum++;//如果这一行都有方块,则subnum++
	}
	if(subnum){//如果有一行可以消除
		memset(gamemap,0,sizeof(gamemap));//清空地图
		_for(i,0,25)//共25列
			for(int j=24;j>=24-verlen[i]+subnum+1;j--)//倒序循环24-verlen[i]行
				gamemap[j][i]=1;//第j行i列有方块
		score+=subnum*200;//添加分数
	}
	//重新输出地图
	_for(i,0,25)
		_for(j,0,25){
			gotoxy(j,i);
			if(gamemap[i][j])color(7);
			else color(0);
			printf("■");
		}
}
void block_over(){
	//将方块加入地图
	_for(i,0,4)
		_for(j,0,4)
			if(block[i][j])
				gamemap[i+block_y][j+block_x]=1;
	map_test();//对地图进行检测
	createblock();//构造方块
	score+=4;//分数加 4
}
void block_move(int direction){//传入 方向
	_for(i,0,4)//对这个方块进行循环遍历
		_for(j,0,4){
				//当方块某部分的Y+1>=0(表示这个部分在地图内,不然会数组越界)且方向是向下
				if(block_y+i+1>=0&&direction==1\
				//如果在方块这部分的下面在地图里有方块或这部分已经到达底部,结束方块
				&&(gamemap[block_y+i+1][block_x+j]||block_y+i+1>24)&&block[i][j]/*表示方块的这部分有东西*/){
					block_over();
					return;//返回
				}
				//当方块某部分的Y>=0(同样表示这个部分在地图内)且方向向左
				else if(block_y+i>0&&direction==2\
				//如果在方块这部分的左边在地图里有方块或者超出边界,不执行移动
				&&(gamemap[block_y+i][block_x+j-1]||block_x+j-1<0)&&block[i][j])
					return;
				//当方块的某部分Y>=0(依旧表示这部分在地图内)且方向向右
				else if(block_y+i>=0&&direction==3\
				//如果在方块的这部分的右边在地图里有方块或超出边界,不执行移动
				&&(gamemap[block_y+i][block_x+j+1]||block_x+j+1>24)&&block[i][j])
					return;
			}
	//如果本次移动没有问题,那么先清除原来显示的方块
	clean_block();
	//判断方向并进行移动
	if(direction==1)block_y++;
	else if(direction==2)block_x--;
	else if(direction==3)block_x++;
	//输出移动后的方块
	block_print();
}
void block_turn(){
	//检测转向是否合法
	int temp=block_direction+1;
	if(temp==4)temp=0;
	_for(i,0,4)//遍历
		_for(j,0,4)
			if((gamemap[block_y+i][block_x+j]
			//如果这转向后会与其他方块重合
			||block_x+j>24||0>block_x+j||block_y+i>24)\
			//或超出边界
			&&blocks[block_type][temp][i][j])//并且方块的这一部分有东西
				return;//取消转向
	//如果转向合法,则先清空原有方块
	clean_block();
	//转向
	block_direction++;
	if(block_direction==4)block_direction=0;
	_for(i,0,4)//赋值方块
		_for(j,0,4)
			block[i][j]=blocks[block_type][block_direction][i][j];
	block_print();//绘制方块
}
void block_print(){
	color(block_color);//颜色设为方块的颜色
	_for(i,0,4)//遍历
		_for(j,0,4)
			if(block_y+i>=0&&block_x+j>=0&&block_x+j<=24&&block[i][j]){//如果这部分在地图内且这部分有东西
				gotoxy(block_x+j,block_y+i);//光标定位
				printf("■");//绘制
			}
}
void clean_block(){
	color(0);//将颜色定为黑色
	_for(i,0,4)//遍历
		_for(j,0,4)
			if(block[i][j]&&block_x+j>=0&&block_y+i>=0&&block_x+j<=24&&block_y+i<=24){//如果这部分在地图内
				gotoxy(block_x+j,block_y+i);//光标定位
				printf("■");//输出
			}
}
void gameover(){
	system("cls&color f0");
	//制作界面
	gotoxy(19,10);printf("GAME OVER");
	if(score<100){gotoxy(19,12);printf("SCORE: %d",score);}//分数只有两位就放在中间输出
	else if(score<1000){gotoxy(19,12);printf("SCORE:%d",score);}//有三位就删去一个空格
	else if(score<10000){gotoxy(18,12);printf("SCORE: %d",score);}//如果有四位就...
	gotoxy(19,14);printf("按 R 重玩");
	//就是把分数放在中间
	while(_kbhit());//将积累的按键事件清空
	char k=getch();//暂停并读取一个键值(可以理解为请按任意键退出)
	if((k=='r'||k=='R')){//如果按的是 R 就重启游戏
		score=0;
		main_interface();
	}
	exit(0);//退出
}
void main_interface(){
	system("cls&title 俄罗斯方块c++版");//清屏并设置标题
	//构造界面,这里不多解释
	gotoxy(28, 3);printf(" 下一个方块");
	gotoxy(28,12);printf("   SCORE: %d",score);
	gotoxy(28,14);printf("  S加速向下");
	gotoxy(28,15);printf("");
	gotoxy(28,16);printf("  A左旋转  D右旋转");
	gotoxy(28,17);printf("");
	gotoxy(28,18);printf("  Q暂停   R重玩");
	gotoxy(28,19);printf("");
	gotoxy(28,20);printf("  F打开Aichi网站");
	_for(i,0,26){gotoxy(27,i);printf("|");}
	//构造地图
	color(0);
	_for(i,0,5)
		_for(j,0,6){
			gotoxy(j+29,i+5);
			printf("■");
		}
	_for(i,0,25){
		_for(j,0,25){
			gotoxy(j,i);printf("■"); 
		}
	}
	color(240);
	int tim=0;//计时器
	bool running=1;//表示是否正在运行
	srand(time(NULL));
	nextblock=rand()%7;//生成下一个方块
	Sleep(2000);//等待2秒,让随机数种子发生变化
	createblock();//构造方块
	while(1){//循环
		if(tim==18){//时间达到900毫秒
			block_move(1);//向下移动
			gotoxy(28,12);color(240);printf("   SCORE: %d",score);//输出分数
			tim=0;//计时器归零
		}
		if(_kbhit()){//如果键盘被按下
			char k=_getch();//读取键码
			if((k=='w'||k=='W')&&running){//如果 W 被按下,那么进行转向 
				block_turn();
			}else if((k=='a'||k=='A')&&running){//如果 A 被按下,那么向左移动
				block_move(2);
			}else if((k=='d'||k=='D')&&running){//如果 D 被按下,那么向右移动
				block_move(3);
			}else if((k=='s'||k=='S')&&running){//如果 S 被按下,那么向下移动
				block_move(1);
			}else if((k=='p'||k=='P'))//如果 P 被按下,那么 暂停 或 继续
				running=!running;//将状态切换
			else if((k=='f'||k=='F')){//如果 F 被按下
				system("explorer.exe http://aichistudio.space");//打开网站
				running=0;//暂停
			}else if((k=='r'||k=='R')){//如果 R 被按下
				//重启游戏
				score=0;
				main_interface();
			}
		}
		Sleep(50);//等待50ms
		if(running)tim++;//如果正在运行,计时器累加
	} 
}
int main(){
	Initialize();//初始化
	enter();//启动界面
	main_interface();//主界面
	return 0;
}

From AichiStudio爱知工作室,
网站:http://aichistudio.space
**QQ交流群:[1032103456](http://shang.qq.com/wpa/qunwpa?idkey=057e58f1b40bec3f845e205

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值