C++实现贪吃蛇(含源代码)—基于easyx图形库

03-01 1730阅读 0评论

C++实现贪吃蛇(含源代码)—基于easyx图形库

C++实现贪吃蛇(含源代码)—基于easyx图形库,C++实现贪吃蛇(含源代码)—基于easyx图形库,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,安装,第2张
(图片来源网络,侵删)

                                        食用指南:本文在有C++基础的情况下食用更佳  

                                       🍀本文前置知识:C++基础

                                       ♈️今日夜电波:toge—あよ

                                                                0:36 ━━━━━━️💟──────── 4:03

                                                                    🔄   ◀️   ⏸   ▶️    ☰ 

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍 

C++实现贪吃蛇(含源代码)—基于easyx图形库,C++实现贪吃蛇(含源代码)—基于easyx图形库,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,安装,第3张
(图片来源网络,侵删)

目录

📱一、前置条件—easyx图形库的安装

        easyx简介

        easyx安装

        easyx安装步骤

C++实现贪吃蛇(含源代码)—基于easyx图形库,C++实现贪吃蛇(含源代码)—基于easyx图形库,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,安装,第4张
(图片来源网络,侵删)

🐍二、进入正题!—贪吃蛇的实现!

        1、大致实现思路

        2、具体实现思路

        父类:

        蛇类 :

        食物类:

        游戏场景的实现(重要):

📑三、 实现效果以及源代码

        1、运行效果

        2、总体代码 

              🔑3、一些注意事项


📱一、前置条件—easyx图形库的安装

easyx简介

        easyx 是一款基于 C /C++的图形库,它提供了简单易用的接口,可以方便地进行图形绘制和交互操作。通过引入 easyx,开发者可以快速实现基于 Windows 平台的图形界面应用程序开发。

        easyx 提供了一系列的绘图函数,例如画线、画圆、填充颜色等,开发者可以利用这些函数创建各种图形效果。同时,easyx 还提供了键盘和鼠标事件的处理函数,方便用户与图形界面进行交互。

        easyx 的优势在于它的简洁易用性和适用性。它不仅适用于初学者学习 C /C++图形编程,也可以用于快速原型开发和小型项目。易于安装和使用,对于想要学习图形编程的开发者来说是一个很好的选择。

easyx安装

        easyx安装地址(本文为EasyX 2023大暑版 )

easyx安装步骤

        简单又快捷的安装  😍  我可太爱了!

C++实现贪吃蛇(含源代码)—基于easyx图形库

        根据相应的提示安装即可

C++实现贪吃蛇(含源代码)—基于easyx图形库


🐍二、进入正题!—贪吃蛇的实现!

        1、大致实现思路

        话不多说,先上一张图୧(๑•̀◡•́๑)૭

C++实现贪吃蛇(含源代码)—基于easyx图形库

         通过父类与子类节点继承的关系这样可以使得代码连贯以及紧密相连(其实只是作者想复习一下前段时间学的父类跟子类的知识而已( ̄3 ̄)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 0;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  
 
 

        这个类就是具体的蛇体实现的过程了。主要是实现了蛇的初始化以及所有逻辑判断。在原父类的基础上还进行了蛇的方向、得分、蛇节点等数据的添加。

         食物类:
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  
 
 

        这个类实现的就是将前面所实现的类进行整合,然后再进行有些稍微的调节。比如:增加了接受方向键的函数omsg,得以操控蛇的运动。这个类也进行了蛇活动场景的搭建等等。


        📑三、 实现效果以及源代码

        1、运行效果

        游戏开始界面:

C++实现贪吃蛇(含源代码)—基于easyx图形库

        游戏运行界面:

C++实现贪吃蛇(含源代码)—基于easyx图形库

        游戏结算界面: 

C++实现贪吃蛇(含源代码)—基于easyx图形库


        2、总体代码 

#include
#include
#include
#include
#include
#include
#include
using 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 0;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  

        🔑3、一些注意事项

        由于有些字符的限制,我们需要按以下步骤去更改一下字符集,将字符集改为使用多字节字符集以解决其中一些报错!报错情况如下:

C++实现贪吃蛇(含源代码)—基于easyx图形库

         如果你出现以上报错,请按以下步骤进行多字节字符集设置:

C++实现贪吃蛇(含源代码)—基于easyx图形库

C++实现贪吃蛇(含源代码)—基于easyx图形库


                 感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

                                C++实现贪吃蛇(含源代码)—基于easyx图形库 

                                                                 给个三连再走嘛~      


免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,1730人围观)

还没有评论,来说两句吧...

目录[+]