前言

在Visual Studio 2019开发环境上以C/C++为编程语言,运用easyx库实现贪吃蛇游戏逻辑的编写与可视化。


实验要求与目标

实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或,蛇头与蛇身相撞,蛇死亡,游戏结束。为游戏设计初始欢迎界面,游戏界面,游戏结束界面;

进行交互界面的设计,要有开始键、暂停键和停止退出的选项。对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐等拓展元素。


实验思路

很简单的思路:

  • 上下左右键控制蛇的移动;
  • 吃到豆子分数增加,前移动的速度也线性增加。
  • 空格键暂停游戏。
  • 撞到墙或者咬到自己,游戏结束


实验过程与部分代码

实验主要分为以下步骤:
1、蛇,豆子以及相关属性的定义。
2、程序与键盘按键交互逻辑的实现。
3、移动蛇函数逻辑实现。
4、撞到墙或者咬到自己game over以及辅助功能的实现。
5、可视化的实现。

相关核心代码

首先是蛇,豆子以及相关属性的定义以及初始化:

这里运用了结构体来存放相关变量,初始点设为负值是因为不知到为什么每次豆子刷新时(1,1)总会有豆子一闪而逝(应该是刷新的问题)
typedef struct Point
{int x = -10;int y = -10;
}MYPOINT;//蛇属性
struct mySnake
{int num;   //蛇节MYPOINT xy[MAX];        //记录蛇每一节坐标char position;        //方向
}snake;//食物
struct myFood
{MYPOINT foodCoord;     //食物坐标int flag;         //食物是否存在的标记int eatGrade;        //获取分数
}food;
//枚举
enum movPosition
{right_g,left_g,down_g,up_g
};//过程
void initSnake();           //初始化
void drawSnake();       //画蛇
void moveSnake();       //移动蛇
void keyDown();         //控制蛇移动
void initFood();            //初始化食物
void drawFood();            //画食物
void eatFood();         //吃食物
void showGrade();       //显示分数
int snakeDead();            //蛇死亡
int snakeSpeed();       //蛇速度void initFood() {food.foodCoord.x = rand() % 80 * 10;food.foodCoord.y = rand() % 60 * 10;//cout << food.foodCoord.x << " " << food.foodCoord.y << endl;food.flag = 1;//不出现在蛇for (int i = 0; i < snake.num; i++) {if (food.foodCoord.x == snake.xy[i].x && food.foodCoord.y == snake.xy[i].y) {food.foodCoord.x = rand() % 80 * 10;food.foodCoord.y = rand() % 60 * 10;}}
}void initSnake()       //初始化
{snake.xy[2].x = 0;snake.xy[2].y = 0;snake.xy[1].x = 10;snake.xy[1].y = 0;snake.xy[0].x = 20;snake.xy[0].y = 0;snake.num = 3;            //初始化蛇的节数snake.position = right_g;     //初始化蛇的方向}

程序与键盘按键交互逻辑的实现:

enum movPosition
{right_g,left_g,down_g,up_g
};
void keyDown()      //控制蛇移动
{char key = _getch();if (key == 32) {while (_getch() != 32);}switch (key){case 'w':case 'W':case 72:if (snake.position != down_g) {snake.position = up_g;}break;case 's':case 'S':case 80:if (snake.position != up_g) {snake.position = down_g;}break;case 'a':case 'A':case 75:if (snake.position != right_g) {snake.position = left_g;}break;break;case 'd':case 'D':case 77:if (snake.position != left_g) {snake.position = right_g;}break;break;}
}

移动蛇,吃到豆子函数逻辑实现:

void moveSnake()     //移动蛇;
{//移动for (int i = snake.num - 1; i > 0; i--) {snake.xy[i].x = snake.xy[i - 1].x;snake.xy[i].y = snake.xy[i - 1].y;}//蛇头移动switch (snake.position){case up_g:snake.xy[0].y -= 10;break;case down_g:snake.xy[0].y += 10;break;case left_g:snake.xy[0].x -= 10;break;case right_g:snake.xy[0].x += 10;break;default:break;}
}void eatFood() {if (snake.xy[0].x == food.foodCoord.x && snake.xy[0].y == food.foodCoord.y) {food.flag = 0;snake.num++;food.eatGrade += 10;}
}

撞到墙或者咬到自己game over以及辅助功能的实现

int snakeDead() {if (snake.xy[0].x < 0 || snake.xy[0].x>800 || snake.xy[0].y < 0 || snake.xy[0].y>600) {MessageBox(hwnd, "game over", "撞墙", 0);return 1;}for (int i = 1; i < snake.num; i++) {if (snake.xy[0].x == snake.xy[i].x && snake.xy[0].y == snake.xy[i].y) {MessageBox(hwnd, "game over", "自杀", 0);return 1;}}return 0;
}int snakeSpeed() {return 100 - (snake.num - 3) * 5;
}

easyx库可视化

EasyX Library for C++ 是针对 VC 的一套绘图库,接口简单易用,用起来很像 TC 的 graphics.h 绘图。

画蛇,画豆子,以及出现相关提示的实现:

void drawSnake() {   //画蛇for (int i = 0; i < snake.num; i++) {setlinecolor(WHITE);setfillcolor(BLACK);fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);}
}void drawFood() {setfillcolor(BLACK);setlinecolor(WHITE);cout << food.foodCoord.x << " " << food.foodCoord.y << endl;fillrectangle(food.foodCoord.x, food.foodCoord.y, food.foodCoord.x + 10, food.foodCoord.y + 10);
}void showGrade() {char grade[MAX] = "";sprintf(grade, "分数: %d", food.eatGrade);setbkmode(TRANSPARENT);settextcolor(BLACK);outtextxy(650, 30, grade);char tip[MAX] = "";sprintf(tip,"暂停:按g空格键");setbkmode(TRANSPARENT);settextcolor(BLACK);outtextxy(630, 100, tip);char tip1[MAX] = "";sprintf(tip1, "操控:w,a,s,d或上下左右键");setbkmode(TRANSPARENT);settextcolor(BLACK);outtextxy(580, 170, tip1);
}

主函数方法

int main() {srand(((unsigned int)time(NULL)));hwnd = initgraph(800, 600);       初始化界面setbkcolor(WHITE);     //设置背景颜色cleardevice();          //刷新initSnake();LOGFONT f;//字体样式指针gettextstyle(&f);                 //获取字体样式_tcscpy(f.lfFaceName, _T("宋体"));  //设置字体为宋体f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  settextstyle(&f);                     // 设置字体样式settextcolor(BLACK);while (1) {cleardevice();if (food.flag == 0) {initFood();           //初始化食物}drawFood();         //画食物drawSnake();       //画蛇moveSnake();        //移动蛇eatFood();         //吃食物showGrade();       //显示分数if (snakeDead()) {break;}if (_kbhit()) {keyDown();}Sleep(snakeSpeed());       //蛇的速度}_getch();closegraph();system("pause");return 0;
}

实验结果

总体界面:

动态演示:


实际运动不会有痕迹,应该是gif格式的问题。

谢谢观看~

c/c++实现简单的贪吃蛇可视化游戏相关推荐

  1. STM32+LCD实现简单的贪吃蛇小游戏

    寒假放假回家,只能宅在家里,无聊之余,幸好带了一块开发板回来,以前做项目都是在网上找相似或者有关联的项目,把别人的代码拿过来,修改修改,拼拼凑凑出自己项目,既然无聊就自己动脑筋思考,自己动手写贪吃蛇的 ...

  2. Python 简单实现贪吃蛇小游戏

    文章目录 1. pygame库的简介2. pygame库的安装3. python代码实现贪吃蛇小游戏4. pyinstaller打包成exe 很多人学习python,不知道从何学起. 很多人学习pyt ...

  3. android 简单的贪吃蛇小游戏

    贪吃蛇是一款经典的小游戏,游戏比较简单,实现也比较简单. 本篇博客将详细介绍我自己写的贪吃蛇的思路以及实现方式. 首先我们需要在游戏界面将游戏区域划分成无数个小方格,类似下图 画布(游戏区域)的宽为 ...

  4. QT实现简单的贪吃蛇小游戏

    一.新建一个Qt项目 新建Qt Widgets Application,项目名称为HappySnake,基类选择QWidget,类名默认 二.添加要用到的头文件 #include <QKeyEv ...

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

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

  6. Python100行-贪吃蛇小游戏

    今天来尝试下用python写一个贪吃小游戏,哈哈哈哈,毕竟贪吃蛇,大家小时候都玩过,但现在却有机会自己实现一个!!! 效果图 绘制蛇 1.如何画turtle画一个正方形? 其实就是一个点,往右,往下, ...

  7. python简易贪吃蛇小游戏任务书含代码

    目  录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...

  8. VC环境下简单的贪吃蛇

    下午真无聊的不知道干什么了,翻翻自己以前写的代码,偶然看到大一时写的这个简单的贪吃蛇,自己玩了几把后还是决定发到博客吧.(实在无聊,打发时间) 注:完全基于VC++6.0环境,不支持Linux 下te ...

  9. python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单

    贪吃蛇,大家应该都玩过.小编当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最 ...

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

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

最新文章

  1. [译] Vue.js 优雅地集成第三方 JavaScript
  2. 软件设计师考试下午真题 数据流图 数据库设计 面向对象 数据结构与算法 UML建模
  3. 【大数据】如何用形象的比喻描述大数据的技术生态?Hadoop、Hive、Spark 之间是什么关系?
  4. Boost:求容器的最小元素和最大元素
  5. 软件之间的数据格式对接往往将_XRD数据格式的转换和TXT格式数据正确导入Jade的办法...
  6. step-by-step多文件WEB批量上传(swfupload)的完美解决方案
  7. 弹性法计算方法的mck法_粘弹性自由阻尼加筋板的随机响应分析和试验研究
  8. C语言笔试不好应该转专业吗,你认为大学里什么学科“难学”?过来人说出几门,考试难补考更难...
  9. 3.10 神经网络的梯度下降法-推导
  10. SecureCRT日志上添加时间戳
  11. Deepin-文件目录介绍
  12. Java打印9*9乘法表
  13. NOPIExcel读写扩展
  14. 虾米关停之际,抖音快手借道音乐暗战TME
  15. 计算机共享网络授权,怎么设置网络共享与网络访问权限?
  16. 实施ERP系统需要注意哪些方面?
  17. OpenGL中PBR着色器的实现
  18. _weak typeof(self) weakSelf = self;
  19. JavaScript - 简介
  20. ANSYS apdl命令流耦合场分析案例4--------三维感应加热

热门文章

  1. Unreal Engine4人物模板编辑与解析(1)
  2. 1. Boost.Asio入门
  3. 新世界黑客与匿名者组织宣布对美国DNS服务的大规模DDoS攻击负责
  4. java设置手机后台进程限制_当应用程序在Android Pie上受到后台限制时启动前台服务...
  5. [py] 统计输入字符串中的单词个数及单词的平均长度
  6. 2020携程java面试题整理,开发实习一面面经
  7. 关于OSGI中的Felix热插拔技术
  8. 扣哒世界的游戏开发2-2军事训练2
  9. shell学习笔记:变量篇
  10. UVA-11584:Partitioning by Palindromes(基础DP)