基于c语言的2048小游戏

本文介绍了使用C++和easyx图形库开发的一款基于随机数生成的二维格子游戏,包括地图初始化、随机数生成、游戏规则(移动和数值变化)、界面绘制以及键盘控制功能。
摘要由CSDN通过智能技术生成

效果图

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




}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值