下载包

游戏玩法:
游戏核心玩法为操控蛇头移动吞食食物使蛇身增长,同时避免触碰自身或屏幕边缘
版本

游戏介绍:
按上,下,左,右键操控贪吃蛇移动

版本介绍:
目前这个版本的贪吃蛇是专门为Dev-C++量身定做的,也就是Dev-C++版
这个贪吃蛇是由网上一位大主包写的,作者本入调整了一下在Dev-C++里无法使用的代码,优化了一些bug和性能

温馨提示:
请不要修改文件里的图片名和文件夹名,否则可能会报错
源代码可以找我要
运行源代码时要有EasyX库,不然会报错
看到我的题解记得点赞!

文章作者:gf25051
//贪吃蛇源代码
//要搭配下载包和EasyX库 
#include<bits/stdc++.h>
#include<easyx.h>
#include<vector>
#include<stdlib.h>
#include<time.h>
#include<string>
#include<conio.h>
using namespace std;
int xhcnt=0;
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 i=nodes.size()-1; 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(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:
		vector<sprite> 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 == 630)
				m_x = 620;
			m_y = rand() % 48 * 10;
			if (m_y == 0)
				m_y += 10;
			else if (m_x == 470)
				m_y = 450;
		}


};

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(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; i+=10) {
				//首先声明颜色,否则第一个格子怪怪的
				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[] = "改造者:gf25051";
	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);
		if(xhcnt==0) {
			IMAGE img,img2;
			loadimage(&img, "./img/咸鱼.png", getwidth(), getheight());
			loadimage(&img2, "./img/小黄工作室.png", getwidth(), getheight());
			putimage(0, 0, &img);
			Sleep(2000);
			cleardevice();
			putimage(0, 0, &img2);
			Sleep(2000);
			cleardevice();
		}
		xhcnt++;
		menu();
		leb = _getch();
		switch (leb) {
			case 49:
				play();
				break;
			case 50:
				intro();
				break;
			default:
				kk = 0;
				break;
		}
	} while (kk);
}
int main() {
	SNAKE();
	return 0;
}