2048【模拟】
>Description
2048游戲:這是一個4*4的矩陣,初始全為0。每次一個沒有數字的格子中會隨機出現一個2或4,每次可以選擇上下左右其中一個方向去滑動,每滑動一次,所有的數字方塊都會往滑動的方向靠攏外,相同數字的方塊在靠攏、相撞時會相加。
Conan想看看今天自己運氣咋樣,于是就閉著眼睛,在屏幕上隨便滑來滑去。過了一會,他然后睜開眼睛,如果游戲沒有結束(滑動后如果沒有空格子,則游戲結束),請輸出矩陣,否則輸出Game over!
>Input
輸入第一行包含一個整數N,表示Conan滑了幾下。
接下來N 行,x, y, v, f表示第x行與第y列出現數字為v后,Conan滑的方向為f(f為字符,U, D, L, R分別表示向上下左右滑)。
行從上往下1-4標號,列從左往右1-4標號。
數據保證在游戲未結束時,只會在空白區域出現數字。
>Output
輸出按題目描述。
>Sample Input
8
1 3 4 L
2 3 2 U
2 4 2 R
4 1 2 L
3 2 2 D
1 3 4 R
1 3 2 U
>Sample Output
0 0 2 8
0 0 0 2
0 0 0 8
0 0 0 0
解題思路
巨大模擬。
有很多關于移動和合并的注意項,各位去多玩幾次2048就可以發現了。
但是要加各種很麻煩的判斷才能A:一定要注意輸入時有可能會結束游戲,所以要在每一次輸入一組之前判斷一下游戲有沒有結束(沒有結束的條件:1矩陣還有空格;2沒有空格但是還可以滑動,即每一個格的上下左右有一個與這個格的值相同)。
然后我是先把當前格移動到最上或下或左或右邊,在與這個格的上或下或左或右格合并。不得不說我的代碼被我和cyz大佬改了很久
>代碼
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,x,y,v,a[5][5],t; char f; bool yy[5][5]; void ooo(int xx,int yy) {if(f=='R'){if(a[xx][yy+1]!=0||yy+1>4) {t=yy; return;}ooo(xx,yy+1);}else if(f=='L'){if(a[xx][yy-1]!=0||yy-1<1) {t=yy; return;}ooo(xx,yy-1);}else if(f=='U'){if(a[xx-1][yy]!=0||xx-1<1) {t=xx; return;}ooo(xx-1,yy);}else{if(a[xx+1][yy]!=0||xx+1>4) {t=xx; return;}ooo(xx+1,yy);} } bool lil() {for(int i=1;i<=4;i++)for(int j=1;j<=4;j++)if(a[i][j]==0 //如果有空格||a[i][j+1]==a[i][j]||a[i][j-1]==a[i][j]||a[i-1][j]==a[i][j]||a[i+1][j]==a[i][j]) //如果還可以滑行return 1;return 0; } int main() {scanf("%d",&n);for(int k=1;k<=n;k++){if(k==n&&!lil()) {printf("Game over!"); return 0;} //每次判斷有沒有結束scanf("%d%d%d %c",&x,&y,&v,&f);a[x][y]=v; //加入數值memset(yy,0,sizeof(yy)); //yy記錄某一個格有沒有進行合并過if(f=='R'){for(int i=1;i<=4;i++)for(int j=3;j>=1;j--){if(a[i][j]==0) continue;ooo(i,j); //移if(t+1<=4&&a[i][j]==a[i][t+1]&&!yy[i][t+1])a[i][t+1]=a[i][j]*2,a[i][j]=0,yy[i][t+1]=1; //合并else if(t!=j) a[i][t]=a[i][j],a[i][j]=0;}}else if(f=='L'){for(int i=1;i<=4;i++)for(int j=2;j<=4;j++){if(a[i][j]==0) continue;ooo(i,j);if(t-1>=1&&a[i][j]==a[i][t-1]&&!yy[i][t-1])a[i][t-1]=a[i][j]*2,a[i][j]=0,yy[i][t-1]=1;else if(t!=j) a[i][t]=a[i][j],a[i][j]=0;}}else if(f=='U'){for(int j=1;j<=4;j++)for(int i=2;i<=4;i++){if(a[i][j]==0) continue;ooo(i,j);if(t-1>=1&&a[i][j]==a[t-1][j]&&!yy[t-1][j])a[t-1][j]=a[i][j]*2,a[i][j]=0,yy[t-1][j]=1;else if(t!=i) a[t][j]=a[i][j],a[i][j]=0;}}else{for(int j=1;j<=4;j++)for(int i=3;i>=1;i--){if(a[i][j]==0) continue;ooo(i,j);if(t+1<=4&&a[i][j]==a[t+1][j]&&!yy[t+1][j])a[t+1][j]=a[i][j]*2,a[i][j]=0,yy[t+1][j]=1;else if(t!=i) a[t][j]=a[i][j],a[i][j]=0;}} //同上,但是有很多地方要系統地改一下}for(int i1=1;i1<=4;i1++){for(int j1=1;j1<=4;j1++)printf("%d ",a[i1][j1]);printf("\n");}return 0; }總結
- 上一篇: opencv3+python3.5成语填
- 下一篇: Opencv图像二值化操作