二 游戏编程起步


1.一个简单的游戏-贪吃蛇


1.贪吃蛇游戏剖析

1)游戏的目标。在不被撞死的前提下,吃掉奖子增加自己的长度,来完成升级。

2)游戏中的物体。蛇,墙壁,奖子。

3)动作。蛇移动,蛇吃奖子,蛇增加长度。

2.数据结构与算法分析

1)数据结构。简单起见,所有物体都用方块拼接。

        则蛇可以使用一个一维数组描述,数组的每个单元描述了蛇块的状态,如方向;可使用一个二维数组来描述地面情况,不可通过的地方为墙壁设置为1,可通过的地方设置为0;奖子,就是一个特殊的方块。

2)算法。

        注意观察蛇的特点。将蛇肢解为方块,则会发现每个方块的移动都依赖于它前面方块上一次的移动状态(第一个方块由玩家控制)。


        如图,1是蛇头,4是尾,蓝色箭头是原来移动方向,红色箭头是玩家控制的方向(按了下键)。移动方向从1~4。(a)->(b) 下右右右,(b)->(c)下下右右。

        根据这个规律,我们可以总结出一个基本算法:用数组来存贮蛇块,每个蛇块结点包含的信息有当前的移动方向,那么更新蛇的状态时,从尾部到头部进行处理。


[cpp] view plain copy

  1. for i=n-1 to 1  

  2. {  

  3. dir(i) = dir(i-1)  

  4. pos(i) += dir(i)  

  5. }  

  6. if dirKeyDown  

  7. {  

  8. dir(0) = k  

  9. }  

  10. pos(0) += dir(0)  




        这样,最复杂的部分就解决了。当然这不是最好的算法,如果我们再仔细观察下,就会发现这样的规律,蛇每次移动的时候,都只是头和尾发生了变化,那么,每次更新蛇的时候,我们只需要将尾部的蛇块移到头部相应的位置,不就更简单吗?答案是肯定的。这就是算法的魅力!只要我们勤于动脑筋,总会发现一些更好的解决办法。


[cpp] view plain copy

  1. pos(n-1) = pos(0)+dir  

  2. insert(n-1) before pos(0)  




        算法的复杂度立即从O(n)变到了O(1)!而且我们还会发现,我们只需要记录一个方向就可以了,则空间复杂度也因此降低了。


3)地图。描述了地面信息。

        我们的贪吃蛇游戏地图信息很简单,总共有3类物体会站到地面上:墙壁,蛇,奖子。在每次更新的时候,我们将3类物体的信息按类别填充到地图中。如,墙壁的位置填1,奖子的位置填2,蛇的位置填3(每个蛇块都填),没有东西的地方填0。然后,将这个填满0,1,2,3的二维数组,交给渲染系统。

         到此,我们的幕后操作就算基本完成,剩下的就是些细节,等到编码的时候在详细处理。



3.渲染
地图数据描述

        渲染贪吃蛇游戏其实也很简单,把地图中1的部分涂成蓝色,2的部分涂成红色,3的部分涂成绿色,这将会是一个什么样的效果呢?看下图:


        怎么样,有贪吃蛇游戏的感觉吗?再看看下图:


        简直是完美!