/*
开发:VS2019+easyx;
项目:2048;
参数:4*4网格、宽度100、间隔15、
background:RGB(187, 173, 160)
*/
#undef UNICODE
#undef _UNICODE
#include<stdio.h>
#include<conio.h>
#include<graphics.h> //图形库头文件
#define max_grid 4 //行格子数
#define grid_width 100 //格子宽度
#define interval 15 //间隔
enum Color //格子颜色RGB
{
zero = RGB(205,193,180), //0
twoto1 = RGB(238,228,218), //2
twoto2 = RGB(237,224,200), //4
twoto3 = RGB(242, 177, 121), //8
twoto4 = RGB(245, 149, 99), //16
twoto5 = RGB(246, 124, 95), //32
twoto6 = RGB(246, 94, 59), //64
twoto7 = RGB(242, 177, 121), //128
twoto8 = RGB(237, 204, 97), //256
twoto9 = RGB(255, 0, 128), //512
twoto10 = RGB(145, 0, 72), //1024
twoto11 = RGB(242, 17, 158), //2048
back = RGB(187,173,160), //background
};
Color arr[13] = { zero,twoto1,twoto2,twoto3,twoto4,twoto5,twoto6,twoto7,twoto8,twoto9,twoto10,twoto11,back }; //枚举数组绘图
int num[12] = { 0,2,4,8,16,32,64,128,256,512,1024,2048 };
int map[max_grid][max_grid]; //变量初始化为0;
POINT pos[max_grid][max_grid]; //各个格子左上角坐标;
bool flag = false;
//定义函数:随机返回2或4;
int twoORfour()
{
if (rand() % 10 == 1) //0.1概率产生4 //0.9概率产生2;
{
return 4;
}
else
{
return 2;
}
}
//将产生的数放置在数组随机位置上;
void Creatnumber()
{
while (1)
{
int x = rand() % max_grid;
int y = rand() % max_grid;
if (map[x][y] == 0)
{
map[x][y] = twoORfour();
break;
}
}
}
void gameInit() //计算格子坐标;
{
//设置随机数种子
srand(GetTickCount()); //取开机至今所经过的毫秒数作为随机数种子;
for (int i = 0; i < max_grid; i++)
{
for (int k = 0; k < max_grid; k++)
{
pos[i][k].x = k * grid_width + (k + 1)*interval;
pos[i][k].y = i * grid_width + (i + 1)*interval;
}
}
//初始化随机产生2个数值
Creatnumber();
Creatnumber();
}
void gamedraw()
{
setbkcolor(back);
cleardevice();
for (int i = 0; i < max_grid; i++)
{
for (int k = 0; k < max_grid; k++) //遍历二维数组;
{
for (int q = 0; q < 12; q++)
{
if (map[i][k] == num[q])
{
setfillcolor(arr[q]);
solidrectangle(pos[i][k].x, pos[i][k].y, pos[i][k].x + grid_width, pos[i][k].y + grid_width); //fillrectangle->solidrectangle实现网格去白边;
if (map[i][k] != 0)
{
char number[5] = " ";
settextcolor(RGB(119, 110, 101));
settextstyle(50, 0, "宋体"); //#undef UNICODE #undef _UNICODE 置于顶部解决字符串编码自适应性
setbkmode(TRANSPARENT); //背景透明
sprintf_s(number, "%d", map[i][k]); //sprintf_s?
int tempx = grid_width / 2 - textwidth(number) / 2;
int tempy = grid_width / 2 - textheight(number) / 2;
//tips:格子一半-字符串一半;
outtextxy(pos[i][k].x+tempx, pos[i][k].y+tempy,number); //尾部输出为字符串“数字转字符串” //或字符前加L 解决无参数列表匹配问题!//
}
}
}
//判断map值见上;
}
}
}
// 上移
void moveup()
{
for (int i = 0; i < max_grid; i++)
{
int temp = 0;
for (int begin = 1; begin < max_grid; begin++)
{
if (map[begin][i] != 0) //判断目标方格是否为0;
{
if (map[temp][i] == 0)
{
map[temp][i] == map[begin][i];
map[begin][i] = 0;
}
else if (map[temp][i] == map[begin][i])
{
map[temp][i] += map[begin][i];
map[begin][i] = 0;
}
else
{
map[temp+1][i] = map[begin][i];
if (temp + 1 != begin)
{
map[begin][i] = 0;
}
}
temp++;
flag = true;
}
}
}
printf("up\n");
}
// 下移
void movedown()
{
for (int i = 0; i < max_grid; i++)
{
int temp = max_grid-1;
for (int begin = max_grid-2; begin >=0; begin--)
{
if (map[begin][i] != 0) //判断目标方格是否为0;
{
if (map[temp][i] == 0)
{
map[temp][i] == map[begin][i];
map[begin][i] = 0;
}
else if (map[temp][i] == map[begin][i])
{
map[temp][i] += map[begin][i];
map[begin][i] = 0;
}
else
{
map[temp - 1][i] = map[begin][i];
if (temp - 1 != begin)
{
map[begin][i] = 0;
}
}
temp--;
flag = true;
}
}
}
printf("down\n");
}
// 左移
void moveleft()
{
for (int i = 0; i < max_grid; i++)
{
int temp = 0;
for (int begin = 1; begin < max_grid; begin++)
{
if (map[i][begin] != 0) //判断目标方格是否为0;
{
if (map[i][temp] == 0)
{
map[i][temp] == map[i][begin];
map[i][begin] = 0;
}
else if (map[i][temp] == map[i][begin])
{
map[i][temp] += map[i][begin];
map[i][begin] = 0;
}
else
{
map[i][temp+1] = map[i][begin];
if (temp + 1 != begin)
{
map[i][begin] = 0;
}
}
temp++;
flag = true;
}
}
}
printf("left\n");
}
// 右移
void moveright()
{
for (int i = 0; i < max_grid; i++)
{
int temp = max_grid - 1;
for (int begin = max_grid - 2; begin >=0; begin--)
{
if (map[i][begin] != 0) //判断目标方格是否为0;
{
if (map[i][temp] == 0)
{
map[i][temp] == map[i][begin];
map[i][begin] = 0;
}
else if (map[i][temp] == map[i][begin])
{
map[i][temp] += map[i][begin];
map[i][begin] = 0;
}
else
{
map[i][temp - 1] = map[i][begin];
if (temp - 1 != begin)
{
map[i][begin] = 0;
}
}
temp--;
flag = true;
}
}
}
printf("right\n");
}
void gamejudge()
{
if (flag)
{
Creatnumber();
flag = false;
}
}
//键盘控制方格数字移动;
void GameControl()
{
//getchar:获取键盘输入
char key = _getch();
switch (key) //挑选输入变量
{
case 'w':
case'W':
case 72:
moveup();
break;
case's':
case'S':
case 80:
movedown();
break;
case'a':
case'A':
case 75:
moveleft();
break;
case'd':
case'D':
case 77:
moveright();
break;
}
}
int main()
{
initgraph(max_grid * grid_width + 5 * interval, max_grid * grid_width + 5 * interval,1);
while (1)
{
gameInit();
gamedraw();
GameControl();
gamejudge();
}
getchar();
return 0;
}