基于排序二叉树的简单游戏
游戏描述
打外星人游戏。外星人坐标记录在排序二叉树上。游戏要求输入想要开炮的横纵坐标,以判断能否击中飞机。如果在10发炮弹限制之内可以击中飞机,则赢。如果不能,失败(外星人步步逼近,最终侵略地球)。游戏过程中,将显示一些信息(如炮弹数目),游戏结束之后也会显示输赢情况。
文件结构
游戏界面设计
- 大体上分为3个div:"title"/"stage"/"pannel"/,分别对应游戏标题、游戏界面、游戏输入输出控制区域。
- stage为游戏界面,position:relative。游戏主体飞机、外星人、炮弹都在这个div中,且position:absolute。处理相应坐标top/left。
- 坐标处理考虑图片本身的像素数,简单的计算。
- 为了使界面居中,对class="center"的选择器添加规则。具体的width在具体选择器中再进行设置:margin-left: auto;margin-right:auto;
游戏逻辑实现
一些知识点
- querySelector():Selector API Leve1核心的两个方法之一。可以通过Document或者Element实例调用它们。querySelector()接收一个CSS选择器,返回第一个匹配的元素,如果没有则返回null。详情见《JavaScript高级程序设计》第十一章 DOM扩展部分。
- addEventListener()/removeEventListener():DOM2级事件处理,见《JS高程》第十三章。
- Math.random()方法可生成0到1的伪随机数;Math.floor()方法向下取整。
外星人坐标的处理
- 设计三个变量处理外星人的坐标
- binaryTree对象:排序二叉树的实例。
- nodesForAlien数组:数组中每个元素是一个对象存储:key, selected属性。其中selected用于表示当前外星人横坐标是否选中,以表示当前显示的外星人位置横坐标,默认为false。
- keys数组:用于存储nodesForAlien的对应坐标信息。以便于随机选取外星人的坐标(总共有20个)。
- 生成排序二叉树的过程:Math.random()任意生成横坐标数值key;调用binaryTree.insert(key)将其插入到排序二叉树中,与此同时将该值push给nodesForAlien和keys数组。为了使二叉树节点结构和nodesForAlien的基本一致,调用preOrderTraverse(callback)方法遍历二叉树,并创建callback()函数处理得到的节点,为每个节点增加selected属性,默认值为false。
- 生成第一个外星人的位置:在0到20间选取默认值,通过binaryTree.search(keys[索引]).selected=true;将节点标记为已选择,同时nodesForAlien相应位置也该标记为已选择。接下来改变外星人的位置的操作基本相同,但要记得将已选择状态切换为未选择。
函数
-
clickHandler()/keydownHandler()分别对应click和keydown事件。二者在按下按钮和输入回车的时候触发。调用validateInput()函数。
-
validateInput()函数:验证输入是否合法,即必须是数字且输入坐标不能大于500。若不合法,重新输入;合法,调用playgame()函数。
-
playgame()函数:顾名思义。
- 监测当前状态并进行处理(改变或者判断):
1.剩余子弹数:shotsRemaining
2.已用子弹数:shotsUsed;
3.游戏状态gameState:一条综合上述两个信息的字符串。
4.用户输入坐标X、Y;游戏状态 - 用户输入坐标的逻辑处理
1.赋给guessX和guessY
2.在二叉树上查询guessX
a.若存在,且该节点被选中,且guessY在适当坐标范围内。则游戏胜利。gameWon=true。进入函数endGame()函数
b. 若没有击中,且子弹数shotsRemaining耗尽,则游戏失败,进入endGame()函数。
c. 否则,继续游戏。 - 继续游戏的逻辑:
- 改变外星人的坐标值:设外星人有10个候选横坐标在树中,任意选中一个。并适当改变其y坐标,使其接近“地球”。
- 调用render()函数:重新绘制游戏界面。
- 当然,可以考虑在控制台输出外星人坐标。
- 监测当前状态并进行处理(改变或者判断):
-
render()函数:调用以绘制界面:
1.游戏进行中:改变外星人、大炮、炮弹的位置。
2.游戏胜利:外星人图标改成爆炸图标。外星人、炮弹不可见。
3.注意到:render()必然会运行,因为不在if-else中。且endGame()执行完毕后会有返回的操作。 -
endGame()函数:
1.显示游戏结果:胜利、失败。
2.移除事件监听程序。
3.按钮和输入栏不可用。
链接
GitHub:基于二叉树的小游戏