C语言项目实战:《2048》零基础项目丨208 行源代码示例

Posted 一起学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言项目实战:《2048》零基础项目丨208 行源代码示例相关的知识,希望对你有一定的参考价值。

这篇文章主要为大家详细介绍了C语言实现——《2048项目》文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!

游戏介绍:

《2048》一款益智小游戏,游戏的规则十分简单,是一款简单易上手的数字小游戏。游戏的规则很简单,你需要控制所有方块向同一个方向运动,两个相同数字方块撞在一起之后合并成为他们的和,每次操作之后会随机生成一个2或者4,最终得到一个“2048”的方块就算胜利了!

玩法简单,容易上手!所以这也成为了我们编程学习者C语言练习的一个非常好的小项目,如果你没有玩过的话那么可以先去玩一下的,会玩的话对于项目逻辑的理解也是非常有帮助的!接下来就让我们一起来看看吧!

插件:图形库插件easyX,涉及图片素材可以自行百度找也可以关注文末领取;

效果图展示:

配套讲解教程:2048游戏教程——哔哩哔哩https://www.bilibili.com/video/BV1BC4y1H7jz?spm_id_from=333.999.0.0

源代码示例:

#include<stdio.h>
#include<time.h>
#include<math.h>
#include<conio.h>
#include<graphics.h>//需要安装之后,才有这个头文件
#define MAX_GRID 4		//每行格子数
#define GRID_WIDTH 100	//格子宽度
#define INTERVAL 15		//间隔
#define WIN_SIZE (5*INTERVAL+MAX_GRID*GRID_WIDTH)//窗口大小
enum Color //枚举格子颜色

	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的颜色
	back = RGB(187, 173, 160), //背景颜色
;
Color arr[13] =  zero, twoTo1, twoTo2, twoTo3, twoTo4, twoTo5, twoTo6, twoTo7, twoTo8, twoTo9, twoTo10, twoTo11, back ;
//数据 二维数组
int map[MAX_GRID][MAX_GRID];
int createNum()

	int num = 0;
	if (rand() % 10 == 0)
	
		num = 4;
	
	else
	
		num = 2;
	
	return num;

void gameInit()

	srand((unsigned)time(NULL));
	//随机在空白的位置产生两个整数
	for (int i = 0; i < 5; )
	
		//随机数 rand() 随机获得一个整数   0~上万
		int r = rand() % MAX_GRID; //0~3
		int c = rand() % MAX_GRID; //0~3
		if (map[r][c] == 0)
		
			map[r][c] = createNum();
			i++;
				
	


void gameDraw()

	//绘制界面,设置背景颜色 187,173,160 三原色 set background color
	setbkcolor(RGB(187, 173, 160));
	//设置颜色之后需要,清屏(原本的颜色是黑色的,设置的颜色,被覆盖了)
	cleardevice();//清楚绘图设备

	for (int i = 0; i < MAX_GRID; i++)//->y
	
		for (int k = 0; k < MAX_GRID; k++)//->x
		
			//00 01 02 03 
			//10 11 12 13
			//求出每一个格子的x,y
			int x = k*GRID_WIDTH + INTERVAL*(k + 1);
			int y = i*GRID_WIDTH + INTERVAL*(i + 1);
			//4->2
			//32->5
			//2^n=map[i][k];  ->log2map[i][k]=n;
			int index = (int)log2((float)map[i][k]);
			setfillcolor(arr[index]);
			//画矩形:空心矩形,填充矩形,实心矩形,圆角矩形
			//solidrectangle(x, y, x + GRID_WIDTH, y + GRID_WIDTH);
			solidroundrect(x, y, x + GRID_WIDTH, y + GRID_WIDTH, 15, 15);

			if (map[i][k] != 0)
			
				//绘制数字
				//printf("%d", map[i][k]);//输出到控制台窗口
				//设置文字大小
				settextstyle(50, 0, "黑体");
				settextcolor(RGB(163, 73, 164));
				setbkmode(TRANSPARENT);//设置文字背景为透明
				//把数字转成字符串 格式化字符串
				char str[10] = "";
				sprintf(str, "%d", map[i][k]);
				//为了文字居中在格子中间
				int textx = textwidth(str) / 2;
				int texty = textheight(str) / 2;
				int win = GRID_WIDTH / 2;		//格子宽度一半
				outtextxy(x + win - textx, y + win - texty, str);
			
		
	

void moveup()

	for (int i = 0; i < MAX_GRID; i++)
	
		int temp = 0;
		for (int begin = 1; begin < MAX_GRID; begin++)
		
			if (map[begin][0] != 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_GRID; i++)
	
		int temp = MAX_GRID-1;
		for (int begin = MAX_GRID-2; begin >=0; begin--)
		
			if (map[begin][0] != 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--;
				
			
		
	

//获取键盘按键 _getch(),它不需要按回车确认输入
void keyControl()

	switch (_getch())
	
	case 'w':
	case 'W':
	case 72:
		moveup();
		break;
	case 's':
	case 'S':
	case 80:
		moveDown();
		break;
	case 'a':
	case 'A':
	case 75:
		break;
	case 'd':
	case 'D':
	case 77:
		break;
	
	printf("key\\n");

int main()

	//不要控制台窗口,我要图形窗口 easyx
	initgraph(WIN_SIZE,WIN_SIZE,SHOWCONSOLE);//第一个参数是宽度,二个高度
	gameInit();

	while (1)
	
		gameDraw();
		keyControl();
	
	return 0;

未完成的数字部分代码,大家也可以自己先去想想试试,每一次的思考就是你进步的过程!

如果学习的过程中有什么问题,以及本项目有什么不懂的地方,都可以来找我交流,我来帮你!

那么今天的分享就到这里了,后续会更新更多精彩项目或者知识内容的,大家要好好学C语言C++哟~

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

C语言C++编程学习交流圈子,QQ群:829164294点击进入】微信公众号:C语言编程学习基地

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习视频分享:

 

 

以上是关于C语言项目实战:《2048》零基础项目丨208 行源代码示例的主要内容,如果未能解决你的问题,请参考以下文章

C语言项目实战:《打字母游戏》零基础项目丨183 行源代码示例

C语言项目实战:《连连看》基础项目丨460 行源码注释

C语言项目实战:《扫雷游戏》零基础项目,230 行源码注释示例

C语言项目实战:《推箱子》零基础项目,270 行源码注释示例

C语言项目实战:《黄金矿工》零基础项目,180 行源代码示例

C语言项目实战:《飞翔的小鸟》零基础项目,190行源代码示例