码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 控制台版 2048小游戏

时间:2015-08-12 19:17:45      阅读:137      评论:0      收藏:0      [点我收藏+]

标签: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;
} 


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ 控制台版 2048小游戏

标签:c++   游戏   控制台   2048   

原文地址:http://blog.csdn.net/nk_test/article/details/47449189

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!