2048小遊戲主要算法實現
阿新 • • 發佈:2017-06-03
mes 方向 時間限制 上下左右 print ron weight color ges
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4681
總提交: 45 測試通過:16
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4681
4681: 2048
時間限制(普通/Java):1000MS/3000MS 內存限制:65536KByte總提交: 45 測試通過:16
描寫敘述
2048是一款近期較為流行的數字遊戲。非常多同學在課堂上研究怎樣得到更高的積分,以至影響了學習效果,不如自己寫下這款遊戲吧,這樣預計也就沒有玩的興趣了。遊戲的規則是:給定一個4*4的方格,開始的時候僅僅有若幹個2, 每次能夠選擇上下左右當中一個方向去滑動,每滑動一次,全部的數字方塊都會往滑動的方向靠攏外,系統也會在空白的地方亂數出現一個數字方塊,同樣數字的方塊在靠攏、相撞時會相加,能夠連續移動但不能連續相加。玩家的目標就是盡快湊出“2048”這個數字方塊。
作為一個程序猿。寫一個2048遊戲當然難不倒你。通過分析你發現主要問題是怎樣依據當前狀態和滑動方向,確定出下一個方格狀態即滑動後的結果(不考慮新增加的隨機方格)。
每一個狀態繪制出來便成了一個簡單的2048遊戲。
輸入
輸入數據有多組,每組數據的第一行為一個整數d(0表示向左滑,1表示向右滑。2表示向上滑,3表示向下滑)。
接下來有4行4列的方格,每一個方格的值僅僅能為0。2,4。8,16,32,64。128,256,512,1024,2048。當中0表示該格子為空白。
輸出
每組輸出滑動後的狀態,即4行4列的格子值。
例子輸入
2
0 0 0 0
0 0 0 0
0 2 2 0
2 0 0 0
0
2 2 2 0
0 0 2 0
0 0 0 0
0 0 0 0
例子輸出
2 2 2 0
0 0 0 0
0 0 0 0
0 0 0 0
4 2 0 0
2 0 0 0
0 0 0 0
0 0 0 0
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; int a[4][4],n; void up_remove_blank(){ int i,j,k; for(j=0;j<4;j++){ for(i=1;i<4;i++){ k=i; while(k-1>=0&&a[k-1][j]==0){//上面的那個為空 swap(a[k][j],a[k-1][j]); k--; } } } } void down_remove_blank(){ int i,j,k; for(j=0;j<4;j++){ for(i=2;i>=0;i--){ k=i; while(k+1<=3&&a[k+1][j]==0){//上面的那個為空 swap(a[k][j],a[k+1][j]); k++; } } } } void left_remove_blank(){ int i,j,k; for(i=0;i<4;i++){ for(j=1;j<4;j++){ k=j; while(k-1>=0&&a[i][k-1]==0){//上面的那個為空 swap(a[i][k],a[i][k-1]); k--; } } } } void right_remove_blank(){ int i,j,k; for(i=0;i<4;i++){ for(j=2;j>=0;j--){ k=j; while(k+1<=3&&a[i][k+1]==0){//上面的那個為空 swap(a[i][k],a[i][k+1]); k++; } } } } void left(){ int i,j; for(i=0;i<4;i++){ for(j=0;j<3;j++){ if(a[i][j]==a[i][j+1]){ a[i][j]+=a[i][j+1]; a[i][j+1]=0; left_remove_blank(); } } } } void right(){ int i,j; for(i=0;i<4;i++){ for(j=3;j>=1;j--){ if(a[i][j]==a[i][j-1]){ a[i][j]+=a[i][j-1]; a[i][j-1]=0; right_remove_blank(); } } } } void up(){ int i,j; for(j=0;j<4;j++){//每一列 for(i=0;i<3;i++){ if(a[i][j]==a[i+1][j]){ a[i][j]=a[i][j]+a[i+1][j]; a[i+1][j]=0; //移除空格 up_remove_blank(); } } } } void down(){ int i,j; for(j=0;j<4;j++){//每一列 for(i=3;i>=1;i--){ if(a[i][j]==a[i-1][j]){ a[i][j]=a[i][j]+a[i-1][j]; a[i-1][j]=0; //移除空格 down_remove_blank(); } } } } void output(){ int i,j; for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(j==3) printf("%d\n",a[i][j]); else printf("%d ",a[i][j]); } } } int main(){ int i,j; while(scanf("%d",&n)==1){ for(i=0;i<4;i++){ for(j=0;j<4;j++){ scanf("%d",&a[i][j]); } } if(n==0){//左 left_remove_blank(); left(); }else if(n==1){//右 right_remove_blank(); right(); }else if(n==2){//上 up_remove_blank(); up(); } else{//下 down_remove_blank(); down(); } output(); } return 0; }
2048小遊戲主要算法實現