| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C实现贪吃蛇小游戏 -> 正文阅读 |
|
[C++知识库]C实现贪吃蛇小游戏 |
贪吃蛇小游戏可以说是很多小伙伴的游戏启蒙之物,今天我们一起来用C语言复刻童年经典游戏贪吃蛇,在编写这个游戏之前,需要了解一些easyx图形库的知识,因为游戏的窗口就是靠此来提供。 这篇文章主要介绍编写这个游戏要实现的功能,另外我会再写一篇关于这个游戏常见的一些BUG及其解决办法,如果已经能完成部分的编写,而困于某些BUG的伙伴可以移步另一篇文章,可能会有你遇到的一些BUG。 实现贪吃蛇游戏,首先我们需要设置一个游戏窗口,利用easyx图形库,设置一个经典的640*480大小的窗口。窗口设定好了,接下来就可以定义蛇了,我们用结构体来定义蛇的类型,分析一下蛇需要用到那些数据,我们首先需要知道这个蛇有多长,便于游戏开始时蛇的长度设定,及游戏结束后蛇长的统计,那我们就用 int n 来表示蛇的长度。蛇在移动过程中是要有一个移动方向的,因此我们也需要设置一个int direction 来表示蛇移动的方向,因为方向就四个,我们干脆就把四个方向枚举出来,然后蛇的移动方向就用枚举变量来表示
其次我们需要知道蛇的每一节身体的坐标,这样我们通过坐标来让蛇移动,以及把蛇绘制到窗口上,因为蛇的身体有很多节,坐标又有x , y两个值。我们就把坐标单独定义为结构体,然后身体的每一节都对应着一个坐标,我们用数组来表示身体
最终蛇的定义如下
定义完蛇的类型,接下来我们就把蛇初始化以下,写一个初始化函数, initsnake() 假设蛇刚开始长度为3, 方向向左, 坐标依次为
初始化完成后,我们就把蛇绘制到窗口上,写一个 Drawsnake() 函数,其实就是一个循环,以蛇的长度为判定条件,从蛇头的坐标开始依次绘制,画矩形或者圆都可,这里我用的是矩形
绘制完成之后,接下来就要让蛇动起来了,这点很关键,如何实现让蛇动起来,分析可知,蛇移动的原理是让蛇头的坐标朝向某个方向不断的改变,身体再跟着蛇头一起改变,坐标每变换一次就重新绘制蛇的身体,因为这个过程足够快,我们将其处理的速度用Sleep()再延缓一点,就能形成我们眼睛所能识别的帧率,从而看着蛇是连续移动的。既然要不断的变换蛇头的坐标,并且重新绘制蛇的身体,那就要将这两个函数放到循环里面,蛇的移动我们编写一个Movesnake()。
那么如何让蛇的坐标不断朝着某个方向改变呢?接下来我们就仔细解决Movesnake(),首先我们要判断具体往哪个方向移动,还记得在定义蛇的时候,设置了一个方向变量site嘛,现在它派上用场了。我们在初始化的时候,将这个变量初始化向左移动,然后程序将蛇头坐标的x减少10,即向左改变了10个像素点,因为在循环里,只要site的值不变,蛇头就一直向左移动,第二节身体的坐标移动到原先蛇头的位置,其他节身体的坐标依次移动到它上一节身体的坐标处,这样就实现了蛇的移动,别忘了加上一个cleardevice()函数,清除上一次绘制的图形。
蛇的移动完成之后,接下来就是蛇在移动的时候,方向的改变,如果不让蛇的方向改变,那也没法玩呢,首先我们只有在按下方向键的时候蛇头的方向才会改变,那就先设置一个变量用来接收我们按下的方向键,然后再把这个方向键赋值给蛇头的方向变量,我们就编写一个Chdirection()函数来实现
这里为什么要在每一个分支后面加上 if 判断语句呢,其实就是为了防止蛇直接就调头了,这和现实是不符的,显示中的掉头要绕圈子的。 ?其实,直接掉头也是可以的,还蛮有意思的,像火车一样两头开,哈哈,感兴趣可以试试。 转向的问题搞定了,但是程序怎么知道什么时候转向呢?因为这个程序是放在循环里的,我们不妨加一个判断语句,用kbhit()函数来检测玩家是否按下了按键,如果按下了就返回真值,进入转向函数,并在其内部判断该转向哪里,没有按下就为假,不进入转向函数。
小蛇能跑起来了,接下就是吃食物了,那吃食物的效果又该如何实现呢?同样,我们要给食物定义一个数据类型,首先就是食物的坐标,其次是食物此刻的状态,是被吃了还是没被吃,状态我们就用bool变量
接着我们回到初始化函数处,给第一个食物的状态设定一下,定义为true,表示被吃了,为何设定为被吃了,等会解释,我们接着编写Createfood(),用来创造食物,就是给食物的坐标附上随机值,随机值就用随机值生成种子,一旦我们创建一个食物,那创建的瞬间,需要将食物的状态改成false,表示未被吃。
那么什么时候生成食物呢,那当然是食物的状态为true表示被吃了的时候,这也是为什么我们要在开头处将食物的状态设置为true,就是为了开局就生成一个食物。同样要用到一个判断语句
食物创建好了,现在就剩下最后一步了,那就是实现吃的过程,就编写个Eatfood(),当蛇头的坐标与食物的坐标重合时就可以吃了,然后食物的状态改为true,蛇的身长加1.
就这样,简易的贪吃蛇就完成了,还有一个绘制食物,这个蛮简单的,各位伙伴自己实现吧。
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 15:37:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |