宁波网站建设外包深圳品牌网站设计公司价格

当前位置: 首页 > news >正文

宁波网站建设外包,深圳品牌网站设计公司价格,如何看待百度竞价排名,外贸网站建设哪家有名食用指南#xff1a;本文在有C基础的情况下食用更佳 #x1f340;本文前置知识#xff1a;C基础 ♈️今日夜电波#xff1a;toge—あよ 0:36 ━━━━━━️#x1f49f;──────── 4:03 本文在有C基础的情况下食用更佳   本文前置知识C基础 ♈️今日夜电波toge—あよ 0:36 ━━━━━━️──────── 4:03                                                                        ◀️   ⏸   ▶️    ☰  关注点赞收藏您的每一次鼓励都是对我莫大的支持  目录 一、前置条件—easyx图形库的安装 easyx简介 easyx安装 easyx安装步骤 二、进入正题—贪吃蛇的实现 1、大致实现思路 2、具体实现思路 父类 蛇类  食物类 游戏场景的实现重要 三、 实现效果以及源代码 1、运行效果 2、总体代码  3、一些注意事项 一、前置条件—easyx图形库的安装 easyx简介 easyx 是一款基于 C /C的图形库它提供了简单易用的接口可以方便地进行图形绘制和交互操作。通过引入 easyx开发者可以快速实现基于 Windows 平台的图形界面应用程序开发。 easyx 提供了一系列的绘图函数例如画线、画圆、填充颜色等开发者可以利用这些函数创建各种图形效果。同时easyx 还提供了键盘和鼠标事件的处理函数方便用户与图形界面进行交互。 easyx 的优势在于它的简洁易用性和适用性。它不仅适用于初学者学习 C /C图形编程也可以用于快速原型开发和小型项目。易于安装和使用对于想要学习图形编程的开发者来说是一个很好的选择。 easyx安装 easyx安装地址本文为EasyX 2023大暑版 easyx安装步骤 简单又快捷的安装    我可太爱了 根据相应的提示安装即可 二、进入正题—贪吃蛇的实现 1、大致实现思路 话不多说先上一张图୧(๑•̀◡•́๑)૭ 通过父类与子类节点继承的关系这样可以使得代码连贯以及紧密相连其实只是作者想复习一下前段时间学的父类跟子类的知识而已()a大体的功能实现如上图。 2、具体实现思路 父类 class sprite//父类 { public:int m_x;int m_y;COLORREF m_color; public:sprite() :sprite(0, 0) {};sprite(int x, int y) :m_x(x), m_y(y), m_color(BLUE) {};//初始化坐标颜色virtual void draw(){setfillcolor(m_color);fillrectangle(m_x, m_y, m_x 10, m_y 10);}virtual void draw(COLORREF a){setfillcolor(a);fillrectangle(m_x, m_y, m_x 10, m_y 10);}void moveby(int dx,int dy){m_x dx;m_y dy;}bool collision(const sprite ote)//碰撞食物检测{return m_x ote.m_x m_y ote.m_y;} }; 作为最基本的类所要实现的最基本任务就是储存数据对此我做了坐标数据的储存以及蛇颜色数据的储存。接着是对于基本绘图需求实现函数、移动需求实现函数以及配置检查函数。这几个函数也是对于蛇基本的逻辑判断以及移动的需求。 蛇类  class Snake:public sprite//蛇体 { public:Snake() :Snake(0, 0) {};Snake(int x, int y):sprite(x, y),dir(VK_RIGHT),grade(0) //初始化三节蛇{nodes.push_back(sprite(120, 100));//蛇头nodes.push_back(sprite(110, 100));nodes.push_back(sprite(100, 100));};void draw(){for (int i 0; i nodes.size(); i){nodes[i].draw();}}void move(){for (int inodes.size()-1;i0;i–)//整体移动{nodes[i] nodes[i - 1];}switch (dir)//控制方向{case VK_UP:nodes[0].moveby(0,-10);break;case VK_DOWN:nodes[0].moveby(0, 10);break;case VK_LEFT:nodes[0].moveby(-10, 0);break;case VK_RIGHT:nodes[0].moveby(10, 0);break;}}bool collision(const sprite ote){return nodes[0].collision(ote);}void increase()//长度增加一节{nodes.push_back(sprite());grade;}void cotget()//计分{string str 当前得分为:;str to_string(grade);char Outscore[1024];strcpy_s(Outscore, sizeof(Outscore), str.c_str());settextstyle(15, 0, 宋体);settextcolor(GREEN);outtextxy(20, 20, Outscore);}bool dead()//死亡检测{for (int i 1; i nodes.size(); i)//撞到自己{if (nodes[0].m_x nodes[i].m_x nodes[0].m_y nodes[i].m_y){cleardevice();return true;}}if (nodes[0].m_x 0 || nodes[0].m_y 0 || nodes[0].m_x 630 || nodes[0].m_y 470)//撞到墙return true;return false;} private:vectorsprite nodes;//存蛇节public:int dir;//蛇的方向int grade;//得分 }; 这个类就是具体的蛇体实现的过程了。主要是实现了蛇的初始化以及所有逻辑判断。在原父类的基础上还进行了蛇的方向、得分、蛇节点等数据的添加。 食物类 class Food :public sprite//食物 { public:Food() :sprite(0, 0) {changefood();};void draw(){setfillcolor(RED);fillrectangle(m_x, m_y, m_x 10, m_y 10);}//生成食物void changefood(){//随机生成坐标m_x rand() % 64 * 10;if (m_x 0)m_x 10;else if (m_x 640)m_x - 20;else if (m_x 630)m_x - 10;m_y rand() % 48 * 10;if (m_y 0)m_y 10;else if (m_y 480)m_y - 30;else if (m_x 470)m_y - 20;}};这个类就是在父类的基础上实现了食物的随机位置生成基于坐标数据所生成的。 游戏场景的实现重要 class gameScreen//游戏场景 { private:Snake snake;Food food; public:gameScreen() {};void run(){//双缓冲绘图setbkcolor(YELLOW);BeginBatchDraw();cleardevice();wall();snake.draw();//蛇生成food.draw();//实物生成snake.cotget();snake.dead();EndBatchDraw();//移动snake.move();//吃食物SnakeEat();//获取信息ExMessage msg { 0 };while (peekmessage(msg, EX_KEY)){onmesg(msg);}}//改变蛇的方向 通过方向键 void onmesg(const ExMessage msg){//判断键盘有没有方向按键按下if (msg.message WM_KEYDOWN)//接受↑↓←→信息{switch (msg.vkcode)//不让蛇头向后走{case VK_UP:if(snake.dir! VK_DOWN)snake.dir msg.vkcode;break;case VK_DOWN:if (snake.dir ! VK_UP)snake.dir msg.vkcode;break;case VK_LEFT:if (snake.dir ! VK_RIGHT)snake.dir msg.vkcode;break;case VK_RIGHT:if (snake.dir ! VK_LEFT)snake.dir msg.vkcode;break;}}}void SnakeEat(){if (snake.collision(food))//吃到了食物{//蛇节数增加snake.increase();//食物重新生成food.changefood();}}void deadcot()//死亡结算{string str 您的最终得分为:;str to_string(snake.grade);char Outscore[1024];strcpy_s(Outscore, sizeof(Outscore), str.c_str());settextstyle(30, 0, 宋体);settextcolor(GREEN);outtextxy(200, 210, Outscore);}void realdead()//判死{if (snake.dead()){deadcot();Sleep(3000);closegraph();}}void wall()//生成墙{sprite wa;for (int i 0; i 480; i10) {//首先声明颜色否则第一个格子怪怪的wa.draw(GREEN);wa.moveby(0, 10);}sprite wb;{for (int i 0; i 640; i 10) {//首先声明颜色否则第一个格子怪怪的wb.draw(GREEN);wb.moveby(10, 0);}}sprite sa(630, 470);for (int i 0; i 480; i 10) {//首先声明颜色否则第一个格子怪怪的sa.draw(GREEN);sa.moveby(0, -10);}sprite sb(630, 470);for (int i 0; i 640; i 10) {//首先声明颜色否则第一个格子怪怪的sb.draw(GREEN);sb.moveby(-10, 0);}}}; 这个类实现的就是将前面所实现的类进行整合然后再进行有些稍微的调节。比如增加了接受方向键的函数omsg得以操控蛇的运动。这个类也进行了蛇活动场景的搭建等等。 三、 实现效果以及源代码 1、运行效果 游戏开始界面 游戏运行界面 游戏结算界面  2、总体代码  #includeiostream #includeeasyx.h #includevector #includestdlib.h #includetime.h #includestring #includeconio.husing namespace std;class sprite//父类 { public:int m_x;int m_y;COLORREF m_color; public:sprite() :sprite(0, 0) {};sprite(int x, int y) :m_x(x), m_y(y), m_color(BLUE) {};//初始化坐标颜色virtual void draw(){setfillcolor(m_color);fillrectangle(m_x, m_y, m_x 10, m_y 10);}virtual void draw(COLORREF a){setfillcolor(a);fillrectangle(m_x, m_y, m_x 10, m_y 10);}void moveby(int dx,int dy){m_x dx;m_y dy;}bool collision(const sprite ote)//碰撞食物检测{return m_x ote.m_x m_y ote.m_y;} };class Snake:public sprite//蛇体 { public:Snake() :Snake(0, 0) {};Snake(int x, int y):sprite(x, y),dir(VK_RIGHT),grade(0) //初始化三节蛇{nodes.push_back(sprite(120, 100));//蛇头nodes.push_back(sprite(110, 100));nodes.push_back(sprite(100, 100));};void draw(){for (int i 0; i nodes.size(); i){nodes[i].draw();}}void move(){for (int inodes.size()-1;i0;i–)//整体移动{nodes[i] nodes[i - 1];}switch (dir)//控制方向{case VK_UP:nodes[0].moveby(0,-10);break;case VK_DOWN:nodes[0].moveby(0, 10);break;case VK_LEFT:nodes[0].moveby(-10, 0);break;case VK_RIGHT:nodes[0].moveby(10, 0);break;}}bool collision(const sprite ote){return nodes[0].collision(ote);}void increase()//长度增加一节{nodes.push_back(sprite());grade;}void cotget()//计分{string str 当前得分为:;str to_string(grade);char Outscore[1024];strcpy_s(Outscore, sizeof(Outscore), str.c_str());settextstyle(15, 0, 宋体);settextcolor(GREEN);outtextxy(20, 20, Outscore);}bool dead()//死亡检测{for (int i 1; i nodes.size(); i)//撞到自己{if (nodes[0].m_x nodes[i].m_x nodes[0].m_y nodes[i].m_y){cleardevice();return true;}}if (nodes[0].m_x 0 || nodes[0].m_y 0 || nodes[0].m_x 630 || nodes[0].m_y 470)//撞到墙return true;return false;} private:vectorsprite nodes;//存蛇节public:int dir;//蛇的方向int grade;//得分 };class Food :public sprite//食物 { public:Food() :sprite(0, 0) {changefood();};void draw(){setfillcolor(RED);fillrectangle(m_x, m_y, m_x 10, m_y 10);}//生成食物void changefood(){//随机生成坐标m_x rand() % 64 * 10;if (m_x 0)m_x 10;else if (m_x 640)m_x - 20;else if (m_x 630)m_x - 10;m_y rand() % 48 * 10;if (m_y 0)m_y 10;else if (m_y 480)m_y - 30;else if (m_x 470)m_y - 20;}};class gameScreen//游戏场景 { private:Snake snake;Food food; public:gameScreen() {};void run(){//双缓冲绘图setbkcolor(YELLOW);BeginBatchDraw();cleardevice();wall();snake.draw();//蛇生成food.draw();//实物生成snake.cotget();snake.dead();EndBatchDraw();//移动snake.move();//吃食物SnakeEat();//获取信息ExMessage msg { 0 };while (peekmessage(msg, EX_KEY)){onmesg(msg);}}//改变蛇的方向 通过方向键 void onmesg(const ExMessage msg){//判断键盘有没有方向按键按下if (msg.message WM_KEYDOWN)//接受↑↓←→信息{switch (msg.vkcode)//不让蛇头向后走{case VK_UP:if(snake.dir! VK_DOWN)snake.dir msg.vkcode;break;case VK_DOWN:if (snake.dir ! VK_UP)snake.dir msg.vkcode;break;case VK_LEFT:if (snake.dir ! VK_RIGHT)snake.dir msg.vkcode;break;case VK_RIGHT:if (snake.dir ! VK_LEFT)snake.dir msg.vkcode;break;}}}void SnakeEat(){if (snake.collision(food))//吃到了食物{//蛇节数增加snake.increase();//食物重新生成food.changefood();}}void deadcot()//死亡结算{string str 您的最终得分为:;str to_string(snake.grade);char Outscore[1024];strcpy_s(Outscore, sizeof(Outscore), str.c_str());settextstyle(30, 0, 宋体);settextcolor(GREEN);outtextxy(200, 210, Outscore);}void realdead()//判死{if (snake.dead()){deadcot();Sleep(3000);closegraph();}}void wall()//生成墙{sprite wa;for (int i 0; i 480; i10) {//首先声明颜色否则第一个格子怪怪的wa.draw(GREEN);wa.moveby(0, 10);}sprite wb;{for (int i 0; i 640; i 10) {//首先声明颜色否则第一个格子怪怪的wb.draw(GREEN);wb.moveby(10, 0);}}sprite sa(630, 470);for (int i 0; i 480; i 10) {//首先声明颜色否则第一个格子怪怪的sa.draw(GREEN);sa.moveby(0, -10);}sprite sb(630, 470);for (int i 0; i 640; i 10) {//首先声明颜色否则第一个格子怪怪的sb.draw(GREEN);sb.moveby(-10, 0);}}};void play() {cleardevice();//initgraph(640, 480);srand(time(nullptr));gameScreen game;while (1){Sleep(100);game.run();game.realdead();}getchar();}void menu() {char str_0[] 》 -贪吃蛇- 《;char str_1[] 1.play;char str_2[] 2.游戏帮助;char str_3[] 按任意键退出;settextstyle(20, 0, 宋体);outtextxy(200, 150, str_0);outtextxy(220, 190, str_1);outtextxy(220, 230, str_2);outtextxy(220, 270, str_3); }void intro() {cleardevice();char str_0[] 【帮助】;char str_1[] 操作技巧↑↓← →控制蛇的方向;char str_2[] 什么你说你没方向键;char str_3[] 亲,请点右上角;char str_4[] 制作者慕斯;char str_5[] 按任意键返回;settextstyle(20, 0, 宋体);outtextxy(200, 120, str_0);outtextxy(180, 160, str_1);outtextxy(180, 200, str_2);outtextxy(180, 240, str_3);outtextxy(180, 280, str_4);outtextxy(180, 320, str_5);int leb 0;leb _getch(); }void SNAKE() {int leb 0;int kk 1;do{initgraph(640, 480);menu();leb _getch();switch (leb){case 49:play();break;case 50:intro();break;default:kk 0;break;}} while (kk);}int main() {SNAKE();//play();return 0; } 3、一些注意事项 由于有些字符的限制我们需要按以下步骤去更改一下字符集将字符集改为使用多字节字符集以解决其中一些报错报错情况如下 如果你出现以上报错请按以下步骤进行多字节字符集设置 感谢你耐心的看到这里ღ( ´ᴗ )比心如有哪里有错误请踢一脚作者o(╥﹏╥)o   给个三连再走嘛~