二 游戏编程起步
1.一个简单的游戏-贪吃蛇
1.贪吃蛇游戏剖析
1)游戏的目标。在不被撞死的前提下,吃掉奖子增加自己的长度,来完成升级。
2)游戏中的物体。蛇,墙壁,奖子。
3)动作。蛇移动,蛇吃奖子,蛇增加长度。
2.数据结构与算法分析
1)数据结构。简单起见,所有物体都用方块拼接。
则蛇可以使用一个一维数组描述,数组的每个单元描述了蛇块的状态,如方向;可使用一个二维数组来描述地面情况,不可通过的地方为墙壁设置为1,可通过的地方设置为0;奖子,就是一个特殊的方块。
2)算法。
注意观察蛇的特点。将蛇肢解为方块,则会发现每个方块的移动都依赖于它前面方块上一次的移动状态(第一个方块由玩家控制)。
如图,1是蛇头,4是尾,蓝色箭头是原来移动方向,红色箭头是玩家控制的方向(按了下键)。移动方向从1~4。(a)->(b) 下右右右,(b)->(c)下下右右。
根据这个规律,我们可以总结出一个基本算法:用数组来存贮蛇块,每个蛇块结点包含的信息有当前的移动方向,那么更新蛇的状态时,从尾部到头部进行处理。
for i=n-1 to 1
{
dir(i) = dir(i-1)
pos(i) += dir(i)
}
if dirKeyDown
{
dir(0) = k
}
pos(0) += dir(0)
这样,最复杂的部分就解决了。当然这不是最好的算法,如果我们再仔细观察下,就会发现这样的规律,蛇每次移动的时候,都只是头和尾发生了变化,那么,每次更新蛇的时候,我们只需要将尾部的蛇块移到头部相应的位置,不就更简单吗?答案是肯定的。这就是算法的魅力!只要我们勤于动脑筋,总会发现一些更好的解决办法。
pos(n-1) = pos(0)+dir
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的部分涂成绿色,这将会是一个什么样的效果呢?看下图:
怎么样,有贪吃蛇游戏的感觉吗?再看看下图:
简直是完美!