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
- C++ 控制台版 2048小游戏
- C语言控制台小游戏
- [C]名字大战(控制台小游戏)
- c语言控制台输出制作拼图小游戏
- c语言控制台推箱子小游戏
- C++实现2048小游戏(控制台版的)
- 【小游戏】C++打造2048控制台版本
- 一个控制台版的猜字小游戏
- java控制台贪吃蛇小游戏(多线程版)
- c语言控制台的一个贪吃蛇小游戏
- Java小游戏之控制台小游戏
- C语言2048小游戏
- 2048 控制台版(c实现)
- 控制台的小游戏
- 简单的控制台小游戏
- 推箱子小游戏--控制台
- 一个控制台类小游戏
- 控制台小游戏之五子棋
- nfs挂在内核或U-boot出错TT***ERROR:Cannotumount
- 【实例】html5-canvas通过鼠标绘制线段
- 大阅兵大实力 TCL H8800助力阅兵前线指挥车
- 【C/S】——面向对象的程序设计概念理解
- Activity界面跳转及其生命周期
- C++ 控制台版 2048小游戏
- Mysql 出现Error 1118的一种解决方法
- JAVA真实企业面试题
- django学习笔记(—)
- I2C通信流程
- Java——StringBuffer
- 【Github教程】史上最全github使用方法:github入门到精通
- C语言指针内存类错题
- Android学习笔记之-:对Android图像色调饱和度亮度处理