C++ 控制檯版 2048小遊戲
阿新 • • 發佈:2019-01-30
先說說2048遊戲的規則:
開始的時候空格中會出現兩個數字(只能為2或者4),使用者可以選擇上下左右鍵進行移動,數字們整體沿著方向移動,中間不存在空格,如果相鄰的兩個數字相等,那麼合併至沿著方向的後一個,更新最大值,總分數加上新出現的數字。當出現2048,Win。或者沒有空格了,Lose。
基本就是一個按照思路的模擬題,沒有什麼難度。不過我想寫一個自動求解的程式,但是bfs搜尋的話解空間太龐大,沒有想到好的方法,有路過的牛人還請指點。
//2048 by Tach #include<iostream> #include<string> #include<ctime> #include<cstring> #include<conio.h> #include<iomanip> #include<algorithm> using namespace std; int g[4][4]; int vis[4][4]; int maxNum=0,score=0; void print() //列印圖案 { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) cout<<setw(5)<<g[i][j]; cout<<endl<<endl; } cout<<"Max:"<<maxNum<<" "<<"Score:"<<score<<endl; } void init() { for(int i=0;i<4;i++) for(int j=0;j<4;j++) g[i][j]=0; memset(vis,0,sizeof(vis)); print(); } bool GameOver() //判斷是是否還有空格 { bool flag=false; for(int i=0;i<4;i++) for(int j=0;j<4;j++) { if(vis[i][j]==0) { flag=true; goto loop; } } loop: return flag; } bool GetResult() //判斷是否出現2048 { for(int i=0;i<4;i++) for(int j=0;j<4;j++) { if(g[i][j]==2048) return true; } } void RandNum(int f) //隨機生成2或者4,f代表需要生成的個數 { int num=0; while(1) { int x=rand()%4; int y=rand()%4; if(vis[x][y]==0) { vis[x][y]=1; int z=rand()%4+2; if(z%2!=0) z-=1; g[x][y]=z; num++; if(num==f) break; } } system("cls"); print(); } void work() //主函式,處理按鍵 { while(1) { int ch=getch(); if(ch==72)//上 { for(int j=0;j<4;j++) for(int i=0;i<4;i++) { if(vis[i][j]==1) { for(int k=i-1;k>=0;k--) { if(vis[k][j]==1) { if(g[k][j]==g[k+1][j]) { g[k][j]+=g[k][j]; g[k+1][j]=0; vis[k+1][j]=0; maxNum=max(maxNum,g[k][j]); score+=g[k][j]; break; } else break; } else { int temp=g[k][j];//類似冒泡 g[k][j]=g[k+1][j]; g[k+1][j]=temp; vis[k+1][j]=0; vis[k][j]=1; } } } } RandNum(1); system("cls"); print(); if(GameOver()==false) { cout<<"Game Over!!1"<<endl; break; } if(GetResult()==true) { cout<<"You Win!!"<<endl; break; } } if(ch==80)//下 { for(int j=0;j<4;j++) for(int i=3;i>=0;i--) { if(vis[i][j]==1) { for(int k=i+1;k<4;k++) { if(vis[k][j]==1) { if(g[k][j]==g[k-1][j]) { g[k][j]+=g[k-1][j]; g[k-1][j]=0; vis[k-1][j]=0; maxNum=max(maxNum,g[k][j]); score+=g[k][j]; break; } else break; } else { int temp=g[k][j]; g[k][j]=g[k-1][j]; g[k-1][j]=temp; vis[k-1][j]=0; vis[k][j]=1; } } } } RandNum(1); system("cls"); print(); if(GameOver()==false) { cout<<"Game Over!!1"<<endl; break; } if(GetResult()==true) { cout<<"You Win!!"<<endl; break; } } if(ch==75)//左 { for(int i=0;i<4;i++) for(int j=0;j<4;j++) { if(vis[i][j]==1) { for(int k=j-1;k>=0;k--) { if(vis[i][k]==1) { if(g[i][k]==g[i][k+1]) { g[i][k]+=g[i][k+1]; g[i][k+1]=0; vis[i][k+1]=0; maxNum=max(maxNum,g[i][k]); score+=g[i][k]; break; } else break; } else { int temp=g[i][k]; g[i][k]=g[i][k+1]; g[i][k+1]=temp; vis[i][k+1]=0; vis[i][k]=1; } } } } RandNum(1); system("cls"); print(); if(GameOver()==false) { cout<<"Game Over!!!"<<endl; break; } if(GetResult()==true) { cout<<"You Win!!"<<endl; break; } } if(ch==77)//右 { for(int i=0;i<4;i++) for(int j=3;j>=0;j--) { if(vis[i][j]==1) { for(int k=j+1;k<4;k++) { if(vis[i][k]==1) { if(g[i][k]==g[i][k-1]) { g[i][k]+=g[i][k-1]; g[i][k-1]=0; vis[i][k-1]=0; maxNum=max(maxNum,g[i][k]); score+=g[i][k]; break; } else break; } else { int temp=g[i][k]; g[i][k]=g[i][k-1]; g[i][k-1]=temp; vis[i][k-1]=0; vis[i][k]=1; } } } } RandNum(1); system("cls"); print(); if(GameOver()==false) { cout<<"Game Over!!!"<<endl; break; } if(GetResult()==true) { cout<<"You Win!!"<<endl; break; } } } } int main() { init(); srand((unsigned)time(NULL)); RandNum(2); work(); return 0; }