1. 程式人生 > >ccf學習 俄羅斯方塊c++ 50分

ccf學習 俄羅斯方塊c++ 50分

寫俄羅斯方塊的程式只有50分 邏輯也是比較坑坑巴巴 乾乾巴巴麻麻賴賴的一點都不圓潤 有沒有大神看到的可以指導一下的哦 嚶嚶嚶

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {
	int a[18][10],b[4][4];
	for(int i=0;i<3;i++){
		for(int j=0;j<10;j++){
			a[i][j]=0;
		}
	}
	for(int i=3;i<18;i++){
		for(int j=0;j<10;j++){
			cin>>a[i][j];
		}
	}
//	int a[18][10]={
//				   {0,0,0,0,0,0,0,0,0,0},
//				   {0,0,0,0,0,0,0,0,0,0},
//				   {0,0,0,0,0,0,0,0,0,0},
//				   {0,1,1,1,0,0,0,0,0,0},
//				   {0,1,1,1,0,0,0,0,0,0},
//				   {0,0,0,0,0,0,0,0,0,0},
//				   {0,0,0,0,0,0,0,0,0,0},
//				   {0,0,0,0,0,0,0,0,0,0},
//				   {0,0,1,0,0,0,0,1,0,0},
//				   {0,0,0,0,0,0,0,0,0,0},
//				   {0,0,0,0,0,0,0,0,0,0},
//				   {0,0,1,1,1,0,0,0,0,0},
//				   {0,0,0,0,0,0,0,0,0,0},
//				   {0,0,0,0,0,0,0,1,0,0},
//				   {0,0,1,0,0,0,1,0,0,0},
//				   {0,0,0,0,0,0,1,0,0,0},
//				   {1,1,1,0,0,0,1,1,1,1},
//				   {0,0,0,0,1,0,0,0,0,0}};

	for(int i=0;i<4;i++){
		for(int j=0;j<4;j++){
			cin>>b[i][j];
		}
	}
//	int b[4][4]={{0,0,1,0},
//				 {0,0,1,0},
//				 {0,0,1,0},
//				 {0,0,1,0}};
//	int c=5;
	int c;
	cin>>c;
	bool left;
	for(int j=0;j<4;j++){
		left=true;
		for(int i=0;i<4;i++){
			if(b[i][j]!=0){
				left=false;
				break;
			}
		}
		if(left){
			c=c-1;	
		}
		if(!left){
			break;
		}
	}		
	bool stop;
	stop=false;
	int stoph;
	for(int i=0;i<18;i++){
		for(int j=3;j>=0;j--){
			for(int k=0;k<4;k++){
				int s=a[i+j][c+k]+b[j][k];
				if(s>=2){
					stoph=i-1;
					stop=true;
					break;
				}
			}
		}
		if(stop) break;	
	}
	if(stop&&stoph>0){
 		for(int i=0;i<4;i++){
			int newh=stoph+i;
			for(int j=0;j<4;j++){
				int newl=c+j;
				if(a[newh][newl]==0){
					a[newh][newl]=b[i][j];
				}
			}	
 		}			
	}else if(!stop&&stoph>0){
		int newh = 11;
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				if(a[newh+i][c+j]==0){
					a[newh+i][c+j]=b[i][j];
				} 
			}
		}
	}
	for(int i=3;i<18;i++){
		for(int j=0;j<10;j++){
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

大致思路如下: 首先給大矩陣加前三行,方便在二重遍歷時小塊可以從第一行開始計算是否被重疊 每個小塊都從最底一行開始遍歷,若與大棋盤有重疊則兩點之和大於1,停止下落 停止下落後將小塊的值賦值給大棋盤 難道是左右邊界也有問題 啊啊啊 好煩呀不想思考了 去看大神程式碼了 嚶嚶嚶