C++ 控制台版 2048小游戏

来源:互联网 发布:淘宝未发货退款要多久 编辑:程序博客网 时间:2024/06/13 22:49

先说说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;} 


2 0