先说说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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/nk_test/article/details/47449189