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

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

时间: 2024-08-02 12:51:28

C++ 控制台版 2048小游戏的相关文章

2048小游戏(C语言版)

1 #include <climits> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 #include <string> 6 #include <map> 7 #include <vector> 8 #include <cmath> 9 10 11 /* 12 玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格

2048小游戏(变态版哦)

近日,由于博主同学暑假有个作业是写个2048小游戏,我一听挺好玩的..然后就开始了.. 首先,2048在移动过程中的规则其实也没有特别难,但是感觉也不是一句话就能说完的.(不过玩的多--感觉总是有的) 废话不多说,其实博主同学提供了pdf描述了2048的算法. 各位筒子入坑前请先过几眼这个规则,以及其算法(当然我觉得算法第二点有点问题,后述) 那么在游戏的编写前,可以先对细枝末节做一些准备. 1.出现数字2/4的概率 int getRand() { int i = rand() % 10; if

用控制台写类窗体2048小游戏

原文地址:用控制台写类窗体2048小游戏作者:余文 2048是一个很简单的小游戏,这是我自己实现的一个版本. 这个版本有两个特色 这是一个高仿窗体程序的控制台程序. 通过使用指针将四个方向的移动简化成了一个方向的移动. 当初刚出来2048小游戏的时候,玩的不亦乐乎.之后根据游戏规则自己花了一下午时间用控制台写了一个玩,没有参考源码. 当时只实现了游戏的移动逻辑和胜负判定逻辑,界面很简单,但已经可以玩玩了. 这是当初刚写完发空间说说得瑟的时候. 今年5月有段时候比较闲,对程序做了较大更新. 实时显

如何在CentOS上安装一个2048小游戏

如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由于我个人的编程能力不强,所以我就在网上找到了一个C语言版的2048游戏小程序,我把它放到我的百度网盘上,可以供大家下载(链接:http://pan.baidu.com/s/1jIutb3g 密码:mu9z),然后我们把这个程序给复制到CentOS系统下,在进行下一步的工作.我们可以在CentOS上安

js、jQuery实现2048小游戏

一.游戏简介:  2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合并,组成更大的数字,每次移动或合并后会增加一个数字. 当16宫格中没有空格子,且四个方向都无法操作时,游戏结束. 三. 游戏目的: 目的是合并出2048这个数字,获得更高的分数. 四. 游戏截图:  五.先来玩一下: 开始游戏 查看源码 六.游戏实现原理: 使用js.jQuery实现了PC版及手机版,实现原理是一样

.NET手撸2048小游戏

.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEngine,从空白窗口开始,演示如何"手撸"2048小游戏,并在编码过程中感受C#的魅力和.NET编程的快乐. 说明:FlysEngine是封装于Direct2D,重复本文示例,只需在.NET Core 3.0下安装NuGet包FlysEngine.Desktop即可. 并不一定非要做一层封装

C# 开发2048小游戏

这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的童鞋完成了. 更改建议: a.当数字超过四位数时,显示的时候有部分被它的容器TextBox遮挡了,能不能把显示的数值变小点?答案是可以的.代码里有一段通过矩阵数据填充TextBox值的操作,可以在填充时,判断下数值长度,然后修改TextBox的文字大小. b.玩游戏的时候,使用方向键移动时,焦点可能

canvas随笔之2048小游戏

HTML: <!DOCTYPE HTML> <html> <head> <title>2048小游戏</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, u

Java_电脑版_2048小游戏

今天翻了翻电脑, 突然看到这个小东西, 拿来和大家分享一下 import java.awt.Color; import java.awt.Font; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Random; import javax.