c语言贪食蛇源码,C语言贪食蛇总结(附源代码).doc

C语言贪食蛇总结(附源代码).doc

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的好处在于移动的时候只修改一次蛇数组且只处理蛇数组的一个一维,如果蛇生长了一个长度,那么,对于蛇数组的处理就会变得十分麻烦,因为随着移动的不确定性,那一个一维数组处是头部就很难确定,就算确定了,在蛇生长之后也很难安排这些数组。因此出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值