1. 程式人生 > >C++ 控制檯版 2048小遊戲

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