概述
c/c++的2048开发
- https://www.bilibili.com/video/BV1R34y197g5?from=search&seid=12949364378847014949&spm_id_from=333.337.0.0
- https://www.cnblogs.com/pipu-qiao/p/6012697.html
1、Easyx库安装教程(必须的图形库)
https://blog.csdn.net/weixin_43919932/article/details/102996507
2、错误预警
- “settextstyle”:4个重载没有一个可以转换所有参数类型(项目-属性-高级-字符集改为多字节字符集)
- c4996:sprintf安全性报错(项目-属性-c+±常规-SDL-否)
3、互相学习,希望对大家有帮助
4、底层逻辑
- 将窗口上显示的数存放到一个二维数组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开发所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复