2048小游戏项目开发代码

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;
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值