效果图
#include<stdio.h>
#include<graphics.h>//easyx图形库
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<conio.h>
#define GRID_W 100//定义格子的宽度
#define MAX_SIZE 4//定义每行每列格子的数量
#define INTERVAL 15 //格子之间的间距
#define WIN_SIZE MAX_SIZE*GRID_W+INTERVAL*(MAX_SIZE+1) //定义窗口的宽度和高度
//枚举格子颜色
enum Color {
zero = RGB(205, 193, 180),
twoTo1 = RGB(238, 228, 218),
twoTo2 = RGB(237, 224, 200),
twoTo3 = RGB(242, 177, 121),
twoTo4 = RGB(245, 149, 99),
twoTo5 = RGB(246, 124, 95),
twoTo6 = RGB(246, 94, 59),
twoTo7 = RGB(242, 177, 121),
twoTo8 = RGB(237, 204, 97),
twoTo9 = RGB(255, 0, 128),
twoTo10 = RGB(145, 0, 72),
twoTo11 = RGB(242, 17, 158),
back = RGB(187, 173, 160),
};
Color colors[13] = { zero,twoTo1 ,twoTo2 , twoTo3 , twoTo4 , twoTo5 , twoTo6 , twoTo7 , twoTo8 ,twoTo9,twoTo10 ,twoTo11 ,back };
//======================定义数组存储数据==========================================
int map[MAX_SIZE][MAX_SIZE];//全局变量,自动初始化为0
//=================随机产生一个整数2or4,产生2的概率要比4大==================
int createNum() {
//直接用rand不会产生随机的数,可以用srand,rand用来产生概率
//printf("%d", rand());
//用rand判断概率
if (rand() % 6 == 0) {
return 4;
}
else
{
return 2;
}
}
void mapFillNum() {
while (true)
{
int r = rand() % MAX_SIZE;
int c = rand() % MAX_SIZE;
if (map[r][c] == 0) {
map[r][c] = createNum();
break;
}
}
}
//=================随机产生一个整数2or4,产生2的概率要比4大==================
//=================================初始化数据============================================
void gameInit() {
srand(time(NULL));
for (int i = 0; i < 2;i++)
{
mapFillNum();
}
/*map[1][0] = 2;
map[0][0] = 2;
map[1][3] = 2;
map[1][2] = 2;*/
}
//=================================初始化数据============================================
//================绘制界面==========================================================
void gameDraw() {
//设置背景颜色
setbkcolor(RGB(187, 173, 160));
//设置颜色前要先清屏
cleardevice();
//绘制矩形
//rectangle(20, 20, 80, 80); //空心矩形
//solidrectangle(120, 120, 180, 180);//实心矩形可以填充颜色
for (int i = 0; i < MAX_SIZE; i++)
{
for (int k = 0; k < MAX_SIZE; k++) {
//找到对应格子的左上角坐标
int x = k * GRID_W + (k + 1) * INTERVAL;//这个对应的是列
int y = i * GRID_W + (i + 1) * INTERVAL;//对应行
//设置格子的填充颜色
int index = map[i][k] ? log2(map[i][k]) : 0;
COLORREF tcolor = colors[index];//arr[index];
setfillcolor(tcolor);
//绘制矩形
//solidrectangle(x, y, x+GRID_W, y+GRID_W);//实心矩形可以填充颜色
//填充圆角矩形
solidroundrect(x, y, x + GRID_W, y + GRID_W, 20, 20);
if (map[i][k] != 0) {
//======================把数组里面的数据绘制到图像窗口上=================================
//设置文字样式
settextstyle(50, 0, "黑体");
//设置文字背景透明
setbkmode(TRANSPARENT);
//设置文字颜色
settextcolor(RGB(119, 110, 101));
//1:把整数转成字符串
char str[10] = "";
sprintf_s(str, "%d", map[i][k]);
//将格子文字居中
//求字符串的高度跟宽度
int tw = textwidth(str);//水平
int th = textheight(str);//垂直
//求字符串距离格子上下左右的距离
int tx = (GRID_W - tw) / 2;
int ty = (GRID_W - th) / 2;
//1:outtextxy(20, 20, _T("hello"));
//2:改成多字符集
//outtextxy(20, 20, "hello");
outtextxy(x + tx, y + ty, str);
}
}
}
}
//================绘制界面====================
//===============================游戏移动================================
//上移动
void moveUp() {
bool isMoved = false;
for (int c = 0; c < MAX_SIZE; c++)
{
int temp = 0;
for (int begin = 1; begin < MAX_SIZE; begin++) {
if (map[begin][c] != 0) {
if (map[temp][c] == 0) {
map[temp][c] = map[begin][c];
map[begin][c] = 0;
isMoved = true;
}
else if (map[temp][c] == map[begin][c]) {
map[temp][c] *= 2;
map[begin][c] = 0;
temp++;
isMoved = true;
}
else {
map[temp + 1][c] = map[begin][c];
if (temp + 1 != begin) {
map[begin][c] = 0;
isMoved = true;
}
temp++;
}
}
}
}
if (isMoved)
{
mapFillNum();
}
}
//下移动
void moveDown() {
bool isMoved = false;
for (int c = 0; c < MAX_SIZE; c++)
{
int temp = MAX_SIZE - 1;
for (int begin = MAX_SIZE - 2; begin >= 0; begin--) {
if (map[begin][c] != 0) {
if (map[temp][c] == 0) {
map[temp][c] = map[begin][c];
map[begin][c] = 0;
isMoved = true;
}
else if (map[temp][c] == map[begin][c]) {
map[temp][c] *= 2;
map[begin][c] = 0;
temp--;
isMoved = true;
}
else {
map[temp - 1][c] = map[begin][c];
if (temp - 1 != begin) {
map[begin][c] = 0;
isMoved = true;
}
temp--;
}
}
}
}
if (isMoved)
{
mapFillNum();
}
}
//左移动
void moveLeft() {
bool isMoved = false;
for (int c = 0; c < MAX_SIZE; c++)
{
int temp = 0;
for (int begin = 1; begin < MAX_SIZE; begin++) {
if (map[c][begin] != 0) {
if (map[c][temp] == 0) {
map[c][temp] = map[c][begin];
map[c][begin] = 0;
isMoved = true;
}
else if (map[c][temp] == map[c][begin]) {
map[c][temp] *= 2;
map[c][begin] = 0;
temp++;
isMoved = true;
}
else {
map[c][temp + 1] = map[c][begin];
if (temp + 1 != begin) {
map[c][begin] = 0;
isMoved = true;
}
temp++;
}
}
}
}
if (isMoved)
{
mapFillNum();
}
}
//右移动
void moveRight() {
bool isMoved = false;
for (int c = 0; c < MAX_SIZE; c++)
{
int temp = MAX_SIZE-1;
for (int begin = MAX_SIZE-2; begin >=0; begin--) {
if (map[c][begin] != 0) {
if (map[c][temp] == 0) {
map[c][temp] = map[c][begin];
map[c][begin] = 0;
isMoved = true;
}
else if (map[c][temp] == map[c][begin]) {
map[c][temp] *= 2;
map[c][begin] = 0;
temp--;
isMoved = true;
}
else {
map[c][temp - 1] = map[c][begin];
if (temp - 1 != begin) {
map[c][begin] = 0;
isMoved = true;
}
temp--;
}
}
}
}
if (isMoved)
{
mapFillNum();
}
}
//获取键盘
void move() {
int key = _getch();
switch (key)
{
case 72:
moveUp();
break;
case 80:
moveDown();
break;
case 75:
moveLeft();
break;
case 77:
moveRight();
break;
}
//printf("%d\n", key);//224 72 224 80 224 75 224 77上下左右
}
//===============================游戏移动================================
int main() {
//图形窗口需要自己创建
initgraph(WIN_SIZE, WIN_SIZE, SHOWCONSOLE);//创建窗口
//不能让构建的图像退出程序,使用死循环
//========================调用界面函数===============
gameInit();//数据初始化函数
while (true)
{
gameDraw();//界面绘制函数
move();
}
createNum();//产生随机数函数
closegraph();//退出图形界面
return 0;
}