首先来看一下做出来的样子:

(浅玩了一下)

想必大家已经十分清楚2048的游戏规则,在此就不做过多的介绍了。总的来说制作的非常简单,初步实现了游戏主体&结束后再来一次的选择。

使用头文件以及定义的函数如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<conio.h>
#include<windows.h>
#include <graphics.h>
int end = 0;//标记得到2048结束
void random(int[4][4]);//生成随机数
void move(int[4][4], char);//移动
void add(int[4][4], char);//相加
bool canNotMove(int[4][4]);//判断是否无法移动
bool full(int[4][4]);//是否存满
void run();//运行
void draw(int n, int x, int y);//每块数字
void background();//背景

游戏是4*4大小的格子然后数字相加,char是接收wsad或上下左右键数值的。

1.画背景

initgraph()设置画布的大小,然后就可以设置背景颜色啦,注意一定要用cleardevice()清屏一下,否则原始的黑色背景替换不掉。

void background()
{initgraph(405, 405);setbkcolor(RGB(187, 175, 161));//设置背景颜色cleardevice();
}

2.画“数字”:

用你喜欢的颜色,算好每块的位置

void draw(int n, int x, int y)
{setbkmode(TRANSPARENT);//文字背景透明if (n == 0)//空格子{setfillcolor(RGB(205, 193, 175));setlinecolor(RGB(205, 193, 175));//设置边框颜色setlinestyle(PS_SOLID);//边框线条模式fillrectangle(x * 100 + 5, y * 100 + 5, x * 100 + 100, y * 100 + 100);}
//其余的2,4,8,16等都同上绘制
}

3.生成随机数:

随机数用到srand() 函数,由于rand 返回一个伪随机数,种子相同生成的数每次都会一样,所以使用time制造不同的初始种子(时间每时每刻都不一样)。随机数%4制造不同概率得到初始的2和4,最后找空位赋值。

void random(int arr[4][4])
{srand((unsigned int)time(NULL));int n;//赋值if (rand() % 4 == 0)//四分之一的可能是4,其余是2n = 4;elsen = 2;while (1)//找空位置赋值{int f = 0;int x = rand() % 4;//横坐标int y = rand() % 4;//纵坐标if (arr[x][y] == 0){arr[x][y] = n;draw(n, y, x);break;}if (full(arr))//满了不加数字{break;}}
}

4.判断是否所有位置都满了(都有数字)

        生成随机数和判断是否无法移动时都需要,遍历一下,简简单单。

bool full(int arr[4][4])
{for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (arr[i][j] == 0){return false;}}}return true;
}

5.判断是否无法移动

其实就是看看行列挨着的数是不是都不相同。

bool canNotMove(int arr[4][4])
{if (!full(arr))return false;for (int i = 0; i < 4; i++)//行{for (int j = 0; j < 3; j++)//列{if (arr[i][j] == arr[i][j + 1]){return false;}}}for (int i = 0; i < 4; i++)//列{for (int j = 0; j < 3; j++)//行{if (arr[j][i] == arr[j + 1][i]){return false;}}}return true;
}

6.移动数字

代码的主要部分来鸟,找到行(列)的第一个空位,然后把后面的数都移过去,一个贴一个,所以要记一下。

void move(int arr[4][4], char in)
{int c = 0;//要改变的坐标int fnull = 0;//标记第一个空位if (in == 'w' || in == 'W' || in == 72)//向上{for (int i = 0; i < 4; i++)//列{c = 0;fnull = 0;for (int j = 0; j < 4; j++)//行{if (arr[j][i] == 0 && fnull == 0){fnull = 1;c = j;continue;}if (arr[j][i] != 0){int t = arr[j][i];arr[j][i] = 0;draw(0, i, j);arr[c][i] = t;draw(t, i, c);c++;}}}}
//向下、左、右同上,只用小小行列改变
}

7.相加

第二个主要部分,由于我是一个贴一个相加,所以每次加一个就要移动一下,保证中间没有空位隔开。

void add(int arr[4][4], char in)
{if (in == 'w' || in == 'W' || in == 72){for (int i = 0; i < 4; i++)//向上加{for (int j = 0; j < 3; j++){if (arr[j][i] == arr[j + 1][i]){arr[j][i] *= 2;draw(arr[j][i], i, j);if (arr[j][i] == 2048)//判断是否胜利——得到2048end = 1;arr[j + 1][i] = 0;draw(arr[j + 1][i], i, j+1);move(arr, in);}}}}
//下左右相加同上
}

8.运行函数

        如果你看到这里,说明你马上就要成功了!创建上面所需要的那个数组,控制运行

void run()
{while (1){background();int arr[4][4];//一个框for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){arr[i][j] = 0;setfillcolor(RGB(205, 193, 175));setlinecolor(RGB(205, 193, 175));//设置边框颜色setlinestyle(PS_SOLID);//边框线条模式fillrectangle(i * 100 + 5, j * 100 + 5, i * 100 + 100, j * 100 + 100);}}random(arr);while (end == 0)//一次{random(arr);if (canNotMove(arr)){break;}char in = 0;Sleep(200);//防止乱按while (1){in = _getch();//输入if ((in != 72) && (in != 80) && (in != 75) && (in != 77) && (in != 'w') && (in != 's') && (in != 'a') && (in != 'd') && (in != 'W') && (in != 'S') && (in != 'A') && (in != 'D'))continue;elsebreak;}move(arr, in);add(arr, in);}if (end == 1)//通关{settextcolor(RED); settextstyle(0, 0, _T("黑体")); //文字宽度   文字高度,  自适应大小:0,0RECT rect = { 0,0,100,100 };drawtext(_T("通关"), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);}else{settextcolor(RED); settextstyle(0, 0, _T("黑体")); //文字宽度   文字高度,  自适应大小:0,0RECT rect = { 0,0,100,100 };drawtext(_T("失败"), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);}settextcolor(YELLOW); settextstyle(0, 0, _T("黑体")); //文字宽度   文字高度,  自适应大小:0,0RECT rect = { 50,50,300,300 };drawtext(_T("输入y再试一次,按n结束"), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);FLAG:char a = _getch();if (a == 'y' || a == 'Y'){continue;}if (a == 'n' || a == 'N'){closegraph(); //关闭窗口操作break;}elsegoto FLAG;}
}

9.主函数,简单美丽

int main()
{background();run();return 0;
}

成功了吗!我是真的很开心能做出来这个东西,还有很多可以改进的地方,我们来日方长。

使用Easyx图形库制作的2048游戏相关推荐

  1. 小球跳跃游戏——EasyX图形库应用——C++小游戏

    小球跳跃游戏 通过EasyX图形库制作小球跳跃游戏 目录: 1.EasyX图像库介绍及下载 2.创建C++项目(控制台应用) 3.具体代码 4.游戏规则 5.游戏效果 6.参考图书 1.EasyX图像 ...

  2. c语言使用easyX图形库制作打气球小游戏

    大一c语言使用easyX图形库制作打气球小游戏 如果你是入门easyX图形库,那么这个打气球小游戏将会是和不错的入门项目选择,easyX开创了可视化窗口,使用户更加直观的了解到对象的变化,总代码以及素 ...

  3. 如何用C的easyX图形库制作图形化界面菜单(财务管理系统)

    这是财务管理系统的一个图形化界面主菜单 : 下面这个是查询功能的一个子菜单: 一: 菜单的实现靠的是easyX,它是针对C++的一个图形库,编译器用的是Visual C.其实VC和easyX图形库就很 ...

  4. c语言基于easyX樱花特效,C++基于easyx图形库实现推箱子游戏

    本文实例为大家分享了C++实现推箱子游戏的具体代码,供大家参考,具体内容如下 头文件: #include #include //#include #include #include #include ...

  5. easyx图形库制作新年烟花(附图片资源)

    目录 先看效果: 代码: 先看效果: map 看吧是不是非常好看,哈哈,接下来就直接上代码! 这个是图形库的坐标图 代码: #include<stdio.h> #include<gr ...

  6. 运用Easyx图形库实现火柴人游戏左右跑动

    所谓游戏动画,就是不断绘制更新绘制更新的一个连续过程,与上次我开发的经典游戏<Flappy Bird>相似,所以我们的主函数为一个循环体.然后游戏代码分为 定义.初始化.更新数据.操作判定 ...

  7. 【EasyX图形库】c语言贪吃蛇-音乐-图片-界面比较美观

    前面的话: 首次写这个,如有不足,欢迎指正. 代码中的注释解释的很详细!所以说阅读起来应该问题不大,有帮助就最好啦!( ̄︶ ̄)↗ 2022/11/2更新: 贪吃蛇C++_2021: 大一作业,使用Ea ...

  8. C语言 easyx图形库相关常用函数介绍(非常详细)

    前言:easyx图形库是C++里面的一个图形库,其装有一些基本的绘图函数,可以通过这些绘图函数来创建一个窗口,从而绘制你想要的图像.这个非常适合初学者使用,能够帮助初学者快速上手图形库,同时我们还可以 ...

  9. 源码篇-2048小游戏(需要EasyX图形库)

    本项目需要EasyX图形库,若没有可在www.easyx.cn网上下载哦 ! 可以选择一个游戏音乐哦! mciSendString函数 Parameters lpszCommand 指向一个以空结束的 ...

最新文章

  1. Oracle控制文件的重建
  2. 判断非负整数是否是3的倍数_二、因数与倍数教案
  3. OpenCASCADE:网格之BRepMesh 架构
  4. 国产OS推广应从娃娃和体制内双管齐下
  5. java rpg对战_RpgGame.java
  6. 【Tensorflow】Tensor的比较运算
  7. Kubernetes Dashboard on Ubuntu 16.04安装记录
  8. Django中的form模块的高级处理
  9. 主成份(PCA)与奇异值分解(SVD)的通俗解释
  10. StarlingMVC:为Starling量身打造的MVC框架
  11. C 标准库—— assert.h
  12. mysql门派年龄最大的人_MySQL高级 第12章练习
  13. 对缓存的思考——提高命中率
  14. 软件推荐:论文翻译阅读 + 文献管理 + markdown笔记 + 多设备同步 + 一键导出bib参考文献
  15. Java 多线程 面试题
  16. 计算机视觉论文-2021-06-10
  17. Educational Codeforces Round 97 (Rated for Div. 2)
  18. 腾讯云4核8g10M轻量服务器支持多少人在线?
  19. linux内核去掉pty,请问如何升级内核?高手请进!!!
  20. 优盘里文件夹变成html,U盘里的文件全部变成了快捷方式,怎么破?

热门文章

  1. php 自带字符过滤,PHP字符串特殊符号的过滤方法
  2. halcon 角度转弧度方法
  3. MatplotlibSeaborn绘图整理(基于Titanic数据集)【未完待续】
  4. 宁德时代与VinFast达成全球战略合作;海南省第二家君悦品牌酒店开业 | 美通企业日报...
  5. 安全帽能配置AI?信息月如何掀起日常生活的全面革新
  6. Python中的多重继承
  7. Obsidian深度实践经验分享 | 写作实践
  8. 在M1芯片arm架构上的mac安装origin和materials studio
  9. AI模型风险评估 第1部分:动机
  10. 15kw充电桩模块设计,源代码,原理图