00:00
好,那么接下来呢,我们就来处理这个让蛇这个移动的方法啊,让蛇这个移动,让蛇移动实际上就是什么?让蛇去移动,实际上我们要做的就是根据我们这个方向修改这个,根据这个运动的方向去修改我们这个舌头的位置,运动方向我们已经有了,我把它存到了这点一个direction里边,但是我们这个蛇的这个位置。诶,那怎么去移呀,哎,我们怎么去改变这个蛇的位置,实际上我们要去改变蛇的位置,是不是就是去移动这个元素啊,哎,如果是想干嘛呀,想让它往右移动,我们是不是要把它的life的值给它变大,就往右移了,哎如果想它往下移动,是不是把它top值变大,是不是就往下移动了,所以这个时候我们所谓的移动元素,实际上就是去修改这个蛇的一个偏移量啊,偏移量,所以呢,在这儿我们来添加一个方法,创建一个这个控制我们这个蛇移动的方法,这个哎方法啊方法,这个方法呢,我们就叫做一个run吧,让蛇跑起来啊,叫做一个run run里边的话,我们核心的逻辑就是什么呢?哎,就是根据我们这个方向方向方向的话,也就是我们所谓的这个Z。
01:22
这次direction来使我们这个蛇的位置改变,位置改变那怎么叫位置改变了,我们一共就这么几个方向,哎,向上移动,向下移动,向下移动,向左移动,哎,然后我们这个向右移动,这么几个方向怎么向上走,向上走我们是不是要垂直方向,是不是要修改它的top值啊,哎,向上走,那我们应该是top值干嘛呢,减少。减少,哎,Top值越小,离上边的距离就越近嘛,越近那不就往上走了吗?如果是向下移动,那我们是top值增加啊增加,那向左移动呢,向左移动我们就改life的值了,向左移动那应该是life的值减少,而向右移动那应该就是我们life的值要增加,哎,是不是就是这四种情况,哎,四种情况,所以我们要做的事就是根据这四种情况来做一个判断,那这里的话,我们要判断的话,在润方法里,我们先做一件事儿,我先来干嘛呢?我先来获取蛇现在的坐标,诶现在坐标因为我们要改它嘛,我们先把它的坐标获取到,待会儿我们再根据情况去去改啊,我直接来一个count,我们来一个诶,别别看,呃,这个倒是count的。
02:41
Cost,诶不要不要cost,因为这个值我们要改的对吧?Light一个X等于一个Z,点一个snake,点一个什么呢?点一个X light一个Y等于一个Z,点一个snake,我们点一个Y,这个是我们蛇现在的坐标,然后我们是不是要根据这个方向对这个值进行修改啊,我们说了方向一共是这八种值,八种值四种方式,A row up跟up是一种方式,A row down跟down是一种方式,A left和left是一种方式,A left和RIGHT1种方式,八个值四种方式,那这种情况我们用if else可以,但是最好,其实这最省事的话,我们就直接来一个Switch Switch干嘛呢?根据我们这个Z点一个direction,根据direction的值我们来做处理,一共有几种值,第一种值啊,我把这些值粘过来啊,粘过来这还挺多的。
03:35
转过来第一种情况,如果用户诶如果方向是可row a row up啊case,诶如果方向是a row up,或者呢,方向是up,我们这儿是不是一个处理方式,哎,我先写上break啊,先写break,然后下边的话,我们还有这么几种,我们就上下左右吧,哎上下左右这是一个arrow,当然后呢,跟着一个这个当然后呢,下边一个我再复制啊复制复制再复制啊kiss他。
04:08
格式化一下啊,A row down a row up a row down,然后再来一个a row left,再来一个left是一种情况,然后a row right,还有一个是一种情况,也就是我们在这儿一共给它区分了这么四种情况,这种情况是我们的向上移动这种诶向上移动,向上移动干嘛?向上移动我们是不是要让这个top值减小啊,Top值也就是我们这个Y坐标吧,纵向的嘛,Y坐标也就是让这个Y减小,向上移动我们要top减小,Top减小就是Y减小,Y减小的话,我们就直接来一个Y减等于十,减等于十,为什么要减等于十,因为我们说了,每一次移动我要移动的是一格,一格是多少,一格就是十,正好是我们蛇的这个,蛇的这个大小嘛,蛇跟食物大小是不是都是十啊,所以我移动每一次都是移动十,这主要是依据我们蛇的大小,你说老师我这蛇是100,那你一次就得100。
05:08
我这蛇是1000,那你一次就移1000,我蛇是一,一太小了,但是如果是一的话,那你一次就移动一,根据你的这个蛇的大小来设置这个,这叫什么呀?这这叫就步伐吧,或者说它这个距离啊,移动距离,然后下边一个向下移动,向下移动荡吗?荡属于叫向下移动,向下移动我们这个什么呀?我们这个top值要增加,增加也是一样,我直接来一个Y加等于十啊,给它增加十,然后下边依次是一样的,Life的向左移动,向左移动我们这个是什么呀?Life的值我要减少,减少life的值的话,也就是这个X轴坐标,X轴坐标我们直接X减等于十,然后下边呢,我们向右移动,向右移动我们是X life的增加,哎,向右移动我们life的这个增加,增加的话,我们直接来一个,哎哎哎,还是XX去加等于十,也就是。
06:08
总是去修改时,也就是说现在我们就判断出了我们这个元素的这个移动方向了,根据我们这个不同的方向,我们去修改这个Y值,还有这个X值,那也就是说现在我的这个X值还有Y值的话,就是我新计算出来的坐标,但是这个坐标我只是在这儿进行计算了,我是不是修改的是这个局部变量啊,那我这个修改有没有真正的应用到那个舌上啊,没有应用到那个上,所以这里边我们先写个注释啊,这是什么注释呢?根据我们这个方向,根据我们这个按键的方向来修改我们这个什么呢?修改我们这个,修改我们这个X值和这个Y值啊,Y值,但是现在只是计算这个X值,Y值这东西是不是并没有生效啊?哎,所以在这儿我们在算完了以后,最后直行一圈,这值都算完了,我来修改蛇的什么呢?X和这个Y值。
07:08
这就简单了,直接来一个Z点一个snake,点一个X等于XZ点一个snake点一个Y等于Y,直接对这个值进行修改,那按道理讲,我们这个蛇是不是就该移动起来了啊,移动起来了当然啊,我这个方法还没执行呢,所以在这儿,在哪儿呢?在我们的这个这个这个这个这个这叫什么呀?In it里边我们来调用一下,调用什么呢?调用我们这个run方法啊,Run方法,Run方法。方法是什么呢?使我们这个蛇移动啊,使我们这个蛇移动,那我们这直接来一个什么呢?来一个再点一个RA,我们直接一调用,哎是不是就OK了,哎来看看效果行不行啊,行不行啊,我都不用看,现在的话肯定不动,现在看的话它是肯定不动,百分百是不动的,你看他现在我我这保存,让它重新去重新编译,重新编译也没用,肯定不动,为什么不动呢?因为我们这个s Switch语句,我是不是首先它是。
08:15
只执行一次呀,我这方法我只在in里边我调了一个z.run它只会执行一次,这是第一个,第二一个,它执行的时候是根据这个Z点一个去判断这个方向的,但是一上来的时候,我们这个z.direction它是不是一个空啊,它没有方向,所以它根本就不会动啊,不会动,但是我如果给它一个方向,比如说我就给它一个right right向右走,那这个时候我们再让它重新去运行一下,这个时候我们应该能看到这个蛇会移动,移动,但是只一动一下,它就不会再动了,就不会再动了,看到了吧,诶是不是动了一格,但是就不会再动了,为什么呢?因为这里边我们这个z.run的话,它实际上它现在只调用了一次,诶它只会调用一次,那就只移动一次,诶,那同学说老师你可以这样啊,你别把z.run写这,你把z.run写到哪啊,写到你那个key到handle里,因为keyar handler。你每一。
09:16
这次按下按键,这事件就执行,这事件执行,那是不是等于这个z.run就调用了,那z.run调用了,这蛇不就动起来了吗?行不行行行,但是这么做完了以后啊,这个游戏就会变得异常的无聊,为什么呢?因为这个事件是不是我鼠标按键按一次,它执行一次,那也就是说我鼠标不是鼠标啊,是我键盘按键,我键盘每按一次这个函数这个方法就调用一次,那这个方法调用一次,蛇就移动一次,换句话说,也就是我按键按一下,这个蛇就动一下,你想想可不可笑,我们看看走走走走走是不是动了?哎,我一直按一直动,一直按一直动,一直按一直动,确实能动,但是是不是只有我按的时候它才会动了,不按是不是就不动了?哎,不按就不动了,哎呀,这个事儿实在是有点儿这个。
10:10
太可笑了对吧?太可笑了,那咋整啊,我希望的是这个蛇一开始动起来就不停的动,而不是说我按一下才动一下,所以在这儿我不能在这儿去掉这点,Re,那怎么办?这个东西我还得在这儿掉,我还得在in点这掉,但是问题就是in它掉,它只会调用一次,我怎么让这方法反复去掉,因为它一掉舌苔动,它不掉蛇就不动,但是现在你只调用一次,它是不是就又不行啊,又不行,那怎么办呢?诶看着啊,教你们一招干嘛呢?在这儿啊,我们来开启一个定时的一个调用,我们直接来一个set time out set timeout里边我们直接传一个叫做this.re也就是我把this.run传到这个S里边,让它去调用,然后逗号来一个这个300,那什么意思?也就是我每隔300毫秒去调用一下这个Z点。当然。
11:11
它还有那个问题,什么问题呢?就是我们那个Z次的问题,因为这里边我们是不是也作为函数传进去了,Z次会被改变,所以我们也调一下半,来绑定一下这个this啊,来绑定一下这个this,那这样就可以确保它这个this永远都是我们这个game control这个对象啊,给controltr掉,哎,那这时候同学说老师这啥意思呀,S太帽哎,首先你先看到蛇动起来了,对吧,动起来先不管它动不动,我们现在先说这什么意思,为什么你加上它以后就动起来了,Set out不是叫定时调用吗?为什么这蛇会一直移动吗?Set按理来说应该一次就完事儿了,为什么你这个蛇它会一直在走呢?诶注意啊,注意它是一个什么流程,我在这个一里边掉了一个z.run run方法执行了,Run方法执行了,我这一系列代码是不是叫执行了,哎,执行以后完事了,完事了啊,完事了以后,我这掉了一个。
12:11
Set timeout,也就是我在这设置了一个300毫秒以后,我要再去调用那个函数,调用哪个函数,是不是还是在调用这个函数啊,300毫秒以后掉了,然后这一段又直行,直行完了以后,这是不是又执行啊,诶这又执行,这又直行,然后这是不是又开启了一个定时器啊,也就是我这个run函数执行完了开启一个定时器,执行完了开启一个定时器,执行完了开启一个定时器,那是不是就跟我们那个set in特尔那个效果是一样的了,诶每一次执行就开启一个定时器,每一次执行就开启一个定时器,那等于其实就是我们这个蛇每隔300毫秒是不是就移动一次啊,诶每个三秒毫秒移动一次,你可以给它方向,你给它方向,它是不是就可以去改变方向,蛇就动起来了,诶你说老师这蛇的移动速度实在是太慢了,太慢好办,现在是300毫秒移动一次,注意啊,你不能改这个,你说老师我让他改成100吧,不行,你改100有可能你这食物就吃不着了,我可以把这时间改短300太太太慢。
13:11
啊,我改成30。30毫秒蒸一次,那这速度是不是变得非常的这个快了,哎,非常快了,那这时候你再看这蛇。看到了吗?诶蛇就变得非常的这个快啊,非踌快了,诶你看是不是就有点儿这个贪食蛇的这个感觉了,但是你很明显这个有点啊,有点太快了,太快了以后就会出现一个问题,什么问题啊,就是我们这个东西,它就会这这这这这。玩不下,这也很好的,对吧,但是我们就没有办法去区分那个等级了,那这等级的怎么区分,我再快呢,再快可能该撞墙了,所以这个时候呢,30秒,30毫秒啊,太短了,所以如果说我的设计的话,那就是我的第一集,那就是300毫秒,然后随着我的级越来越高啊,这级别越来越高,我这个时间呢,会越来越短,时间越来越短,这速度是不是越来越快了,所以这个时间这我可以做一个小手脚,什么手脚呢?我直接来一个这个,诶来一个,诶我直接来一个这个300啊300乘以一个什么呢?乘以一个Z点一个game,诶我这个game一个。
14:24
诶,我这不叫game,我叫做一个score score score一个panel,诶我这score panel是没写吗?怎么有个我提示了,我们看一下这点一个score panel有啊记分牌,诶这点一个score panel点一个这个什么呢?点一个level啊点一个level,让它乘以这个level,诶别乘以,我这应该是什么呀?让它减去这个level乘以什么呢?减一。减一,然后乘以一个30,减一乘以一个30啥意思?也就是我现在这个时间,我不是写死的了,它是计算出来的,再点panel.level这是我们当前的等级,最低是一级,然后是二级,然后是三级,然后四级,对吧,然后呢,我一开始是一级一减一等于零,零乘以30是不是还是零啊,所以300减零的话,那就是就是300没有变化,但是当我的等级提高了。
15:29
等级提高了,我等级变成二级了,这点scoreel.level等于二了,二减一是一,那一乘以30是不是就是30了,那300减30 300减30,那是不是就是二百七啊,时间就快了,那如果我的level变成了十,十减一多少呢?十减一得九,九乘以30是270 270 300减270,那是不是就是30啊?诶,那我最高级就是十级,所以我最高速度呢,就是30毫秒,那你说老师我要想让它更快一点,那你自己去算这个值,你可以自己根据自己的需要去设置,在我这儿就分十个级别啊,十个级别好,那当然我们现在在这儿的话是看不出效果来的,因为我们现在这个级别呢,还没有这个,没有这个变化啊,没有这个变化先不管它,我们先写上,待会儿根据需要我们再去找啊,再去找,然后呢,现在我们这个蛇可以移动了,而且你会发现我这一上来这个蛇就开始向右移动,对吧,一上来蛇就开始向右移动,为什么一上。
16:29
开升向右移动,因为在这儿我们给了这个direction一个初始值是right,是不是一上来就往右走啊,那你如果不想让他上来往右走,你把这right你给它去掉,去掉以后的话,它一上来是不动的,不动的,因为这个方向你是不是没给值啊,一上来不动,什么时候才会动,等你按键按下了以后,他是不是才会去移动啊,诶那这样的话也是一种风格,当然你也可以说,诶老师我就希望他一上来就会干嘛呢,就会移动,这样也可以,那这个的话就根据你的实际需要来判断啊,实际需要来判断好,那这样的话,我们这个蛇的移动就已经完成了,当然还有一些功能是吧,撞墙啊,吃实物啊,然后还有一些掉头等等一些判断,我们还没有加上,但是这已经进步很多了,然后啊,我这儿再补充一个属性,补充一个属性,这个属性干嘛呢?我们来创建一个属性。
17:23
创建一个属性,用来记录我们这个蛇呀是否或者叫记录我们这个游戏是否结束,就是这蛇呀还活没活着,因为我们这个游戏它是有退出机制了,就是当你撞上墙以后,或者你撞上自己以后,那这个时候我们这个游戏是不是就结束了,诶结束我们怎么让它停,我们在这儿整一个变量叫做is live is live呢,它是一个默认布尔值,我让它默认值是一个处,也就是游戏没结束啊,游戏没结束它怎么用呢?在我们这设置这个this.out out的时候,我这掉一个this,点一个is live,然后按,按啥意思呢?也就是当我这个值是处的时候,我才开启这个。
18:08
诶,这个这个定时器啊,当我这个直视force的时候,这个定时器我是不是就不开启啊,那这样的效果就是,如果这个直视触是触,表示我这个蛇呀,还活着呢,游戏呢还在进行当中,游戏还在进行当中,这蛇是不是可以正常走啊,按正常走,但是如果我把is live这个值改成一个force force表示什么意思呢?表示我们游戏结束了,游戏结束以后,这蛇呢,它还干嘛了,它就就不动了啊,稍微等一下,稍微等一下,现在is live是这个force,我再按方向键就不动了,因为我的这个蛇已经死了,就不动了,所以他的话等于是一个开关,负责记录我们这个游戏是否在进行当中,那以后我们说了,假如说我蛇撞墙死了,死了我怎么让游戏结束,我直接把这个it live设置为force,游戏自然就结束了啊,自然就结束了,好,那现在的话我们就已经用让这个蛇动起来了,但是的话还是有些问题。
19:09
啊,像撞墙了怎么办啊,撞墙怎么办?像什么呢?像我这蛇吃到食物又怎么办?这些东西我们还没有判断,但是我们先停一下,诶,你们来把这个东西自己来去写一下啊,有地方不明白,可以多看看,多写写这东西它并不难,可能会有一些老的知识点,你忘了,记不住了,回头后头再去捋一下,因为我们不可能把所有的知识点都展开再去细讲了,关键的还是在我们这个练习本身,所以有的知识点你陌生的,我们可以回去再去倒一下啊,再去捋一下,看一下,诶,然后呢,再接着往下看,千万别着急,你说卡卡啊,看完了吗?看完了没用啊,一定要自己能把它写出来啊,写出来好,我们来听一下。
我来说两句