2048小游戏 4*4 方格 c++(图形库)

游戏规则
1、其中有格子达到2048 即为游戏胜利
2、用上下左右箭头进行操作
3、格中数字往输入方向的顶点移去 相同便相加 为0则取代
如:第一列数字从上到下依次为0 2 2 4
输入上箭头 4 4 0 0
4、每次输入方向完之后 会随机在0的位置出现初始的数值
5、当4*4个格中的数字全不为0的时候则失败

#undef UNICODE
#undef _UNICODE
#if _MSC_VER > 1200
#define __sprintf(...) sprintf_s(__VA_ARGS__)
#endif

#include<iostream>
#include<graphics.h>
#include<ctime>
#include<conio.h>
#include<math.h>
using namespace std;

//初始两个值
void random(int a[][4])
{
	int i = rand() % 4;
	int j = rand() % 4;
	a[i][j] = 2;
	i = rand() % 4;
	j = rand() % 4;
	a[i][j] = 4;
}

void Sort(int b[])
{
	for (int i = 0; i<4; i++)
	{
		for (int j = 0; j<3 - i; j++)
		{
			if (b[j]<b[j + 1] && b[j] == 0)
			{
				swap(b[j], b[j + 1]);
			}
		}
	}
}

void judge(int b[])
{
	Sort(b);
	int c[4] = { 0 };
	for (int i = 1; i<4; i++)
	{
		if (b[i] != 0)
		{
			for (int j = 0; j<i; j++)
			{
				if (b[j] == b[i] && c[j] != 1 && c[i] != 1&&abs(i-j)==1)
				{
					b[j] += b[i];
					b[i] = 0;
					c[j] = 1;
					break;
				}
			}
			Sort(b);
		}
	}
	Sort(b);
}

//绘制框架
void Draw()
{	
	setcolor(RED);
	fillrectangle(120, 40, 520, 440);
	setlinecolor(BLUE);
	setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
	line(120, 140, 520, 140); line(120, 240, 520, 240); line(120, 340, 520, 340);
	line(220, 40, 220, 440); line(320, 40, 320, 440); line(420, 40, 420, 440);
}
//绘制数字
void Witer(int a[][4])
{
	settextstyle(20,0,"宋体");
	setcolor(BLACK);
	for (int i = 0; i<4; i++)
	{
		for (int j = 0; j<4; j++)
		{
			char s[5];
			sprintf(s, "%d", a[j][i]);
			outtextxy(160 + i * 100, 80+ j * 100, s);
		}
	}
}
//随机取数
void value(int a[][4])
{
	while (1)
	{
		int x, y;
		x = rand() % 4;
		y = rand() % 4;

		if (a[x][y] == 0)
		{
			switch (rand() % 2)
			{
			case 0:
				a[x][y] = 2;
				break;
			case 1:
				a[x][y] = 4;
				break;
			}
			break;
		}
	}
}
//找最大值 ,判断是否为2048
int Find_max(int a[][4])
{
	int max = 0;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (max < a[i][j])
			{
				max = a[i][j];
			}
		}
	}
	return max;
}

int main()
{
	initgraph(640, 480);//窗口大小
	setbkcolor(WHITE);//背景色
	cleardevice();//清屏
	srand(time(NULL));
	int a[4][4] = { 0 };//方格点数
	int b[4] = { 0 };
	random(a);
	int max=0;
	while (1)
	{
		char ch = 0;
		cleardevice();//清屏
		Draw();
		Witer(a);
		Sleep(100);
		if (_kbhit())
			ch = _getch();//获取按键
		int num = 0;
		switch (ch)
		{
		case 72://上		
			for (int i = 0; i<4; i++)
			{
				memset(b, 0, sizeof(b));
				//一列一列的输入b[]中进行操作(从左到右,从上到下)
				for (int j = 0; j<4; j++)
				{
					b[j] = a[j][i];				
				}
				judge(b);
				//b[]操作完成输回a[][]中
				//其他操作类似
				for (int j = 0; j<4; j++)
				{
					a[j][i] = b[j];
				}
			}
			for (int i = 0; i<4; i++)
			{
				for (int j = 0; j<4; j++)
				{
					if (a[i][j] == 0)
						num++;
				}
			}

			value(a);

			num--;
			if (num == 0)
			{
				cout << "游戏结束" << endl;
				_getch();
				exit(0);
			}
			break;
		case 80://下
			for (int i = 0; i<4; i++)
			{
				memset(b, 0, sizeof(b));
				int t = 0;
				for (int j = 3; j >= 0; j--)
				{
					b[t++] = a[j][i];
					
				}
				judge(b);
				t = 0;
				for (int j = 3; j >= 0; j--)
				{
					a[j][i] = b[t++];
				}
			}
			for (int i = 0; i<4; i++)
			{
				for (int j = 0; j<4; j++)
				{
					if (a[i][j] == 0)
						num++;
				}
			}
			value(a);
			num--;
			if (num == 0)
			{
				cout << "游戏结束" << endl;
				_getch();
				exit(0);
			}
			break;
		case 75://左
			for (int i = 0; i<4; i++)
			{
				memset(b, 0, sizeof(b));
				for (int j = 0; j<4; j++)
				{
					b[j] = a[i][j];
					
				}
				judge(b);
				for (int j = 0; j<4; j++)
				{
					a[i][j] = b[j];
				}
			}
			for (int i = 0; i<4; i++)
			{
				for (int j = 0; j<4; j++)
				{
					if (a[i][j] == 0)
						num++;
				}
			}
			value(a);
			num--;
			if (num == 0)
			{
				cout << "游戏结束" << endl;
				_getch();
				exit(0);
			}
			break;
		case 77://右
			for (int i = 0; i<4; i++)
			{
				memset(b, 0, sizeof(b));
				int t = 0;
				for (int j = 3; j >= 0; j--)
				{
					b[t++] = a[i][j];
					
				}
				judge(b);
				t = 0;
				for (int j = 3; j >= 0; j--)
				{
					a[i][j] = b[t++];
				}
			}
			for (int i = 0; i<4; i++)
			{
				for (int j = 0; j<4; j++)
				{
					if (a[i][j] == 0)
						num++;
				}
			}
			value(a);
			num--;
			//格子满,结束
			if (num == 0)
			{
				cout << "游戏结束" << endl;
				_getch();
				exit(0);
			}
			break;
		case 27:
			exit(0);
			break;
		}
		max = Find_max(a);
		//到达2048,结束
		if (max == 2048)
		{
			cout << "游戏" << endl;
			_getch();
			exit(0);
		}
	}
	_getch();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44922497/article/details/102842983
今日推荐