两条蛇实现原理:先定义好一条蛇,然后派生出另外一条蛇,重要第二条蛇的移动方向的方法,换成键盘上的另外四个键,然后就是正常的游戏判断,两条蛇相碰的判断等等 . . .

素材就是一个背景加上一个音乐,其它的都是基于 EasyX 里的方法画出来的

游戏效果如下所示:

小游戏制作贪吃蛇


代码如下所示:

#include <iostream>
#include <graphics.h>
#include <ctime>
#include <conio.h>
#include <cstdlib>
#include <cmath>
#include <mmsystem.h>
#pragma comment (lib,"winmm")void InitGame();    //初始化游戏const int WIDTH = 640;
const int HEIGHT = 480;class Snake      //  1  红色       2   绿色
{
private:const static int NUM = 100;    //最大节数struct Coord    //每一节的坐标{int x;int y;};int s_count;       //初始为3节int fruit_x, fruit_y;    //果实的位置Coord snake[NUM];    //一共多少节protected:enum Direction { Up = 72, Down = 80, Left = 75, Right = 77 };   //枚举方向Direction direction;        //默认为左方向public://构造Snake();//析构virtual ~Snake();//初始蛇 和 果实的坐标void InitSnakeFruitCoord();//移动  (改变坐标)  画蛇 判断吃果实void Move();//刷新果实 位置void RefreshFruit();//改变蛇的方向virtual void ChangeDirection(const char& ch);//判断游戏 输赢void JudgeWinLose(const Snake& op, const int flag)const;};class Snake1 :public Snake       // 继承一个类   达到两条蛇
{
public://构造Snake1();virtual void ChangeDirection(const char& ch);
};int main()
{srand((unsigned)time(0));     //种下随机数的种子DWORD t1 = GetTickCount(), tt1;        //判断是否可以移动Snake snake1;   //两条蛇Snake1 snake2;InitGame();snake1.InitSnakeFruitCoord();  //画出蛇刚开始的位置snake2.InitSnakeFruitCoord();while (1){if (_kbhit())         //判断改变位置{char ch = _getch();snake1.ChangeDirection(ch);snake2.ChangeDirection(ch);}tt1 = GetTickCount();if (tt1 - t1 > 100)     //自移{setfillcolor(RED);snake1.Move();setfillcolor(GREEN);snake2.Move();t1 = tt1;}snake1.JudgeWinLose(snake2, 1);snake2.JudgeWinLose(snake1, 2);}return 0;
}Snake::Snake() :direction(Left), s_count(4), fruit_x(0), fruit_y(0)
{int x = (rand() % (WIDTH - 100) + 50) / 15 * 15;        //蛇的初始坐标int y = (rand() % (HEIGHT - 150) + 50) / 15 * 15;for (int i = 0; i < s_count; i++)snake[i] = { (i * 15) + x, y };
}Snake1::Snake1() :Snake() {}  //  使用默认构造 函数    Snake()  ----Snake::~Snake() {}void InitGame()
{initgraph(WIDTH, HEIGHT);MOUSEMSG msg;mciSendString("open music.mp3 alias huameng", 0, 0, 0);mciSendString("play huameng repeat", 0, 0, 0);loadimage(nullptr, "start_background.jpg", WIDTH, HEIGHT);std::cin.get();setbkcolor(RGB(255, 128, 192));cleardevice();settextcolor(RED);settextstyle(40, 25, "楷体");outtextxy(200, 100, "开始游戏");setlinecolor(RGB(155, 155, 0));rectangle(190, 90, 410, 145);        //------settextstyle(20, 10, "楷体");settextcolor(RGB(50, 128, 255));outtextxy(130, 200, "游 戏 规 则 :");outtextxy(180, 230, "玩家一:小红  控制:4个光标键");outtextxy(180, 260, "玩家二:小绿  控制:W A S D");outtextxy(80, 320, "胜利条件:1.对方触碰边界 2.对方触碰己方身体");outtextxy(180, 355, "3.吃满果实(100个) >> __ <<");outtextxy(170, 400, "注: 同灰余烬 算小绿 赢 !!!");settextstyle(40, 25, "楷体");while (1){msg = GetMouseMsg();int x = msg.x;       //rectangle(190,90,410,145);        长 220 宽 55int y = msg.y;if (x - 190 < 220 && x - 190 > 0 && y - 90 > 0 && y - 90 <= 55 && msg.mkLButton)break;else if (x - 190 < 220 && x - 190 > 0 && y - 90 > 0 && y - 90 <= 55){settextcolor(RGB(0, 255, 255));outtextxy(200, 100, "开始游戏");}else{settextcolor(RED);outtextxy(200, 100, "开始游戏");}}setbkcolor(RGB(0, 255, 255));cleardevice();
}void Snake::RefreshFruit()
{fruit_x = (rand() % (WIDTH - 100) + 50) / 15 * 15;     //  刷新位置fruit_y = (rand() % (HEIGHT - 100) + 50) / 15 * 15;
}void Snake::InitSnakeFruitCoord()
{for (int i = 0; i < s_count; i++)solidrectangle(snake[i].x, snake[i].y, snake[i].x + 15, snake[i].y + 15);fruit_x = (rand() % (WIDTH - 100) + 50) / 15 * 15;fruit_y = (rand() % (HEIGHT - 100) + 50) / 15 * 15;
}void Snake::Move()
{clearrectangle(snake[s_count - 1].x, snake[s_count - 1].y, snake[s_count - 1].x + 15, snake[s_count - 1].y + 15);for (int i = s_count - 1; i > 0; i--){snake[i].x = snake[i - 1].x;snake[i].y = snake[i - 1].y;}switch (direction){case Snake::Up:snake[0].y -= 15;break;case Snake::Down:snake[0].y += 15;break;case Snake::Left:snake[0].x -= 15;break;case Snake::Right:snake[0].x += 15;break;}for (int i = 0; i < s_count; i++)solidrectangle(snake[i].x, snake[i].y, snake[i].x + 15, snake[i].y + 15);solidrectangle(fruit_x, fruit_y, fruit_x + 15, fruit_y + 15);if (snake[0].x == fruit_x && snake[0].y == fruit_y){RefreshFruit();Move();           //防止吃到果实  卡顿s_count++;}
}void Snake::ChangeDirection(const char& ch)
{switch (ch){case 72:direction = Up; break;case 75:direction = Left; break;case 77:direction = Right; break;case 80:direction = Down; break;}
}void Snake1::ChangeDirection(const char& ch)
{switch (ch){case 'W':direction = Up; break;case 'A':direction = Left; break;case 'D':direction = Right; break;case 'S':direction = Down; break;}
}void Snake::JudgeWinLose(const Snake& op, const int flag)const
{if (flag == 1){if (snake[0].x <= 0 || snake[0].x >= WIDTH || snake[0].y <= 0 || snake[0].y >= HEIGHT || s_count >= 99){MessageBox(nullptr, "小绿胜利了 >>_<<", "游戏结束!!", MB_OK);exit(0);}elsefor (int i = 0; i < op.s_count; i++){if (snake[0].x == op.snake[i].x && snake[0].y == op.snake[i].y){MessageBox(nullptr, "小绿胜利了 >>_<<", "游戏结束!!", MB_OK);exit(0);}}}else{if (snake[0].x <= 0 || snake[0].x >= WIDTH || snake[0].y <= 0 || snake[0].y >= HEIGHT || s_count >= 99){MessageBox(nullptr, "小红胜利了 >>_<<", "游戏结束!!", MB_OK);exit(0);}elsefor (int i = 0; i < op.s_count; i++){if (snake[0].x == op.snake[i].x && snake[0].y == op.snake[i].y){MessageBox(nullptr, "小红胜利了 >>_<<", "游戏结束!!", MB_OK);exit(0);}}}
}

基于C++和EasyX 实现的《双人贪吃蛇》小游戏,你不找个小伙伴陪你一起玩吗?相关推荐

  1. 单双人贪吃蛇小游戏(控制台)

    本代码参考另一位博主的贪吃蛇的思想.单双人贪吃蛇模式. 编译已通过的平台:VS2019. 如有问题,请伙伴们一起讨论哟. 1. 程序界面功能以及运行截图如下: (1)程序主界面运行截图: (2)单人游 ...

  2. 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)

    分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象)     食物对象(food)     蛇对象(snake)     游戏对象(game) 1.food对象     属性 :x, y, ...

  3. 【精选】基于EasyX的贪吃蛇小游戏

    文章目录 前言 一.项目环境 1.Visual Studio 2019 2.EasyX 20200902 二.运行效果展示 0.加载游戏 1.主菜单 2.游戏设置 3.游戏说明 4.生存模式 5.无尽 ...

  4. 基于STL实现自动贪心寻路算法的贪吃蛇小游戏

    基于STL实现自动贪心寻路算法的贪吃蛇小游戏 写贪吃蛇小游戏的想法来自CometOJ-Contest#13的B题,当时用STL双端队列维护蛇身的时候觉得非常方便,现在用EasyX图形库实现一下. 运行 ...

  5. Python实现贪吃蛇小游戏(双人模式)

    这篇文章主要为大家详细介绍了Python实现双人模式的贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 简单用py写了一个贪吃蛇游戏,有单人.双人模式,比较简 ...

  6. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

    简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...

  7. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

  8. 基于STM32的贪吃蛇小游戏

    基于STM32的贪吃蛇小游戏 初学32一个月,学的并不多,便想着做一个贪吃蛇小游戏,因为有51单片机做贪吃蛇的经验,所以实现出来并不困难. 作品简介 游戏面版将在4.3寸480*800)液晶上显示,初 ...

  9. 基于Stm32f407 的贪吃蛇小游戏【正点原子-探索者开发板】

    基于单片机stm32f407的单机小游戏----贪吃蛇小游戏 1.介绍 这是我花一个星期完成的一个简单地单机贪吃蛇小游戏项目,芯片是stm32f407,项目是基于正点原子-探索者开发板完成的,有需要的 ...

  10. 计算机毕业设计-基于Java的GUI实现贪吃蛇小游戏

    标题:基于Java多线程版本GUI贪吃蛇小游戏 1.项目技术点 1.多线程的运用. 2.JAVA的GUI的运用. 3.数据结构的灵活运用. 4.随机食物的生成. 5.关卡加速,随着蛇身增长,蛇的速度也 ...

最新文章

  1. ruby中取反的问题
  2. 10大类、142条数据源,中文NLP数据集线上搜索开放
  3. 面试上海阿里体育的一道面试题: 设计模式,多态
  4. 学习编程技术常见的疑问,你敢说你没有过一个吗?信你个鬼!
  5. ACCESS数据库C#操作类(SQLHELPER修改版)——转自网上
  6. Mysql 中时间日期函数
  7. 计算机如何共享电视,智能电视怎么与电脑共享文件观看视频?
  8. 建筑模式语言(美)c.亚历山大.pdf,建筑模式语言(上下)(精)
  9. C语言会员卡计费系统
  10. 安装 window10 系统
  11. 浅谈Appium之AppUI自动化
  12. 【Opencv】【C++】 Opencv之calcHist() 计算直方图
  13. 拿到天使投资是一种怎样的体验
  14. mini——story3验收总结
  15. java+mysql基于ssm的校园快递代领系统
  16. “一城一湖”风景独好,“洪城智能体”加速南昌迈向全场景智慧
  17. MySQL5.7插入中文乱码
  18. Android群英传-拼图游戏puzzle-6点吐槽
  19. 又一开源神器,值得收藏学习!
  20. Map集合的基本使用

热门文章

  1. CocosCreator代码混淆加密
  2. 《AutoCAD 2016中文版从入门到精通》——- 导读
  3. TongWeb基本使用
  4. Java学习笔记之JDBC和连接池
  5. 大数据技术笔记之数据采集和预处理
  6. ios游戏开发 Sprite Kit教程:初学者 3
  7. 计算机专业毕业设计的进度记录,毕业设计周次进度计划及实际进展情况表.doc...
  8. Linux----UnZip命令
  9. H5 Laya 字体
  10. Mentor Graphics QuestaSim 2021 出现“正在运行后安装脚本...脚本:1/1”的问题