我是靠谱客的博主 拉长龙猫,最近开发中收集的这篇文章主要介绍c/c++的2048开发笔记c/c++的2048开发,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

c/c++的2048开发

  1. https://www.bilibili.com/video/BV1R34y197g5?from=search&seid=12949364378847014949&spm_id_from=333.337.0.0
  2. https://www.cnblogs.com/pipu-qiao/p/6012697.html

1、Easyx库安装教程(必须的图形库)

https://blog.csdn.net/weixin_43919932/article/details/102996507

2、错误预警

  1. “settextstyle”:4个重载没有一个可以转换所有参数类型(项目-属性-高级-字符集改为多字节字符集)
  2. c4996:sprintf安全性报错(项目-属性-c+±常规-SDL-否)

3、互相学习,希望对大家有帮助

4、底层逻辑

  1. 将窗口上显示的数存放到一个二维数组map[GRID_NUM][GRID_NUM];
//遍历数组从数组的的当前位置的下一个开始遍历,找不是0的位置()
// 如果没找到什么也不做
// 如果找到
//如果当前位置是0,那么像当前位置与下一个进行互换(当前位置获得下一个位置的数据,并且将下一个位置数据置为0,将下标减一)
//如果当前位置和下一个位置相等,将当前位置数据*2,下个位置数据置0
//其他的三个方向在开始的时候记住是怎样获得以为数组的,等操作完才放回去这样就能实现了
//移动一次就随机生成

5、代码详解

1、宏定义与头文件与全局变量

#include<stdio.h>
#include<easyx.h>
#include<math.h>
#include<time.h>
#include<conio.h>
#define INTERVAL 15 //表示图形显示的间隔
#define GRID_WIDTH 100 //窗口大小
#define GRID_NUM 4  //n*n的2048游戏
int map[GRID_NUM][GRID_NUM] ;//数据数组
int mapNew[GRID_NUM][GRID_NUM];//临时数组
int map0[GRID_NUM];//拆分出的一位数组
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 colors[13] = {zero,twoTo1,twoTo2,twoTo3,twoTo4,twoTo5,twoTo6,twoTo7,twoTo8,twoTo9,twoTo10,twoTo11,back };

1、图形显示函数

void draw()
{
   //两个循环内的内容代表每一个格子的行为
   for (int r = 0; r < GRID_NUM; r++)
   {
   	for (int c = 0; c < GRID_NUM; c++)
   	{
   		int x = GRID_WIDTH * c + (c + 1)*INTERVAL;
   		int y = GRID_WIDTH *r+ (r + 1)*INTERVAL;
   		//画之前可以填充色
   		int index =log2( map[r][c]);
   		setfillcolor(colors[index]);
   		solidroundrect(x, y, x + GRID_WIDTH, y + GRID_WIDTH,10,10);
   		if (map[r][c] != 0)//不为0的才画进来
   		{
   			//在格子上显示数据,显示前设置
   			settextstyle(50,0,"楷体");
   			settextcolor(RGB(119,110,101));
   			char str[5] = {0};
   			//写入字符串,要的数字
   			sprintf(str,"%d",map[r][c]);
               //数字的位置调整
   			int horspace = (GRID_WIDTH - textwidth(str)) / 2;
   			int vecspace = (GRID_WIDTH - textheight(str)) / 2;
   			outtextxy(x+ horspace,y+ vecspace, str);
   		}
   	}
   }
}

2、主函数内容

int main()
{
	//创建窗口
	initgraph(GRID_NUM*GRID_WIDTH+(1+ GRID_NUM)*INTERVAL, GRID_NUM*GRID_WIDTH + (1 + GRID_NUM)*INTERVAL,EW_SHOWCONSOLE);
	setbkcolor(RGB(187,173,160));
	cleardevice();
	//调用draw之前先设背景模式为透明
	setbkmode(TRANSPARENT);
	//设置随机数种子,为了随机生成原始数据
	srand(time(NULL));
    //初始化游戏
	init();
	while (true)
	{
        //显示
		draw();
        //键盘输入
		keyEvent();
	}
	getchar();
	return 0;
}

3、初始化游戏,会生成2或者4,2的概率高

//生成2或者4
int rand2or4()
{
	if (rand() % 10 <=2)//概率可改
	{
		return 4;
	}
	return 2;
}
void creatnumber()
{
	//不能有0,不能重叠
	while (true)
	{
		int r = rand() % GRID_NUM;
		int c = rand() % GRID_NUM;
		//避免覆盖已有数据
		if (map[r][c] == 0)
		{
			map[r][c] = rand2or4();
			break;
		}
	}
}
//开始就给两个数字,2或者4
void init()
{
	creatnumber();
	creatnumber();
}

4、键盘操作

void keyEvent()
{
    //获得键盘
	int key = _getch();  //上w 下s 左a 右d
    //每次移动都会新建一个
    //键盘操作不同调用不同函数
	switch (key)
	{
	case 119:
		moveUp();
		creatnumber();
		break;
	case 115:
		moveDown();
		creatnumber();
		break;
	case 97:
		moveLeft();
		creatnumber();
		break;
	case 100:
		moveRight();
		creatnumber();
		break;
	}
}

5、逻辑核心代码

//向上为例
//传入一个一位数组
int* getDate(int arr[])
{
	//遍历数组从数组的的当前位置的下一个开始遍历,找不是0的位置()
	int i, nextI, len, m;
	len = GRID_NUM;//获得数组长度
	for (i = 0;i < len;i++)
	{
		nextI = -1;
		//找到第一个不为0的数
		for (m = i + 1; m < len; m++)
		{
			//是零就下一个
			if (arr[m] != 0)
			{
				nextI = m;
				break;
			}
		}
		//能找到
		if (nextI !=  -1) 
		{
			//存在下个不为0的位置
			if (arr[i] ==0) {
				arr[i] = arr[nextI];
				arr[nextI] = 0;
				i -= 1;
			}
			//如果当前位置和下一个位置相等,将当前位置数据*2,下个位置数据置0
			else if (arr[i] ==arr[nextI]) 
			{
				arr[i] = arr[i] * 2;
				arr[nextI] = 0;
			}
		}
	}
	return arr;
}
//即把二维数组分为一维的,然后
void moveUp()
{
	//分成n个数组
	//按列拿到数组
	for (int j = 0; j < GRID_NUM; j++)
	{
		for (int i = 0; i < GRID_NUM; i++)
		{
			map0[i] = map[i][j];
		}
        //进行处理,核心代码看上方,思路看到第上方底层逻辑
		int* mapTemp = getDate(map0);
        //放到临时数组中
		for (int i = 0; i < GRID_NUM; i++)
		{
			mapNew[i][j] = mapTemp[i];
		}
	}
	//刷新map数组
	for (int j = 0; j < GRID_NUM; j++)
	{
		for (int i = 0; i < GRID_NUM; i++)
		{
			map[i][j] = mapNew[i][j];
		}
	}
}

6、其他代码

//向下同向上,只需改两处[i]为[GRID_NUM-i-1]
void moveDown()
{
	//分成n个数组
//按列拿到数组
	for (int j = 0; j < GRID_NUM; j++)
	{
		for (int i = 0; i < GRID_NUM; i++)
		{
			//读的时候从后往前
			map0[GRID_NUM-i-1] = map[i][j];
		}
		int* mapTemp = getDate(map0);
		for (int i = 0; i < GRID_NUM; i++)
		{
			//写的时候也是从后往前
			mapNew[i][j] = mapTemp[GRID_NUM - i - 1];
		}
	}
	//赋值操作
	for (int j = 0; j < GRID_NUM; j++)
	{
		for (int i = 0; i < GRID_NUM; i++)
		{
			map[i][j] = mapNew[i][j];
		}
	}
}
//左则只需将上的[i][j]对调
void moveLeft()
{
	//分成n个数组
//按列拿到数组
	for (int j = 0; j < GRID_NUM; j++)
	{
		for (int i = 0; i < GRID_NUM; i++)
		{
			map0[i] = map[j][i];
		}
		int* mapTemp = getDate(map0);
		for (int i = 0; i < GRID_NUM; i++)
		{
			mapNew[j][i] = mapTemp[i];
		}
	}
	//赋值操作
	for (int j = 0; j < GRID_NUM; j++)
	{
		for (int i = 0; i < GRID_NUM; i++)
		{
			map[i][j] = mapNew[i][j];
		}
	}
}
//向右同向左,只需改两处[i]为[GRID_NUM-i-1],同理上方
void moveRight()
{
	//分成n个数组
//按列拿到数组
	for (int j = 0; j < GRID_NUM; j++)
	{
		for (int i = 0; i < GRID_NUM; i++)
		{
			map0[GRID_NUM - i - 1] = map[j][i];
		}

		int* mapTemp = getDate(map0);

		for (int i = 0; i < GRID_NUM; i++)
		{
			mapNew[j][i] = mapTemp[GRID_NUM - i - 1];
		}
	}
	//赋值操作
	for (int j = 0; j < GRID_NUM; j++)
	{
		for (int i = 0; i < GRID_NUM; i++)
		{
			map[i][j] = mapNew[i][j];
		}
	}
}

最后

以上就是拉长龙猫为你收集整理的c/c++的2048开发笔记c/c++的2048开发的全部内容,希望文章能够帮你解决c/c++的2048开发笔记c/c++的2048开发所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部