00:01
好,那经过我们的努力呢,这个小蛇蛇呢,已经可以动起来了啊,可以动起来了,剩下左右的去移动了,但是现在呢,还有一个问题就是我们这个蛇呀,它有点太灵活了,哎,它甚至可以干嘛呢,可以去穿墙出穿墙啊穿墙,你这是这个游戏很有意思是吧,这个蛇还能四处的去去乱跑,那我们现在呢,下边一个事儿的话,我们有这么几个事儿,比较明显的两件事儿,一个是穿墙的问题,一个是我们这个蛇吃到。食物的问题,诶吃到食物我们要怎么去处理,我们先处理谁呢?先处理这个穿墙的问题啊,穿墙的问题,穿墙的问题其实也好处理,穿墙问题的话,实际上就是限制我们蛇的一个移动的一个位置,它有一个极限,比如说你往上移,移到这儿你就不能再动了,往下移的话,你移到这儿就不能再动了,左边也就是这,右边呢,也就是这儿,那这个距距离的话,跟我们之前算那个实物的位置是一样的,最左边是零,上边也是零,然后这边是290,这是不是也是二百九啊,这个距离上限我们之前都聊过这个事儿了,所以这里边我们要解决这个问题的话,我们就是限制这个蛇的一个移动,限制蛇的移动的话,我们可以在这个game ctrl中来处理啊,直接在这里面写个方法去处理可以,但是呢。
01:20
我觉得这个蛇撞墙这个东西,呃,从这个道理上讲,从我们这个原则上来讲,蛇撞墙应该是蛇自己去死了,是蛇自己的问题,所以这个时候我们在设计这个类的时候一定注意,就是尽量谁的事儿让谁去处理,蛇撞墙那主要是蛇的事儿,那这个事儿最好让蛇自己去处理啊,所以这个验证呢,我更倾向于放到蛇里啊,放到蛇这个类里去进行,所以我们回到蛇这个类啊,那点TX,我们在修改蛇的位置的时候,我们调用的是这个sat X啊,诶在修改这个蛇这个还有这个set y set X是修改我们这个水平坐,这个水平坐标,Set y呢是修改我们这个垂直坐标,我们先看一个问题,实际上我们蛇在移动的时候,你看啊,我们蛇在移动的时候,我们这个游戏它是一个四个方向的,也就是我这个蛇,它只能是在什么呢?在。
02:21
四个方向当中,移动,要么往上移动,要么往下移动,要么往左移动,要么往右移动,也就是说我这个蛇它在同一时刻只会修改一个值,要么就是修改X,要么就是修改Y,有没有可能同时修改,没有可能要同时修改,是不是等于斜着去走了,斜着去走才需要同时修改,而我们这个蛇它同时只会往一个方向去走,那我们这儿实际上是为了省事,我们每一次改的话都是同时修改X和Y,但是很显然这样做实际上必要性并不是很大,因为两个东西肯定只有一个变化,所以呢,我这样做一个处理。
03:02
在这里面呢,我在修改之前呀,我对它做一个判断,什么判断呢?我直接来一个if z.X等等于这个Y6,哎,也就是如果X值和这个Y6值是相同的,相同的是不是证明你这个值没有发生变化,没有发生变化我就直接return干什么呢?什么也不做了啊,什么也不做了,同样在Y这的话,我们直接来一个if z.Y等等于Y,我也是直接return,那这样的效果跟我们刚才是一样的,但是呢,好处就是其实在这个值不发生变化的时候,我们少改了一个属性啊,这里面注意,如果新值和这个旧值相同,相同则什么呢?则直接返回不再修改,不再修改,没有必要再去改了啊,没有必要再去改了,下边这个东西也是一样啊,也是一样,我就不改了,然后再往下判断,那下边到这儿为止,那是不是就正。
04:03
证明我们这个,诶,新值和旧值不一样了,那么不一样了,那接下来我们就要判断一下他是否撞墙,实际上我们所谓的是否撞墙的就是我们这个X值的这个合法范围,合法范围是多少,合法范围就是零到290之间,所以这个时候我们要检查的是就是我们这个X值有没有超出这个范围,Y6值啊,主要说的Y6值,Y6值如果超出了这个范围,那证明你撞墙了,一定撞墙了,如果没超是不是就没撞墙,所以在这我们直接做一个判断,If一个我们来一个Y6 Y6干嘛呢,等于。诶,别等等于啊,小于零,或者我们这个Y6大于290,如果Y6等小于零,那是不是等于左边出墙了,大于二百九是不是证明右边出墙了,无论你哪边超过范围了,只能说明一件事,就是你这个值。
05:05
有问题啊,值不对了,撞墙了,所以进入判断,进入判断说明我们这个蛇干嘛呢?撞墙了,蛇撞墙了,那蛇撞墙了,我这要怎么去处理呢?怎么去处理呢?哎,那这里边其实我们说了,蛇撞墙了,蛇就完蛋了啊,蛇就完蛋了,但是蛇就完蛋,蛇是不是就死了,蛇就死了,蛇就死了,但是蛇死这个消息我们实际上得传给谁,是不是得传给我们的game CR啊,我得让我的游戏的控制器game知道蛇撞墙了,蛇也就完了,蛇完了游戏是不是就结束了,那我怎么通知他游戏结束了呢?这里边其实我们最简单的一种方式,我直接在这儿来一个死肉,我来一个拗,一个error干嘛呢?我在这儿抛出一个错误,叫什么呢?蛇撞墙了。蛇撞墙了,同样在我们下边这个Y值,这我们也加这一个判断,判断我们这个Y值是否合法,如果Y值Y的值小于零,大于290,是不是也说明蛇撞墙了,在这儿蛇一撞墙我就抛出一个错误,那这会是一个什么效果,我们来看一下啊,蛇一撞墙,我这就抛出异常,抛出异常在我们G里任何语言里都一样,只要这一抛出异常,我们这个程序就报错,程序报错它就停了,我们看效果啊,这你看正常走没问题啊,往左走撞墙去看是不报错了,蛇撞墙了,这是往左走,哎左边撞墙来还是移动,我往上撞墙是不是蛇就撞墙了,哎,又报错了,一刷新在这儿往下走,一样的效果啊,一样的效果,往下走也是触发这个错误啊,也是触发错误,我就测一下就完事了啊,这太远了。
06:52
是不是也是蛇状墙了右我就不测了啊,也不也就不测了,它是一样的效果啊,一样的效果,所以这里面回到这儿,我们在这儿的处理方式,就是当我们这个蛇撞墙了,我们就抛出一个什么呢?哎,抛出一个这个异常,抛出一个异常,那你说老师你这抛这异常游戏就完了,这不好啊,我们有错的时候,我们是不是应该,比如说蛇撞墙了,我们在这儿是不是应该给用户一个友好的提示啊,哎,告诉你撞墙了游戏就结束了,你就你就别玩了,是不是就行了呀,而不是说我们在这儿直接给他抛一个错误,很生硬,那其实这也简单,这不是抛异常了吗?抛异常我们是不是在调这个set X,是不是这两行代码出的错误呀,所以在我们game这,我们最简单,我们直接对这进行踹。
07:44
Try catch,诶对这个异常进行捕获,那我们说如果我的这个代码正常执行没有错误,没有错误,那是不是就不会进入到catch,不会进入到catch,它是不是正常往后走了,那如果进入到catchche了,进入到这个catch。
08:04
诶,那说明什么,说明出现了什么呢?出现了我们这个异常,出现了异常也就是实际上就是游戏结束啊,游戏结束,游戏结束怎么办?我们直接来弹出一个什么呢?哎,弹出一个提示信息来一个,我们直接在这儿alert一个什么呢?哎1.1个message干嘛呀,我把这消息弹出来给用户一个提示。同时游戏结束我们要将那个a live设置,为什么呢?设置为我们先不设置看效果啊,不设置看效果,这直接刷新一下。现在的话,我们的异常就不会出来了,因为我们在那个game control对这个异常进行了一个捕获啊,进行了捕获,那这一块知识如果你不理解的话,回顾一下,自己看一下这个GS异常捕获那块,这个是纯GS跟TSTS,它是支持有写法的,可以把这个异常这块再看一下,移动看啊往上走。
09:03
是不是蛇撞墙了,哎,就告诉你了,哎,蛇撞墙了,但是你会发现它会一直给你提示蛇撞墙了,那就证明这个蛇实际上还在一直去移动,为什么?就是因为刚才为什么停,刚才为什么停,因为抛出异常我没有处理,没有处理,抛出异常没有处理,那我们程序就整个停了,就不会再运行了,但是我们当加了这个try catch以后,这抛出异常了,我们是不是把异常捕货了,异常捕货以后,它不会导致我们程序的终止,所以蛇实际上还在继续跑,继续跑,所以我们这除了我们要把这个把这个这个错误消息打印出来以外,我们还应该把这个Z点一个改成一个什么呢?Force把这个标志设成false,告诉你我这个游戏结束了,诶你就干嘛了,你就别再去运行了,那这样的话就避免出现这个问题啊,我们等一下我们再看看它的效果啊,小看效果。快一点快一点,快一点好慢是吧,来我点一下它OK,我们来运行一下,这时候再往上走,你看蛇撞墙了,你确定蛇是不是就不动了,往下走诶动不了了,对吧,我得重新刷新一下,重新开始一下,往左走,蛇撞墙了一点是不是就结束了,哎,这就齐了,那现在等于我们这个碰撞的检测的话,也就有了,我在这儿可以再加一个信息,加一个什么呢。
10:24
拼个串吧,来一个gameoverover告诉你游戏结束了,你就别等了,是吧,你的水平呢,就到这儿了啊,就到这儿了,然后的话这么一个效果,我们用异常处理的一个好处什么呢?异常的处理的一个好处,现在看蛇撞墙了,Game overver游戏结束,我们用这种异常处理的方式,好处就是以待会儿我们再有其他的哎,比如说蛇可能撞到自己了啊这些错误的时候,那这个时候我们就不用再去加新的判断了,在这个game CR里,我们只需要一个捕获就可以把它所有的所有的游戏结束情况全都处理了,这的代码就等于其实就进行了一个简化啊,进行了简化异常那种处理的话,在我们GS,就是之前那种老版本的GS,我们用的时候,其实我们GS里边不是特别习惯用这个,但是的话,其实你真的用到这个的话,你会发现真的真的真的是特别的好用啊,特别好用,所以关于这个TRYK这块如果不明白,可以看一下查一下。
11:24
资料诶这个拆开是到底怎么回事,好好的去学习学习啊学习好,那现在我们这个蛇的这个撞墙的检测呢,我们也就做完了,也就做完了,然后的话我们再多说一点,把撞墙处理完了以后,还有一个问题,就是我们这个蛇的这个吃食物的问题。蛇呢,吃到食物,蛇也动了,它吃到食物了,吃到食物了以后,我们这是不是要做一个这个处理啊,哎,做一个处理,所以这里边呢,我们在做一件事儿干什么呢?哎,我们在这儿蛇的这个就是我们这个位置算完了以后呢,我们在这儿要做一件事,我要检查什么呢?检查这个蛇。
12:04
检查这个蛇是否吃到了食物啊,检查蛇是否吃到食物,怎么查呀?哎,我们来定一个。方法定义一个方法,用来检查这个蛇是否吃到这个食物,这个东西就不往蛇里整了,因为我们刚才刚才那个撞墙,那个为什么放到蛇里,因为那个只涉及到蛇墙的话,我们只是一个位置,而我们检查蛇是否知道食物,涉及到两个东西,一个是蛇,还有一个是食物,那我们只有一个地方能看,同时看到蛇还有食物,那就是在这个game game control啊,Game control,所以在这里边的话,我们也简单,我们直接来一个。哎,来一个check一个eat,检查它吃没吃到,干什么玩意儿呢,在这里面呀,我传一个X坐标,传一个Y坐标,这是什么?这个是我们这个新坐标,它的类型呢,是一个number。
13:03
类型是一个number,类型是一个number啊,那这是我们蛇的新坐标啊,蛇的新坐标,那这个时候什么时候就吃到食物了,如果蛇的新的坐标和我们这个食物的坐标它重合了一样了,那是不是就证明吃到食物了,哎,就证明吃到食物了,所以在这里边我们直接直接return return什么呢?既然我要检查吃没吃到,我当然要返回一个布尔值了,If X等等于再点一个负的点一个GA,点一个X,同时Y等等于Z是点一个负的,点一个Y,诶。两个坐标都一样了,证明吃到食物了,在这儿我就可以直接调它做一个判断,这次点一个check X呢我就传XY呢我就传位,如果这个是true true就证明吃到了,吃到了我先简单的打印一下cancel,点烙一个诶,吃到食物了,吃到食物了。
14:03
然后在这儿我们一保存看效果,稍微等一下,正在重新的去,哎,重新的编译。那现在呢,我们来执行一下。找这食物,诶走诶吃,是不是吃到食物了,回去接着吃。是不是又吃到食物了,再往下接着吃又吃到食物了,再往上是不是又吃到食物了,也就是现在我就已经可以做到这个事儿了,就可以能判断出这个食物到底有没有去吃到啊,有没有吃到好食物呢?已经吃到了食物,吃没吃到的判断我们已经知道了,那现在进入判断,那证明我吃到食物了,那吃到食物了,我这是不是应该还有一个逻辑啊,哎,那我当我吃到食物以后,我应该干什么?哎,那当我吃到食物以后,我需要做这么几件事儿,首先吃到食物以后,我们这个食物的位置要进行重置,你这吃完了食物的位置不应该变了,直接来一个Z点负的,我们方法已经定义好了,点一个change,改变一下位置啊改变一下位置,然后第二件事儿,我们这个分数是不是要增加呀?哎,分数我们要增加啊,分数要增加,分数增加我们就直接来一个Z,点一个score pan点一个这个score,诶点一个叫什么呀,我们有一个score,诶叫做一个爱的score加一份啊,分数增加,然后下一个是我们这个蛇是不是要增加一节,诶要增加一截,增加一截呢,也整好了,找蛇呗,Z次点一个snake,点一个呃,A的一个body就激活了,所以你会发现这个就是我们这个面向对象的好处,有了面向对,有了类,有了对象以后,我们就是用谁就找谁,我要改变实物的位置去找实物里,钢管我要去加分去找里。
15:48
方法,我要给蛇的身体增加一截,我去找蛇的方法就OK了啊,那这里边啊,我想处理,我不想这么写了,这么写感觉有点有点奇怪了是吧,所以这个检查这个蛇吃没吃到食物啊,我直接全都放在里面,直接全都放这个check it里面,在这儿呢,我直接判断,如果它是处,我就把这些代码直接写这儿了,这样的话,我这代码啊,这就变得更整洁了,我这就可以直接调一下这个E的所有的核心逻辑都在这里边写着,我以后维护起来就好维护了,对吧,所以你看啊,这东西分的越细,我们以后维护起来就会越越方便啊,越越方便,好,那现在我们这都处理完了,看看能不能实现我们这个效果。
16:30
哎,应该能看到什么,首先我吃到食物以后,我这个食物应该会改变位置,第一点第二点,哎,那我这分数会增加一份,第三点我这蛇会增加一截来直接执行。这下。走你诶看到了蛇,这是不是增加一节啊,然后这分数是不是增加一分啊,食物的位置是不是也变了,你说老师这节怎么增加这了,这是我们下边要解决问题,现在我们的逻辑没问题就OK了啊来接着来移动来吃到这个食物。
17:00
诶,又吃到了二分了啊,然后现在是三分了,哎呀跑那儿去了,你看这个挺有意思,为什么现在是这种情况,因为我们只设置了什么呀,只设置了舌头的移动,没有设置身体的移动,所以身体现在是不动的啊,这是我们待会儿要处理问题,我们现在要看的是什么,当我吃到十分以后,我的level应该变成二级,并且我蛇的速度移动的速度应该会变快,我们看看会不会有这种情况。这是八分了,哎呀,这玩意儿实在是太慢了啊,实在是太慢了,来这儿再移动一个,这是九分,哎呀。刷新到同一位十分,看level是不是变成二了,诶level变成二了,那证明我们之前现在完成的逻辑就都没问题了啊,都没问题了,好,那现在的话,我们就已经完成了这个蛇的一个,诶,这个撞墙的一个检测,还有蛇是否吃到食物的一个检测,诶那其实你会发现,其实当我们把类都设计好了以后,再写这儿的话,其实真的是很省事儿,就是用谁就找谁就行了啊,所以之前那些代码你一定要写明白,到这儿的话就会很简单了啊,很简单了,好,我们先停一下,接下来我们要做的事儿就是该是谁了,该是去检查我们这个,诶这个让蛇的身体去移动,这是第一件事儿,第二件事儿我们要去,哎,去检查这个蛇有没有这个撞到自己,还有蛇会不会掉头的问题,这都是我们下边要做的问题啊,好,我们来停一下。
我来说两句