DEV-C++ ege.h库 绘图教程——综合实践(一)

一、First of ALL

学习完了EGE库的所有函数后,今天我们就来综合实践一下。

今天我们将写一个数字华容道来简单练一练手。

准备好了吗,让我们开始。

DEV-C++ ege.h库 绘图教程合集

二、材料准备

1.音乐

我们可以为我们的游戏增加音乐,这里我找了一首MP3来做背景音乐。

2.按键侦测

虽然ege库内有自带的按键侦测函数,但我还是习惯使用windows.h库里的按键侦测函数。

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000)? 1 : 0)

 例如,KEY_DOWN(VK_RETURN)会侦测在这一时刻,你是否按下了回车键。

三、代码实现

1.main函数

那么首先,我们得让画面看起来是这样的

首先就是initgraph和setbkcolor,这一部分很简单,不用多说。

	initgraph(640, 480);setcaption(L"数字华容道");         //设置标题setbkcolor(WHITE);                //背景颜色MUSIC mus;                        //音乐初始化mus.OpenFile(L"Piano.mp3");       //打开音乐mus.Play();                       //播放音乐

 然后就是初始化地图,绘制窗口。里面有些函数我们等一下会讲。

	init_map();                        //这些函数等一下会讲draw_map();draw_number();setfont(20, 10, L"Lucida Console");//字体outtext(L"按N静音");               //提示信息outtextxy(0, 20, L"按M重置");outtextxy(0, 40, L"按B退出");

然后就开始游戏循环了。

	for (;;) {move_map();                       //移动数字后draw_number();                    //重新绘制地图(数字)if (KEY_DOWN('N')) {if (mus_state == 0) {mus_state = 1;            //muw_state:记录音乐在播放还是停止mus.Pause();              //如果在播放时按下N,停止。} else {mus_state = 0;            //下同mus.Play();}}if (KEY_DOWN('M')) {              //M代表重开,再更新一遍地图init_map();draw_map();draw_number();}if (KEY_DOWN('B')) {              //B则是结束return 0;}if (is_win()) {                   //如果胜利了就退出break;}if (mus.GetLength() == mus.GetPosition()) {mus.Close();mus.OpenFile(L"Piano.mp3");mus.Play();}                                 //如果音乐播完了再播一次Sleep(100);                       //延迟}

最后如果胜利了,输出提示信息,结束。

	win();closegraph();return 0;

main函数:

int main() {initgraph(640, 480);setcaption(L"数字华容道");setbkcolor(WHITE);MUSIC mus;mus.OpenFile(L"Piano.mp3");mus.Play();init_map();draw_map();draw_number();setfont(20, 10, L"Lucida Console");outtext(L"按N静音");outtextxy(0, 20, L"按M重置");outtextxy(0, 40, L"按B退出");for (;;) {move_map();draw_number();if (KEY_DOWN('N')) {if (mus_state == 0) {mus_state = 1;mus.Pause();} else {mus_state = 0;mus.Play();}}if (KEY_DOWN('M')) {init_map();draw_map();draw_number();}if (KEY_DOWN('B')) {return 0;}if (is_win()) {break;}if (mus.GetLength() == mus.GetPosition()) {mus.Close();mus.OpenFile(L"Piano.mp3");mus.Play();}Sleep(100);}win();closegraph();return 0;
}

2.position结构体

这个结构体将记录每个数字的位置。

typedef struct {int x;int y;
} position;												//不是坐标轴的x,y,而是行和列

3.initmap函数

这个函数将初始化地图(也就是3×3的矩阵),具体操作见下。

void init_map() {bool b[9] = {0};            //记录每个数字是否已被选中过randomize();                //初始化随机数for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {do {                MAP[i][j] = random(9);            //取随机数} while (b[MAP[i][j]] != 0);          //如果这个数已经在矩阵里就再取一遍b[MAP[i][j]] = 1;                     //标记这个数取过了}                                         //这样就保证里面的数是012345678而不会有//两个2这样的事情发生。}if (is_win()) init_map();                     //如果出来的矩阵已经是排列好的,就再init一遍
}

4.draw_map函数

init完之后就应该绘制框框来填数字了。

void draw_map() {int x[9] = {200, 280, 360, 200, 280, 360, 200, 280, 360};//记录每个框框的xint y[9] = {120, 120, 120, 200, 200, 200, 280, 280, 280};//记录每个框框的ysetcolor(BLACK);        //设置颜色for (int i = 0; i < 9; i++) {rectangle(x[i], y[i], x[i] + 80, y[i] + 80);    //绘制框框,长宽各为80}
}

这样,我们就得到了3×3的一个矩形了。

5.draw_number函数

绘制好框框后,就该往里面填数字了。

void draw_number() {int x[9] = {200, 280, 360, 200, 280, 360, 200, 280, 360};//数字的x坐标int y[9] = {120, 120, 120, 200, 200, 200, 280, 280, 280};//数字的y坐标setfont(70, 35, L"Lucida Console");//字体for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (MAP[i][j] != 0) print_score(MAP[i][j], x[i * 3 + j] + 2, y[i * 3 + j] + 2);  //如果不是0就在框框内写入数字。else outtextxy(x[i * 3 + j] + 2, y[i * 3 + j] + 2, L" ");//如果是0就代表这里是空白}}
}

6.move_map函数

这个函数就是我们操作的核心了。

void move_map() {position p;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (MAP[i][j] == 0) {        //记录哪个地方是空白的p.x = i;p.y = j;}}}if (KEY_DOWN(VK_RIGHT)) {                //如果按下右键就让空白处左边的数移到空白处if (p.y != 0) {                      //而且空白处左边必须有数(y坐标不为0)swap(MAP[p.x][p.y], MAP[p.x][p.y - 1]);//移动(交换)}}if (KEY_DOWN(VK_LEFT)) {if (p.y != 2) {                      //下同swap(MAP[p.x][p.y], MAP[p.x][p.y + 1]);}}if (KEY_DOWN(VK_DOWN)) {if (p.x != 0) {swap(MAP[p.x][p.y], MAP[p.x - 1][p.y]);}}if (KEY_DOWN(VK_UP)) {if (p.x != 2) {swap(MAP[p.x][p.y], MAP[p.x + 1][p.y]);}}
}

7.is_win函数

判断是否已经胜利。 

bool is_win() {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (MAP[i][j] != i * 3 + j + 1 && MAP[i][j] != 0) return 0;//如果这个数字不在它该在的位置上的话返回0}}return 1;
}

8.win函数

当判断胜利后,我们要输出生胜利信息.

void win() {cleardevice();setfont(80, 40, L"Lucida Console");outtextxy(200, 200, L"WIN!!!");Sleep(1000);getch();
}

这个就没什么好说的了。

9.int_to_string函数

将int转换为string,也没什么好说的。

string DX(string s) {string res = "";for (int i = s.size() - 1; i >= 0; i--)res += s[i];return res;
}string int_to_string(int i) {string res = "";while (i % 10 != i) {res += i % 10 + '0';i /= 10;}res += i + '0';return DX(res);
}

10.print_score函数

前面的int_to_string就用在这里了,输出数字。

void print_score(int score, int x = 0, int y = 0) {    //x,y:坐标string s = int_to_string(score);                   //将score转为string型for (int i = 0; i < s.size(); i++) {switch (s[i]) {                                //输出第i位case '0':outtextxy(x + 10 * i, y, L"0");break;case '1':outtextxy(x + 10 * i, y, L"1");break;case '2':outtextxy(x + 10 * i, y, L"2");break;case '3':outtextxy(x + 10 * i, y, L"3");break;case '4':outtextxy(x + 10 * i, y, L"4");break;case '5':outtextxy(x + 10 * i, y, L"5");break;case '6':outtextxy(x + 10 * i, y, L"6");break;case '7':outtextxy(x + 10 * i, y, L"7");break;case '8':outtextxy(x + 10 * i, y, L"8");break;case '9':outtextxy(x + 10 * i, y, L"9");break;default:outtextxy(x + 10 * i, y, L"Error");        //如果不是0123456789中的一个就报错break;}}
}

这个函数是在draw_number里用到的,用来输出数字。

四、结束

那么现在我们的数字华容道就写完了,下面是代码:

#include<graphics.h>
#include<bits/stdc++.h>#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000)? 1 : 0)using namespace std;int MAP[3][3];
bool mus_state = 0;typedef struct {int x;int y;
} position;												//不是坐标轴的x,y,而是行和列string DX(string s) {string res = "";for (int i = s.size() - 1; i >= 0; i--)res += s[i];return res;
}string int_to_string(int i) {string res = "";while (i % 10 != i) {res += i % 10 + '0';i /= 10;}res += i + '0';return DX(res);
}void print_score(int score, int x = 0, int y = 0) {string s = int_to_string(score);for (int i = 0; i < s.size(); i++) {switch (s[i]) {case '0':outtextxy(x + 10 * i, y, L"0");break;case '1':outtextxy(x + 10 * i, y, L"1");break;case '2':outtextxy(x + 10 * i, y, L"2");break;case '3':outtextxy(x + 10 * i, y, L"3");break;case '4':outtextxy(x + 10 * i, y, L"4");break;case '5':outtextxy(x + 10 * i, y, L"5");break;case '6':outtextxy(x + 10 * i, y, L"6");break;case '7':outtextxy(x + 10 * i, y, L"7");break;case '8':outtextxy(x + 10 * i, y, L"8");break;case '9':outtextxy(x + 10 * i, y, L"9");break;default:outtextxy(x + 10 * i, y, L"Error");break;}}
}bool is_win();void init_map() {bool b[9] = {0};randomize();for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {do {MAP[i][j] = random(9);} while (b[MAP[i][j]] != 0);b[MAP[i][j]] = 1;}}if (is_win()) init_map();
}void draw_map() {int x[9] = {200, 280, 360, 200, 280, 360, 200, 280, 360};int y[9] = {120, 120, 120, 200, 200, 200, 280, 280, 280};setcolor(BLACK);for (int i = 0; i < 9; i++) {rectangle(x[i], y[i], x[i] + 80, y[i] + 80);}
}void draw_number() {int x[9] = {200, 280, 360, 200, 280, 360, 200, 280, 360};int y[9] = {120, 120, 120, 200, 200, 200, 280, 280, 280};setfont(70, 35, L"Lucida Console");for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (MAP[i][j] != 0) print_score(MAP[i][j], x[i * 3 + j] + 2, y[i * 3 + j] + 2);else outtextxy(x[i * 3 + j] + 2, y[i * 3 + j] + 2, L" ");}}
}void move_map() {position p;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (MAP[i][j] == 0) {p.x = i;p.y = j;}}}if (KEY_DOWN(VK_RIGHT)) {if (p.y != 0) {swap(MAP[p.x][p.y], MAP[p.x][p.y - 1]);}}if (KEY_DOWN(VK_LEFT)) {if (p.y != 2) {swap(MAP[p.x][p.y], MAP[p.x][p.y + 1]);}}if (KEY_DOWN(VK_DOWN)) {if (p.x != 0) {swap(MAP[p.x][p.y], MAP[p.x - 1][p.y]);}}if (KEY_DOWN(VK_UP)) {if (p.x != 2) {swap(MAP[p.x][p.y], MAP[p.x + 1][p.y]);}}
}bool is_win() {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (MAP[i][j] != i * 3 + j + 1 && MAP[i][j] != 0) return 0;}}return 1;
}void win() {cleardevice();setfont(80, 40, L"Lucida Console");outtextxy(200, 200, L"WIN!!!");Sleep(1000);getch();
}int main() {initgraph(640, 480);setcaption(L"数字华容道");setbkcolor(WHITE);MUSIC mus;mus.OpenFile(L"Piano.mp3");mus.Play();init_map();draw_map();draw_number();setfont(20, 10, L"Lucida Console");outtext(L"按N静音");outtextxy(0, 20, L"按M重置");outtextxy(0, 40, L"按B退出");for (;;) {move_map();draw_number();if (KEY_DOWN('N')) {if (mus_state == 0) {mus_state = 1;mus.Pause();} else {mus_state = 0;mus.Play();}}if (KEY_DOWN('M')) {init_map();draw_map();draw_number();}if (KEY_DOWN('B')) {return 0;}if (is_win()) {break;}if (mus.GetLength() == mus.GetPosition()) {mus.Close();mus.OpenFile(L"Piano.mp3");mus.Play();}Sleep(100);}win();closegraph();return 0;
}

五、程序下载

今天写的游戏和音乐我都会放到这里,需要的可以下载。

六、Conclusion

今天我们用ege库写出了我们的第一个游戏,下期,我们将会用ege库写出更好的游戏。

敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/667023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断和循环 - switch语句和练习

switch语句格式 switch(表达式) {case 值1:语句体1;break;case 值2:语句体2;break;...default:语句体n1;break; }执行流程&#xff1a; 首先计算表达式的值。依次和case后面的值进行比较&#xff0c;如果有对应的值&#xff0c;就会执行相应的语句&#xff0c;在执行的过程中…

WordPress每天发布60s插件

源码名称:WordPress每天发布60s插件 适用平台:WordPress Wordpress还是比较适合个人博客网站&#xff0c;这个60秒插件适合一些喜欢自动发新闻早报晚报人员 喜欢的赶紧下手。找 万能工具箱合集 小程序即可找到资源

【UE Niagara】环绕在人物周围的闪电效果

效果 步骤 1. 首先下载一个螺旋形状的静态网格体并导入UE&#xff08;地址&#xff1a;https://pan.baidu.com/s/1l9Bn5lQd7tDBu3CMs4c2aA?pwd7myr &#xff09; 2. 创建一个Niagara系统 使用Empty模板 这里命名为“NS_LightingAround” 打开“NS_LightingAround”&#xff0…

大礼包 - 华为机试真题题解

考试平台&#xff1a; 时习知 分值&#xff1a; 200分&#xff08;第二题&#xff09; 考试时间&#xff1a; 2024-01-31 &#xff08;两小时&#xff09; 题目描述 某公司针对新用户推出大礼包&#xff0c;从任意一天注册开始&#xff0c;连续登陆 x 天&#xff0c;每天可以领…

AES算法:数据传输的安全保障

在当今数字化时代&#xff0c;数据安全成为了一个非常重要的问题。随着互联网的普及和信息技术的发展&#xff0c;我们需要一种可靠的加密算法来保护我们的敏感数据。Advanced Encryption Standard&#xff08;AES&#xff09;算法应运而生。本文将介绍AES算法的优缺点、解决了…

Unity引擎学习笔记之【动画剪辑和曲线操作】

动画剪辑和曲线Animation Clip 点选一个包含动画的FBX模型&#xff0c;在其检查器中便可查看动画剪辑 一、动画剪辑 1.Model 2.RIg 538.jpg%20%3D600x&pos_idimg-st6QJc3x-1707050419493) 无动画、旧版Animation动画、普通道具或角色动画、人形角色动画 3.Animation 二…

【动态规划】【树形dp】【C++算法】968监控二叉树

作者推荐 【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数 本文涉及知识点 动态规划汇总 LeetCode:968监控二叉树 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所…

卷死同行!!CSDN博客中所有专栏支持24h无条件退款了。

现在找工作很卷、学习也很卷、做知识付费卖文章卖课也很卷。卷主要提现在内容质量上、内容数量上、售前咨询上(咱有专属客服)、售后服务上… 在CSDN既定的平台下&#xff0c;不能打折、不能设置优惠券、不能改价格、也没有退款按钮的情况下&#xff0c;如何去卷呢&#xff1f;…

[ChatGPT们】ChatGPT 如何辅助编程初探

主页&#xff1a;元存储的博客 全文 9000 字&#xff0c; 原创请勿转载。 我没有写过诗&#xff0c;但有人说我的代码像诗一样优雅 -- 雷军 图片来源&#xff1a;https://www.bilibili.com/video/BV1zL411X7oS/ 1. 引言 作为一个程序员&#xff0c;我们不仅要熟悉各种编程语…

智能决策的艺术:探索商业分析的最佳工具和方法

文章目录 一、引言二、商业分析思维概述三、数据分析在商业实践中的应用四、如何培养商业分析思维与实践能力五、结论《商业分析思维与实践&#xff1a;用数据分析解决商业问题》亮点内容简介作者简介目录获取方式 一、引言 随着大数据时代的来临&#xff0c;商业分析思维与实…

新年心愿清单怎么写 用这个软件列心愿清单更方便

新年的钟声在耳畔回荡&#xff0c;我站在窗前&#xff0c;看着外面熙熙攘攘的人群&#xff0c;心中充满了期待。新的一年&#xff0c;新的开始&#xff0c;我有很多心愿想要实现。于是&#xff0c;我决定写下一份心愿清单&#xff0c;给来年定下奋斗的方向。 但是&#xff0c;…

LLM应用开发与落地:使用gradio十分钟搭建聊天UI

一、背景 如果你是做LLM应用开发的&#xff0c;特别是做后端开发&#xff0c;你一定会遇到怎么快速写一个聊天UI界面来调试prompt或agent的问题。这时候的你可能在苦恼中&#xff0c;毕竟react.js, next.js, css, html也不是每个人都那么熟练&#xff0c;对吧&#xff1f;即使…

CSP-202309-2-坐标变换(其二)

一、遇到问题&#xff1a;迭代计算时间超限 按照常规思路&#xff0c;可以从begin到end逐步计算&#xff0c;共需要约end-begin次运算&#xff0c;时间复杂度较高&#xff0c;导致时间超限。 二、解决思路&#xff1a;累积 1.操作数累积部分 在输入阶段&#xff0c;代码通过…

springboot基于javaWEB的旅游推荐系统设计与实现+vue

随着人民生活水平的提高&#xff0c;对于旅游的需求越来越强烈。目前传统旅游的模式已经无法满足当前消费者的旅游需求。通过分析传统旅游的缺点&#xff0c;我们可以明确传统旅游业无法满足日益多元化的消费者。在消费者追求更加个性化的旅游体验之下&#xff0c;旅游网站就能…

布隆过滤器有什么用?什么原理?如何使用?

1 前言 布隆过滤器相信大家没用过的话&#xff0c;也已经听过了。 布隆过滤器主要是为了解决海量数据的存在性问题。对于海量数据中判定某个数据是否存在且容忍轻微误差这一场景&#xff08;比如缓存穿透、海量数据去重&#xff09;来说&#xff0c;非常适合。 2 什么是布隆…

AI大模型专题:OWASP大语言模型应用程序十大风险V1.0

今天分享的是AI大模型系列深度研究报告&#xff1a;《AI大模型专题&#xff1a;OWASP大语言模型应用程序十大风险V1.0》。 &#xff08;报告出品方&#xff1a;OWASP&#xff09; 报告共计&#xff1a;14页 LM01:2023_ 提示词注入 描述&#xff1a;提示词注入包括绕过过滤器…

云打印机怎么连接手机?

现在越来越多的人使用手机来办公或学习。而当我们需要打印文件时,如何用云打印机连接手机就非常重要了。易绘创云打印服务非常实用&#xff0c;那么易绘创云打印机又该怎么连接手机&#xff1f;下面就让我们一起来了解吧。 云打印机怎么连接手机&#xff1f; 当下云打印机连接…

SolidWorks 2023 使用操作流程

1. 把头 1.1. 新建零件 1.2. 新建草图 1.3. 拉升凸台 1.4. 等距实体 切换到锤头&#xff0c;新建草图&#xff0c;等距实体1mm 1.5. 拉升凸台 将上一个步骤的草图&#xff0c;进行特征拉升 1.6. 镜像处理 1.7. 圆角处理 1.8. 绘制凹槽 在锤子的侧面绘制草图 1.9. 挖出把手孔…

Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践(二)

在上一篇文章中&#xff0c;我们成功验证了Intel Threading Building Blocks (TBB) 与 OpenMP 在多线程并行处理方面的加速潜力。为了更深入地理解这些技术在实际应用场景中的效能提升&#xff0c;接下来我们将目光转向目标开发板环境&#xff0c;进一步探究这两种框架在嵌入式…

vulhub中spring的CVE-2022-22965漏洞复现

在JDK 9上运行的Spring MVC或Spring WebFlux应用程序可能存在通过数据绑定执行远程代码&#xff08;RCE&#xff09;的漏洞。 现在已知的利用方法要求应用程序以WAR部署的形式在Tomcat上运行&#xff0c;然而&#xff0c;该漏洞的性质更为普遍&#xff0c;可能有其他方法可以利…