专栏文章

easyx俄罗斯方块

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipxmq1r
此快照首次捕获于
2025/12/03 19:37
3 个月前
此快照最后确认于
2025/12/03 19:37
3 个月前
查看原文
CPP
#include<bits/stdc++.h>
#include<easyx.h>
#include<graphics.h>
#include<conio.h>
using namespace std;
bool flag;
int block_ready[8];
int mp[25][15];
int s[25];
int form,blockway,block_l,block_r;
pair<int,int> block[5];
bool time_js(int shichang);
void left(); 
void right();
void down();
void way();
void lr(int ll,int rr);
void ready(int i1,int i2,int i3,int i4,int j1,int j2,int j3,int j4);
signed main(){
	srand(time(NULL));
	initgraph(350,650,1);
	while(1){
		BeginBatchDraw();
		setlinestyle(PS_SOLID,1);
		for(int i=0;i<=10;i++){
			line(i*30+25,25,i*30+25,625);
		}
		for(int i=0;i<=20;i++){
			line(25,i*30+25,325,i*30+25);
		}
		if(flag==0){
			for(int i=1;i<=20;i++){
				int cnt=0;
				for(int j=1;j<=10;j++){
					if(mp[i][j]!=0){
						cnt++;
					}
				}
				s[i]=cnt;
			}
			if(s[1]!=0){
				EndBatchDraw();
				cleardevice();
				settextstyle(75,0,"楷体");
				outtextxy(350/2-textwidth("GAME OVER")/2,650/2-textheight("GAME OVER")/2,"GAME OVER"); 
				Sleep(3000);
				return 0;
			}
			for(int o=2;o<=20;){
				for(int i=1;i<=20;i++){
					int cnt=0;
					for(int j=1;j<=10;j++){
						if(mp[i][j]!=0){
							cnt++;
						}
					}
					s[i]=cnt;
				}
				if(s[o]==10){
					for(int j=1;j<=10;j++){
						mp[o][j]=0;
					}
					s[o]=0;
					for(int k=o;k>=2;k--){
						for(int y=1;y<=10;y++){
							mp[k][y]=mp[k-1][y];
						}
					}
				}else{
					o++;
				} 
			}
			form=3;
			if(s[2]!=0) form=1;
			blockway=1;
			block[1].first=0;
			block[1].second=0;
			block[2].first=0;
			block[2].second=0;
			block[3].first=0;
			block[3].second=0;
			block[4].first=0;
			block[4].second=0;
			if(s[2]==1) form=1;
			switch(form){
				case 1:{
					block[1].first=1;
					block[1].second=rand()%7+1;
					for(int i=2;i<=4;i++){
						block[i].first=block[1].first;
						block[i].second=block[i-1].second+1;
					}
					break;
				}
				case 2:{
					block[1].first=1;
					block[1].second=rand()%9+1;
					block[2].first=1;
					block[2].second=block[1].second+1;
					block[3].first=2;
					block[3].second=block[1].second;
					block[4].first=2;
					block[4].second=block[1].second+1;
					break;
				}
				case 3:{
					block[1].first=1;
					block[1].second=rand()%8+1;
					block[2].first=2;
					block[2].second=block[1].second;
					for(int i=3;i<=4;i++){
						block[i].first=2;
						block[i].second=block[i-1].second+1;
					}
					break;
				}
			}
			for(int i=1;i<=4;i++){
				mp[block[i].first][block[i].second]=form;
			}
			flag=1;
		}
		if(_kbhit()){
			int m=_getch();
			switch(m){
				case 'w':
				case 'W':
				case 72:
					way();
					break;
				case 'S':
				case 's':
				case 80:
					down();
					break;
				case 'A':
				case 'a':
				case 75:
					left();
					break;
				case 'D':
				case 'd':
				case 77:
					right();
					break;
			}
		}
//		if(time_js(300)){
//			down();
//		}
		for(int i=1;i<=20;i++){
			int cnt=0;
			for(int j=1;j<=10;j++){
				switch(mp[i][j]){
					case 1:{
						setfillcolor(RGB(255,151,125));
						break;
					}
					case 2:{
						setfillcolor(RGB(240,250,140));
						break;
					}
					case 3:{
						setfillcolor(RGB(179,250,147));
						break;
					}
					case 4:{
						setfillcolor(RGB(152,250,250));
						break;
					}
				}
				if(mp[i][j]!=0){ 
					solidrectangle(25+(j-1)*30+1,25+(i-1)*30+1,25+j*30-1,25+i*30-1);
				}
			}
		}
		EndBatchDraw();
		cleardevice();
	}
}
bool time_js(int shichang){
	static int begin=clock();
	if(clock()-begin>=shichang){
		begin=clock();
		return true;
	}
	return false;
}
void left(){
	for(int i=1;i<=4;i++){
		if(block[i].second-1<1){
			return ;
		}
		if(mp[block[i].first][block[i].second-1]!=0){
			bool flag_3=0;
			for(int j=1;j<=4;j++){
				if(block[j].first==block[i].first&&block[j].second==block[i].second-1){
					flag_3=1;
					break;
				}
			}
			if(flag_3==0){
				return ;
			}
		}
	}
	for(int i=1;i<=4;i++){
		mp[block[i].first][block[i].second]=0;
	}
	for(int i=1;i<=4;i++){
		block[i].second--;
	}
	for(int i=1;i<=4;i++){
		mp[block[i].first][block[i].second]=form;
	}
}
void right(){
	for(int i=1;i<=4;i++){
		if(block[i].second+1>10){
			return ;
		}
		if(mp[block[i].first][block[i].second+1]!=0){
			bool flag_3=0;
			for(int j=1;j<=4;j++){
				if(block[j].first==block[i].first&&block[j].second==block[i].second+1){
					flag_3=1;
					break;
				}
			}
			if(flag_3==0){
				return ;
			}
		}
	}
	for(int i=1;i<=4;i++){
		mp[block[i].first][block[i].second]=0;
	}
	for(int i=1;i<=4;i++){
		block[i].second+=1;
	}
	for(int i=1;i<=4;i++){
		mp[block[i].first][block[i].second]=form;
	}
}
void down(){                          
	for(int i=1;i<=4;i++){
		if(block[i].first+1>20){
			flag=0;
			return ;
		}
		if(mp[block[i].first+1][block[i].second]!=0){
			bool flag_3=0;
			for(int j=1;j<=4;j++){
				if(block[j].first==block[i].first+1&&block[j].second==block[i].second){
					flag_3=1;
					break;
				}
			}
			if(flag_3==0){
				flag=0;
				return ;
			}
		}
	}
	for(int i=1;i<=4;i++){
		mp[block[i].first][block[i].second]=0;
	}
	for(int i=1;i<=4;i++){
		block[i].first+=1;
	}
	for(int i=1;i<=4;i++){
		mp[block[i].first][block[i].second]=form;
	}
}
void way(){
	switch(form){
		case 1:{
			switch(blockway){
				case 1:{ 
					ready(-1,0,1,2,1,0,-1,-2);
					break;
				}
				case 2:{
					ready(1,0,-1,-2,1,0,-1,-2);
					break;
				}
				case 3:{
					ready(1,0,-1,-2,-1,0,1,2);
					break;
				}
				case 4:{
					ready(-1,0,1,2,-1,0,1,2);
					break;
				}
			}
			break;
		}
		case 2:{
			switch(blockway){
				case 1:{ 
					ready(1,2,0,1,1,0,0,-1);
					break;
				}
				case 2:{
					ready(1,0,0,-1,-1,-2,0,-1);
					break;
				}
				case 3:{
					ready(-1,-2,0,-1,-1,0,0,1);
					break;
				}
				case 4:{
					ready(-1,0,0,1,1,2,0,1);
					break;
				}
			}
			break;
		}
		case 3:{
			switch(blockway){
				case 1:{ 
					ready(0,-1,0,1,2,1,0,-1);
					break;
				}
				case 2:{
					ready(2,1,0,-1,0,1,0,-1);
					break;
				}
				case 3:{
					ready(0,1,0,-1,-2,-1,0,1);
					break;
				}
				case 4:{
					ready(-2,-1,0,1,0,-1,0,1);
					break;
				}
			}
			break;
		}
	}
	for(int i=1;i<=4;i++){
		if(block[i].first+block_ready[i-1]<1||block[i].first+block_ready[i-1]>20||block[i].second+block_ready[i-1+4]<1||block[i].second+block_ready[i-1+4]>10){
			return ;
		}
		if(mp[block[i].first+block_ready[i-1]][block[i].second+block_ready[i-1+4]]!=0){
			bool flag_3=0;
			for(int j=1;j<=4;j++){
				if(block[j].first==block[i].first+block_ready[i-1]&&block[j].second==block[i].second+block_ready[i-1+4]!=0){
					flag_3=1;
					break;
				}
			}
			if(flag_3==0){
				return ;
			}
		}
	}
	for(int i=1;i<=4;i++){
		mp[block[i].first][block[i].second]=0;
	}
	for(int i=1;i<=4;i++){
		block[i].first+=block_ready[i-1];
		block[i].second+=block_ready[i-1+4];
	}
	for(int i=1;i<=4;i++){
		mp[block[i].first][block[i].second]=form;
	}
	blockway=(blockway==4?1:blockway+1);
}
void ready(int i1,int i2,int i3,int i4,int j1,int j2,int j3,int j4){
	block_ready[0]=i1;
	block_ready[1]=i2;
	block_ready[2]=i3;
	block_ready[3]=i4;
	block_ready[4]=j1;
	block_ready[5]=j2;
	block_ready[6]=j3;
	block_ready[7]=j4;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...