游戏规则
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;
}