ccf學習 俄羅斯方塊c++ 50分
阿新 • • 發佈:2018-12-19
寫俄羅斯方塊的程式只有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,停止下落 停止下落後將小塊的值賦值給大棋盤 難道是左右邊界也有問題 啊啊啊 好煩呀不想思考了 去看大神程式碼了 嚶嚶嚶