C++ 控制台版 2048小游戏
发布时间
阅读量:
阅读量
先说说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;
}
全部评论 (0)
还没有任何评论哟~
