不理会。
设置一个等待时间,如果超过等待时间仍没有按键,蛇自动前行一步。否则,重新比较
时间。
每次蛇运动或有键子被按下时,判断是否撞到了自身和边界。
如果吃到了一个蛋,更新完蛇的位置后,将原蛇尾的位置加入蛇中。
如果蛇的长度达到了 20(设置的蛇的最大长度),判断后面是否还有关,没有了,就结
束程序,还有,就跳到下一关卡。
② 算法说明
设置两个标记变量,分别记录蛇的长度 ssize 和蛇上次的长度 befor。设置标记变量,
分别记录蛋的横纵座标 xlabel 和 ylabel,设置标记变量,记录蛇的尾部的位置 tailx
和 taily。设置 snake 记录蛇各个部分的位置,设置蛇的最大长度为 20。设置变量 TIME
为等待按键时间。
关卡的选择:程序开始时,从键盘读入一个数字,当作关卡,根据读入的数据,设置等
待时间,也就实现了对蛇的速度的控制。
清屏和显示小蛇和蛋。调用 bios 中断可以实现。每次输出 1 个蛇头,ssize-2 个蛇身,
1 个蛇尾。
下面说一下如何实现小蛇的手工移动(有按键输入时)。可以知道,如果把蛇看成一个
个单元,小蛇每移动一次,它的身体和尾巴的位置都等于它的前一个身体单元的上一步
的位置,因此,可以从尾部进行循环,把前一节的位置给后一节。这样循环 ssize-1 次
就更新了身体和尾巴,再根据输入的按键判断如何如移动头部,如果按键是左或者右,
只需将蛇头的列加减 1,如果按键是上或者下,只需将蛇头的行加减 1。至此,完成了
对蛇的显示位置的更新,之后重新清屏、显示,可以使蛇移动了。
在判断蛇是否向相反方向走时,可以采用如下算法:已知按键了(以向上为例),检查
蛇头和身体第一节的行号,如果蛇头行号大,说明此时设在向下运动,按键无效。
判断蛇撞到边界的算法如下(以向上键为例):判断蛇头此时的行号是否为 0,如果是 0,
又按下了向上键,结束游戏,输出“I AM DEAD!!!”。如果蛇运动过程中撞到了自己,
也同撞到边界的操作。算法是这样的:取出蛇头的位置,依次和每个身体和尾巴的位置
进行比较(从蛇身第三节开始比较),如果相等,说明撞上了,结束游戏。
如何实现蛇的自动移动。可以用 INT 10H 的 1 号功能检测是否有按键输入,如果有,转
到手工移动模块,否则,调用 INT 1AH 中的 00 号功能,读取当前时间。与上次读的时
间相比,如果小于设定的时间,重新比较,否则,蛇自动前移。实现前移的算法与手工
移动相似,也是将身体的某一单元的位置置成塔前一单元上一次的位置,之后判断蛇头
方向。
产生并输出蛋。相当于产生一个随机数,我已经读去了当前时间,可以利用 DX 移位(防
止溢出)以后,对 80 和 25 取余,获得位置的随机数。之后判断蛇的长度 ssize 和 befor,
先让 ssize 为 14,befor 为 13,每产生一个随机数,befor 加 1,每吃一个蛋,ssize
加 1。比较 ssize 和 befor,如果相等,证明蛇没有吃蛋,不用产生新的随机数,仍在
原位置输出随机数,否则,产生新的随机数。
蛇的长度的变化。每次吃到一个蛋后,ssize 加 1,并且将更新前蛇尾的位置加入到 snake,
这样下次输出就能够多输出一个蛇身,实现了长度的增加。
关卡的切换:每当蛇吃了一个蛋以后,判断是否达到了蛇的最大长度 20,如果达到了,
继续判断是否的达到了等待时间的最小值(也就是最高的一关),如果没有达到,就更
新等待时间,进入下一关卡之前,还要将蛇的长度 ssize 和初始长度 befor 分别设为 14
和 13。将记录蛇位置的内存 snake 的前 14 个字更新到屏幕中央。之后,就可以进入下