// 2048game.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
#include<graphics.h>//easyx图形库头文件
#define MAX_SIZE 4//每一行格子数
#define GRID_WIDTH 100//格子宽数
#define INTERVAL 15//格子之间的间隔
#define WIN_SIZE MAX_SIZE*GRID_WIDTH+(MAX_SIZE+1)*INTERVAL//窗口宽度
#include <iostream>
//枚举每个数字的颜色
enum Color
{
//没有数字的地方是0
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的颜色
bk = RGB(187, 173, 160), //背景颜色
};
//把颜色和数据建立联系
Color arr[13] = { zero, twoTo1,twoTo2,twoTo3,twoTo4,twoTo5,twoTo6,twoTo7,twoTo8,twoTo9,twoTo10,twoTo11,bk };
int num[12] = { 0, 2 ,4 ,8,16,32,64,128,256,512,1024,2048 };
//0 2 4 8 16 32 64 128 256 512 1024 2048
int map[MAX_SIZE][MAX_SIZE];//存储数据 //格子数值
POINT pos[MAX_SIZE][MAX_SIZE];//结构体//格子坐标
char usrkey = 0;//接受按键消息
//随机生成2/4
int RandTwoFour()
{
if (rand() % 10 == 0)//三分之一概率出现4
{
return 4;
}
else {
return 2;//三分之二概率出现2
}
}
//在随机位置产生一个数
void CreateNumber()
{
while (1)
{
//随机数 rand() 随机获得一个整数 0~上万
int x = rand() % MAX_SIZE;//0~3
int y = rand() % MAX_SIZE;//0~3
if (map[x][y] == 0)
{
map[x][y] = RandTwoFour();
break;//产生一个就退出
}
}
}
void GameInit()
{
//初始化数组为0
for (int i = 0; i < MAX_SIZE; i++)
{
for (int k = 0; k < MAX_SIZE; k++)
{
map[i][k] = 0;
}
}
map[0][0] = 2048;
//初始化每个格子的坐标,左上角
for (int i = 0; i < MAX_SIZE; i++)//y
{
for (int k = 0; k < MAX_SIZE; k++)//x
{
//求出每一个格子的x,y
pos[i][k].x = (k * GRID_WIDTH) + ((k + 1) * INTERVAL);//k个格子宽度+k+1个间隔
pos[i][k].y = (i * GRID_WIDTH) + ((i + 1) * INTERVAL);
}
}
//开始游戏时,随机产生两个数字
CreateNumber();
CreateNumber();
}
//游戏绘制
void GameDraw()
{
//设置背景颜色
setbkcolor(Color::bk);
//设置颜色之后需要,清屏(原本的颜色是黑色的,设置的颜色,被覆盖了)
cleardevice();//刷新一下,绘图设备
for (int i = 0; i < MAX_SIZE; i++)//y
{
for (int k = 0; k < MAX_SIZE; k++)//x
{
for (int q = 0; q < 13; q++)
{
//判断数组是哪一个数据
if (map[i][k] == num[q])
{
DWORD tempcolor = arr[q];
setfillcolor(tempcolor );
setlinecolor(tempcolor);
fillrectangle(pos[i][k].x, pos[i][k].y, pos[i][k].x + GRID_WIDTH, pos[i][k].y + GRID_WIDTH);
if (num[q] != 0)
{
//绘制数字
//设置文字大小
char number[5] = "";
sprintf(number, "%d", num[q]);
setbkmode(TRANSPARENT);
settextcolor(RGB(119, 110, 101));
settextstyle(50, 0, "黑体");
int temp = textwidth(number);//获取字符
//计算第一个字开始的位置 让数字在格子内居中
temp = (GRID_WIDTH - temp)/2;
//int 整数
outtextxy(pos[i][k].x+temp, pos[i][k].y+25, number);
}
break;//找到了对应的值就,换下一个继续找
}
}
}
}
}
//移动
void moveup()
{
for (int i = 0; i < MAX_SIZE; i++)
{
int temp = 0;
for (int begin = 1; begin < MAX_SIZE; begin++)
{
if (map[begin][i] != 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;
temp++;
}
else
{
map[temp+1][i]= map[begin][i];
if (temp + 1 != begin)
{
map[begin][i] = 0;
}
temp++;
}
}
}
}
}
void movedown()
{
for (int i = 0; i < MAX_SIZE; i++)
{
int temp = MAX_SIZE - 1;
for (int begin = MAX_SIZE - 2; begin >= 0; begin--)
{
if (map[begin][i] != 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;
temp--;
}
else
{
map[temp - 1][i] = map[begin][i];
if ((temp - 1) != begin)
{
map[begin][i] = 0;
}
temp--;
}
}
}
}
}
void moveleft()
{
for (int i = 0; i < MAX_SIZE; i++)
{
int temp = 0;
for (int begin = 1; begin < MAX_SIZE; begin++)
{
if (map[i][begin] != 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;
temp++;
}
else
{
map[i][temp + 1] = map[i][begin];
if (temp + 1 != begin)
{
map[i][begin] = 0;
}
temp++;
}
}
}
}
}
void moveright()
{
for (int i = 0; i < MAX_SIZE; i++)
{
int temp = MAX_SIZE - 1;
for (int begin = MAX_SIZE - 2; begin >= 0; begin--)
{
if (map[i][begin] != 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;
temp--;
}
else
{
map[i][temp - 1] = map[i][begin];
if (temp - 1 != begin)
{
map[i][begin] = 0;
}
temp--;
}
}
}
}
}
void KeyControl()
{
usrkey = _getch();
switch (usrkey)
{
case 72:
case'w':
case'W':
moveup();
CreateNumber();
break;
case 80:
case'S':
case's':
movedown();
CreateNumber();
break;
case 75:
case'a':
case'A':
moveleft();
CreateNumber();
break;
case 77:
case'd':
case'D':
moveright();
CreateNumber();
break;
default:
break;
}
}
int main(int argc, char* argv[])
{
//创建一个窗口
//第一个参数是宽度,二个高度
initgraph(WIN_SIZE,WIN_SIZE,SHOWCONSOLE);
GameInit();
while (1)
{
GameDraw();
KeyControl();
}
while (1);
return 0;
}
在按下方向键上下左右后处理游戏数据