日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2048【模拟】

發布時間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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; }

總結

以上是生活随笔為你收集整理的2048【模拟】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。