读书人

C#游戏编程:《控制台小游戏系列》之《

发布时间: 2012-10-18 13:46:56 作者: rapoo

C#游戏编程:《控制台小游戏系列》之《六、贪吃蛇实例》

一、游戏分析 1976年,Gremlin平台推出一款经典街机游戏Blockade,则为贪吃蛇的原型,这款简单的小游戏很受欢迎,给80后这代人带来不可磨灭的记忆。作为未来程序员的我们,玩自己设计出的贪吃蛇比玩现有的更加有趣,我们可以添加我们所想到的各种特征,即使游戏多么另类都不觉得奇怪,我的游戏我做主! 贪吃蛇的设计并不复杂,是很多游戏编程爱好者入门的首选项目之一,老衲也一样。整观这个游戏,屏蔽掉其他花俏的特征,让我们把焦点放到这个游戏的两个主要对象上:蛇和食物。玩过这款小游戏的人(难道有人没玩过的?)都知道,为了让自己的小蛇疯狂生长,就必须东西南北寻找食物来吃,前提是不要碰上障碍物,否则蛇就挂了。蛇由玩家通过键盘方向键来控制爬行方向,而食物在蛇视野范围内随机生成,当蛇吃掉食物之后,蛇长一节,食物再次随机生成,当然,食物不会落到蛇身上,否则蛇也只好自断了结了。 通过上述,我们不难发现玩家的主要操作是控制蛇的爬行,对于蛇对象来说,它的特征就是会爬能爬,所以如何设计蛇的爬行并且如何反馈到画面上就是我们现在需要考虑的地方。蛇的爬行方法多种多样,但在这之前,我们还必须考虑蛇的表示方法,如何用数据结构表达一条蛇? ■或许可以想到用线性表来存储蛇的各个节点,当蛇移动时遍厉每个节点,更新为对应爬行方向之后的新值,这样每次蛇移动一步,则动全身:所有节点都要访问一次,可以看出最后的效率一定不会太高; ■或许可以想到用线性表来存储蛇的各个节点,当蛇移动时根据爬行方向把新的坐标节点添加到线性表中,然后把相对的“蛇尾”节点删除,最后遍历每个节点,调整各个节点在线形表的位置,防止线形表前后出现空缺的问题。这个方法还是避免不了要动全身,效率也不高。
■或许可以想到用链表来存储蛇的各个节点,当蛇移动时只需要操作链头链尾指针,其他节点无须逐一访问,效率相对前面两种来说提升不少。
然而在C#中,我们没必要考虑这么多,List<>就能很好的解决这个问题了,用List<>表达一条蛇,当蛇爬行的时候插入一个新节点,而删除相对尾端的尾节点,从而实现蛇的爬行效果;当蛇吃到食物时,只管往里添新节点即可,无须删除旧节点操作,这样蛇的身体就会生长一节。对于如何渲染蛇到画面上也是同样的思路(或许这是因为我们的蛇每个节点都是相同样式的情况),我们没有必要遍历每个节点然后把它们逐个渲染到画面上,而是采取“画头擦尾”的方式,只画改变的节点,不变的节点不需要考虑,从而使游戏性能大大提升,即使蛇的节点几千几万个,最终需要考虑的只有前后两个节点,蛇爬行起来腰不累了,吃嘛嘛香!以下用图来表达这种思想:C#游戏编程:《控制台小游戏系列》之《6、贪吃蛇实例》

二、游戏实现 根据上面的分析,我们很清晰的知道我们这个游戏主要的对象是什么了,万事开头难,分析清楚以后我们就很容易实现我们所需要的东西了,首先来看蛇类的实现。 ///Snake类实现
using System;using CEngine;using CGraphics;namespace Snake{    /// <summary>    /// 食物类    /// </summary>    internal class Food    {        /// <summary>        /// 位置        /// </summary>        private CPoint m_position;        /// <summary>        /// 构造函数        /// </summary>        public Food()        {                   }        public Food(CPoint point)        {            this.m_position = point;        }        /// <summary>        /// 获取位置        /// </summary>        /// <returns></returns>        public CPoint getPosition()        {            return this.m_position;        }        /// <summary>        /// 设置位置        /// </summary>        /// <param name="point"></param>        public void setPosition(CPoint point)        {            this.m_position = point;        }        /// <summary>        /// 设置位置        /// </summary>        /// <param name="x"></param>        /// <param name="y"></param>        public void setPosition(Int32 x, Int32 y)        {            this.m_position = new CPoint(x,y);        }        /// <summary>        /// 绘制食物        /// </summary>        /// <param name="draw"></param>        public void draw(CDraw draw)        {            draw.setDrawSymbol(CSymbol.RING_SOLID);            draw.drawRect(m_position.getX(), m_position.getY(), 1,1,ConsoleColor.Green);        }    }}
接下来是处理游戏逻辑,也就是实现这个游戏的控制类,这个类继承我们的游戏框架类,拥有框架提供的各种功能,从而对游戏实行控制和渲染,实现如下: ///SnakeGame类实现:

C#游戏编程:《控制台小游戏系列》之《6、贪吃蛇实例》
C#游戏编程:《控制台小游戏系列》之《6、贪吃蛇实例》
试玩链接:http://download.csdn.net/detail/hwenycocodq520/4630382

三、结语 终于完成了这个DEMO,如果读者也制作了贪吃蛇,不防给个链接,让我们娱乐娱乐!
2楼chb3455366382小时前
前排占座学习。
1楼conmajia昨天 22:43
前排占座学习。

读书人网 >编程

热点推荐