相信大多数朋友写出贪食蛇游戏没有太大的困难,但若要实现蛇自动吃豆的功能,就要花一番心思了。
本人自动游戏的第一个版本中有两个明显的错误会导致蛇进入死胡同,或者不能从死胡同中走出来。
下面先介绍下实现的思路,
这是程序的整体架构:
这个程序既可以手动也可以切换为自动
其中frmGame是游戏的主窗口,在窗口初始化时,将窗口中填满lbls:List<List<Label>>的控件数组,若要显示蛇和豆,只需要将相应位置上的Label控件的Enable属性设为true,其它的设为false,就可以达到显示的作用。这种方式以内存的消耗换取了显示上的简单。
ControlSnake是控制蛇的类,在其中包括游戏场地的宽Width、高Height,豆的位置Target,蛇的身体snakes:List<Point>,蛇的方向:Direction,以及游戏的状态GameState。包括的方法有:游戏初始化,判断蛇是否撞到自己或者撞到墙
AutoPlay类实现的功能就是蛇的自动游戏。实现自动吃豆的方式为:
1.先判断蛇的前面有没有墙或者自己,若都没有,接下来就进行吃豆的动作,就是往豆的方向的走
2.若有墙或者自己,则进行避开操作AvoidDead(),所谓避开就是在蛇的方向转向,而在转向时可能进入死胡同。而为了防止其进入死胡同,这个程序中暂时采用的方式是分别求出蛇左右两边被蛇身体和墙围起来的空格数,而蛇就往空格数多的那一边走
在进行下一步说明前,请大家先看两段视频,这是在游戏中出现的问题
第一个问题
第二个问题
第一个问题,就是在于没有考虑到蛇在往前走的时候也有可能进入死胡同,改进的方法就是,在蛇往前每走一步时,就加判断前面是否是死胡同的代码,如果是则转向
第二个问题,我只有实现的大概方法:当蛇进入吃不到豆的情况后,就换一种行走的方法(我们在手动游戏时,很容易想到用这种方法来走)。但用程序实现就要考虑一些问题,一是何时采用特殊的走法,二是当采用这种特殊走法时何时退出这种特殊状态,三是怎么在程序中描述这种走法
相信,如果把第二个问题解决了,蛇可以变得更长些,但随着蛇长度的增加,后面肯定会遇到新的问题,希望和大家一起让这个蛇变更长!!
这是我程序的源码,VS08版本 贪食蛇.rar