c/c++实现简单的贪吃蛇可视化游戏
前言
在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++实现简单的贪吃蛇可视化游戏相关推荐
- STM32+LCD实现简单的贪吃蛇小游戏
寒假放假回家,只能宅在家里,无聊之余,幸好带了一块开发板回来,以前做项目都是在网上找相似或者有关联的项目,把别人的代码拿过来,修改修改,拼拼凑凑出自己项目,既然无聊就自己动脑筋思考,自己动手写贪吃蛇的 ...
- Python 简单实现贪吃蛇小游戏
文章目录 1. pygame库的简介2. pygame库的安装3. python代码实现贪吃蛇小游戏4. pyinstaller打包成exe 很多人学习python,不知道从何学起. 很多人学习pyt ...
- android 简单的贪吃蛇小游戏
贪吃蛇是一款经典的小游戏,游戏比较简单,实现也比较简单. 本篇博客将详细介绍我自己写的贪吃蛇的思路以及实现方式. 首先我们需要在游戏界面将游戏区域划分成无数个小方格,类似下图 画布(游戏区域)的宽为 ...
- QT实现简单的贪吃蛇小游戏
一.新建一个Qt项目 新建Qt Widgets Application,项目名称为HappySnake,基类选择QWidget,类名默认 二.添加要用到的头文件 #include <QKeyEv ...
- 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)
分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象) 食物对象(food) 蛇对象(snake) 游戏对象(game) 1.food对象 属性 :x, y, ...
- Python100行-贪吃蛇小游戏
今天来尝试下用python写一个贪吃小游戏,哈哈哈哈,毕竟贪吃蛇,大家小时候都玩过,但现在却有机会自己实现一个!!! 效果图 绘制蛇 1.如何画turtle画一个正方形? 其实就是一个点,往右,往下, ...
- python简易贪吃蛇小游戏任务书含代码
目 录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...
- VC环境下简单的贪吃蛇
下午真无聊的不知道干什么了,翻翻自己以前写的代码,偶然看到大一时写的这个简单的贪吃蛇,自己玩了几把后还是决定发到博客吧.(实在无聊,打发时间) 注:完全基于VC++6.0环境,不支持Linux 下te ...
- python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单
贪吃蛇,大家应该都玩过.小编当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最 ...
- 基于C语言Ncurse库和链表的简单贪吃蛇小游戏
参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...
最新文章
- [译] Vue.js 优雅地集成第三方 JavaScript
- 软件设计师考试下午真题 数据流图 数据库设计 面向对象 数据结构与算法 UML建模
- 【大数据】如何用形象的比喻描述大数据的技术生态?Hadoop、Hive、Spark 之间是什么关系?
- Boost:求容器的最小元素和最大元素
- 软件之间的数据格式对接往往将_XRD数据格式的转换和TXT格式数据正确导入Jade的办法...
- step-by-step多文件WEB批量上传(swfupload)的完美解决方案
- 弹性法计算方法的mck法_粘弹性自由阻尼加筋板的随机响应分析和试验研究
- C语言笔试不好应该转专业吗,你认为大学里什么学科“难学”?过来人说出几门,考试难补考更难...
- 3.10 神经网络的梯度下降法-推导
- SecureCRT日志上添加时间戳
- Deepin-文件目录介绍
- Java打印9*9乘法表
- NOPIExcel读写扩展
- 虾米关停之际,抖音快手借道音乐暗战TME
- 计算机共享网络授权,怎么设置网络共享与网络访问权限?
- 实施ERP系统需要注意哪些方面?
- OpenGL中PBR着色器的实现
- _weak typeof(self) weakSelf = self;
- JavaScript - 简介
- ANSYS apdl命令流耦合场分析案例4--------三维感应加热
热门文章
- Unreal Engine4人物模板编辑与解析(1)
- 1. Boost.Asio入门
- 新世界黑客与匿名者组织宣布对美国DNS服务的大规模DDoS攻击负责
- java设置手机后台进程限制_当应用程序在Android Pie上受到后台限制时启动前台服务...
- [py] 统计输入字符串中的单词个数及单词的平均长度
- 2020携程java面试题整理,开发实习一面面经
- 关于OSGI中的Felix热插拔技术
- 扣哒世界的游戏开发2-2军事训练2
- shell学习笔记:变量篇
- UVA-11584:Partitioning by Palindromes(基础DP)