2048项目开发小游戏(C++)
前言:2048小游戏是我们经常接触的益智小游戏,那么如何完成这个简单游戏的代码操作呢?
代码解析
头文件:
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#define MAX_SIZE 4 //每行格子四个(4*4)
#define GRID_WIDTH 100 //格子宽度100
#define INTERVAL 15 //格子间隔15
#define WIN_SIZE 475 //窗口宽度100×4+15×5
该2048小游戏为4×4框图,在头文件中提前定义格子宽度、格子间的间隔和窗口的总宽度。
视图
以下是我的代码运行视图: 颜色可以自定义
代码
定义视图颜色:
Ctrl + Alt + A 在屏幕上选中想要的颜色,在键盘中点击C键进行复制,然后粘贴在代码中。
把颜色和数据建立联系:
enum Color //枚举颜色 2的次方
{
//没有数字的地方是0
zero = RGB(209, 229, 239),
twoto1 = RGB(238, 228, 218),
twoto2 = RGB(238, 224, 200),
twoto3 = RGB(181, 127, 242),
twoto4 = RGB(208, 226, 236),
twoto5 = RGB(216, 166, 192),
twoto6 = RGB(29, 40, 51),
twoto7 = RGB(230, 27, 8),
twoto8 = RGB(239, 220, 168),
twoto9 = RGB(255, 214, 97),
twoto10 = RGB(177, 171, 171),
twoto11 = RGB(239, 241, 242),
bk = RGB(205, 189, 171),
};
//把颜色和数据建立联系
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
在4×4的框图中随机生成数字:
void CreateNumber()
{
while (1)
{
int x = rand() % MAX_SIZE;
int y = rand() % MAX_SIZE;
if (map[x][y] == 0)//如果该框没有数字,则可以随机生成2或4,否则不生成
{
map[x][y] = RandTwoFour();
break;
}
}
}
在空白框中自动生成2或4:
在定义是可以行改动2和4出现的概率,以下代码中4出现的概率为1/10,2出现的概率为9/10.
int RandTwoFour()//随机生成2或4
{
if (rand() % 10 == 0)//生成4的概率为1/10
{
return 4;
}
else//生成2的概率为9/10
{
return 2;
}
}
视图初始化:
void GameInit()
{
srand(GetTickCount());
for (int i = 0; i < MAX_SIZE; i++)
{
for (int j = 0; j < MAX_SIZE; j++)
{
map[i][j] = 0;
}
}
//初始化每个格子的坐标,左上角
int i, j;
for (i = 0; i < MAX_SIZE; i++)
{
for (j = 0; j < MAX_SIZE; j++)
{
pos[i][j].x = (j * GRID_WIDTH) + ((j + 1) * INTERVAL);
pos[i][j].y = (i * GRID_WIDTH) + ((i + 1) * INTERVAL);
}
}
//产生两个数据
CreateNumber();
CreateNumber();
}
视图定义:
void GameDrw()
{
setbkcolor(Color::bk);
cleardevice();
int i, j;
for ( i = 0; i < MAX_SIZE; i++)
{
for (j = 0; j < MAX_SIZE; j++)
{
for (int k = 0; k < 12; k++)
{
if (map[i][j] == num[k])
{
DWORD tempcolor = arr[k];
setfillcolor(tempcolor);
solidrectangle(pos[i][j].x, pos[i][j].y, pos[i][j].x + GRID_WIDTH, pos[i][j].y + GRID_WIDTH);
if (num[k] != 0)
{
char number[5] = "";
sprintf(number, "%d", num[k]);
setbkmode(TRANSPARENT);
settextcolor(RGB(119, 110, 101));
settextstyle(50, 0, "黑体");
int temp = textwidth(number);
temp = (GRID_WIDTH - temp)/2;
outtextxy(pos[i][j].x + temp, pos[i][j].y + 25, number);
}
}
}
}
}
}
移动:
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()
{
initgraph(WIN_SIZE,WIN_SIZE,SHOWCONSOLE);
GameInit();
while (1)
{
GameDrw();
KeyControl();
}
while (1);
return 0;
}