c/c++的2048开发笔记

编程入门 行业动态 更新时间:2024-10-27 20:26:10

c/c++的2048开发<a href=https://www.elefans.com/category/jswz/34/1770047.html style=笔记"/>

c/c++的2048开发笔记

c/c++的2048开发

  1. =search&seid=12949364378847014949&spm_id_from=333.337.0.0
  2. .html

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

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,下个位置数据置0else 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开发笔记

本文发布于:2024-03-08 21:04:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1722352.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:笔记

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!