没有合适的资源?快使用搜索试试~ 我知道了~
C语言贪食蛇总结(附源代码).doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 171 浏览量
2022-07-02
16:09:28
上传
评论
收藏 145KB DOC 举报
温馨提示
试读
17页
C语言贪食蛇总结(附源代码)
资源推荐
资源详情
资源评论
C 语言贪食蛇总结(附源代码)
用 C 写贪食蛇,或许是个很无聊的事情,但我觉得这个过程相当有趣。之所以写
出这个游戏,只是我看腻了那种“请输入 XXXXX,按回车结束”的交互方式,所以想
试一试能否在 WIN32 控制台写一个动画,实现更加人性化的操作,这种想法源于某个
中午午睡。
在本过程中,除了三个函数(gotoxy、Sleep、kbhit)由网上获得之外,其他均由
个人编写。接下来,我将一步步分析该过程。
用 C 语言在 WIN32 控制台写贪食蛇,首先需要解决三个问题:
1、如何在 WIN32 控制台表现动画;
2、如何无阻塞的接收用户的按键值;
3、如何实现贪食蛇游戏的算法;
接下来,将围绕这三个问题,开始写代码。
1、关于动画的实现
动画的实现,要求将“帧数”这个引入到游戏中来,也就是每秒要播放多少个图片,
其实更明了的说,就是一秒要循环某个函数多少次。既然要在循环中控制好每秒的次数,
那么久需要一个让程序暂停(挂起)的函数,从互联网搜索可知,Sleep()函数即是所需
函数,括号内的参数为正整数毫秒(即 1000 代表一秒)。
而动画的实现,并不简单。我当初设想了一种算法,但很快我就发现问题:画面会
闪烁,通过后来研究,发现了问题所在。比如我假定我一秒输出一个画面,那么第一秒,
我输出了画面 A,第二秒我要输出与画面 A 完全不同的画面 B,我需要做什么?需要
的是把整一页的画面 A 清除掉,然后再输出画面 B。而之前学过的许多函数,只能从
上而下一行一行的输出,更主要的是,如果输出超过 25 行,光标会一直处在下方。这
样,就会导致画面的闪烁问题,所以我现在需要的是,输出完毕之后,光标回到第一行
开头。很明显,这已经超出我所学的知识能能解决的了,于是我便在网上找了另一个函
数 gotoxy(),该函数的参数为 X,Y,如果 XY 分别为 0,那么将回到 WIN32 控制台第一
行的开头。
这样,动画的问题就解决了。
2、关于接受用户按键值的函数
在之前的学习当中,所有学到的获取用户值的函数都是阻塞函数,也就是说必须在
用户输入完命令之后,按回车,我们才可以得到某个值,在本游戏中,这是不允许的。
我们必须在时时刻刻接受用户的值,然后计算出下一步要做的东西,而不能等待用户按
回车。通过查找,kbhit 即所需函数,同时还要配合 getch,将缓冲区的键值消除。
3、如何实现贪食蛇的算法
前面两个只是解决了最基本的问题,但对我来说,已经成功一半了。另一半就是,
如何把贪食蛇游戏原原本本的还原。
首先,在面向算法的 C 语言中,我要引入对象的概念。这有利于游戏的编写。
在游戏中,我定义了三个对象:画布,蛇,食物。这三个有所不同,但是都有一个
共同的属性:坐标值。
首先关于画布,是一个 char 字符型的二维数组 char arr[Y][X]。一维表示 Y 坐标,
二维表示 X 坐标。所谓画布,就是可以在上面画东西,该数组的初始值全部为空格。
画布在这里面是个很重要的概念,我们在整个过程中,说白了就只是不断修改画布内容
并且输出画布而已,而每一个坐标表示一个像素。
蛇是一个 int 整数型的二维数组 int arr[n][2],第一维表示蛇的长度,而第二维有两
个数,二维[0]表示蛇第 n 个部分的 Y 坐标,二维[1]表示蛇第 n 个部分的 X 坐标。n 的
默认值为 1000,表示最大长度。
食物也是一个 int 整数型的数组 int arr[2],但是是一个一维的。Arr[0]、arr[1]分别
表示食物 Y 还有 X 值。
我怎么联系这三者?我利用画布只是为了减少简便。怎么做?每次我获取到用户的
按键值,我处理的只是蛇这个数组,而不用写输出它的代码,我的输出交给一个函数处
理,每次在修改完之后,它会自动把蛇“画到”画布上。而食物也容易,交给计算机处
理:如果没有被吃,就会一直在那里,如果被吃了,那么就会自动随即生成另一位置的
食物,处理的结果也是自动“画到”画布上。最后输出画布,这样,就算完成了一个帧,
以此类推,后面也就不难了。
我现在想要聊一聊,比较详细的贪食蛇算法。
蛇的默认初长度为 3,最大长度为 1000(这就是为什么我定义一维为 1000 的数
组)。我默认的模式是吃一个就长一个长度(长一个像素),0.2 秒就移动一次。很明显,
每 0.2 秒我就需要处理一次蛇数组。这里有两个算法,第一个是我最初的算法,第二个
是后来的算法,下面的算法都是以向右移动为例。
算法 1:
如果仅仅考虑蛇的移动,而不考虑生长的元素,那么最容易的算法就是,每 0.2 秒
修改一次蛇数组且只处理蛇数组的一个一维,这个我用图来表示下。
算法 2:
实际上,考虑到蛇的生长问题,那么算法 1 就会变得很不方便,算法 1 的好处在于
移动的时候只修改一次蛇数组且只处理蛇数组的一个一维,如果蛇生长了一个长度,那
么,对于蛇数组的处理就会变得十分麻烦,因为随着移动的不确定性,那一个一维数组
处是头部就很难确定,就算确定了,在蛇生长之后也很难安排这些数组。因此出现了算
法 2,这一个算法虽然再移动的时候修改了所有有效长度的蛇数组一维,但是在蛇的成
长时的算法却变得很容易,生长的时候,不管怎么移动,我只要加一个一维数组为 4 的
就行了。同样,我用图来表示移动。
这样,算法也就算解决了,其实我还在给游戏做了一个简单的菜单,那个很容易,
所以就不讲述。而其他就是零零碎碎一大堆的修改了。
在这里附上源代码,其实这个源代码有很多可以优化的地方,但由于开学,我也就
没有再进行优化修改,我知道这些代码是质量很差的,因为体积很大,以后也会继续努
剩余16页未读,继续阅读
资源评论
oligaga
- 粉丝: 50
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功