下载包
游戏玩法:
游戏核心玩法为操控蛇头移动吞食食物使蛇身增长,同时避免触碰自身或屏幕边缘
版本
游戏介绍:
按上,下,左,右键操控贪吃蛇移动
版本介绍:
目前这个版本的贪吃蛇是专门为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;
}