下午做的四道题,觉得第四道hin有趣,又玩了几遍,做个记录~
先看下题目
一开始看题目简直是一脸懵逼,后来在我不断钻研下,终于从万能的网友回答中看出了些门路~~~-_-|||
根据文本框的提示调用'ball'的api移动小球,例如'ball.at(82, 46, ball => ball.turnRight())'大概知道这里用到的是ES6的箭头函数 。Ctrl+Shift+I调出控制面板,输入console.log(ball)查看ball的API,然并卵,控制器输出的是Uncaught ReferenceError: ball is not defined。哼,我才不会就这么死心呢。打开控制台的Sources面板,2017/asset\js文件里面竟然有3个js文件!那好吧,格式下js文件(点击左下角的{}),Ctrl+F调出查找面板,查找turnRight,当当当,以下就是找到的关于ball的几个方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
o.fackBall = {
x : 0 ,
y : 0 ,
direction : "" ,
at : function (t, e, s ) {
return c.at(t, e, s),
this
},
turnLeft : function ( ) {
switch (c.direction) {
case "t" :
c.direction = "l" ;
break ;
case "l" :
c.direction = "b" ;
break ;
case "b" :
c.direction = "r" ;
break ;
case "r" :
c.direction = "t"
}
return this
},
turnRight : function ( ) {
switch (c.direction) {
case "t" :
c.direction = "r" ;
break ;
case "r" :
c.direction = "b" ;
break ;
case "b" :
c.direction = "l" ;
break ;
case "l" :
c.direction = "t"
}
return this
},
turnBack : function ( ) {
switch (c.direction) {
case "t" :
c.direction = "b" ;
break ;
case "b" :
c.direction = "t" ;
break ;
case "l" :
c.direction = "r" ;
break ;
case "r" :
c.direction = "l"
}
return this
},
wait : function (t ) {
return c.waitStartTime = Date .now(),
c.waitTime = t,
this
}
}
大概看下代码,turnLeft是向左转,turnRight是向右转,turnBack是向后转,wait是使时间延迟。
那么,回来看题目。这XX我怎么知道坐标啊。再次感谢万能的网络MUA用鼠标点击屏幕控制台会显示点击点的坐标,诺,像酱
有了坐标,有了API,那就开始动手吧
在笔记上规划好路径,写下每个转折点的坐标。
我的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ball.at(0 , 46 , ball => ball.wait(1500 ));
var right = (x, y) => ball.at(x, y, ball => ball.turnRight());
var left = (x, y) => ball.at(x, y, ball => ball.turnLeft());
var back = (x, y) => ball.at(x, y, ball => ball.turnBack());
right(76 , 46 );
left(76 , 136 );
right(130 , 136 );
right(130 , 243 );
left(91 , 243 );
right(91 , 364 );
back(18 , 364 );
right(176 , 364 );
right(176 , 468 );
back(18 , 468 );
left(372 , 468 );
left(372 , 46 );
left(270 , 46 );
right(270 , 134 );
left(222 , 134 );
right(222 , 243 );
back(173 , 243 );
right(273 , 243 );
left(273 , 290 );
left(367 , 290 );
right(367 , 105 );
left(469 , 105 );
right(469 , 14 );
right(552 , 14 );
left(552 , 105 );
right(618 , 105 );
right(618 , 190 );
left(577 , 190 );
left(577 , 473 );
然而!!!然而!!!然而这不是我的解题过程 。傻傻如我,是直接调出控制台记录每个区域块的左上顶点坐标和宽高值,所以当后来我知道可以用鼠标点击获取坐标时我就这表情/(ㄒoㄒ)/~~
我规划的路径是(1)->(2)->(3)->(4)->(5)->(6)->(7)->(8)->(9)->(10)->(11)->(12)->(13)->(14)->(3)->(4)->(15)->(16)->(17)->(18)->(19)->(20)->(21)->(22)->(23)->(24)->(25)->(26)
不过后来发现这里有个坑:小球经过同个点的时候只能有一种行为,比方说上面的规划路径(3)、(4)是定义了两次,那么实际上小球在这两个点上最终的行为是以后定义的为准的,而我在这两个点定义的两次方向是相反的,所以小球第一次经过(3)点的时候就报错了。解决的方法有两个:1. 定义一个附近的点,但要注意这个点之前不会经过;2. 重新规划一条路线。我这里选择了重新规划路线,最终流程图是这样的:
应该会有更优的方案,这里没有做对比。最后运行结果如图:
关于小球运动后的两颗星星如何吃到。可以在前面加上ball.at(0, 46, ball => ball.wait(1500));,让小球先等一会再动。
总结:知无涯 。当学习到的越多,就会越加意识到先前的浅薄无知,所以,保持虚心。在知乎看过一个关于前端的回答:前端的学习是先平缓后陡峭再平缓的,也许现在的我就在这陡峭的山脚下,但,我是一个喜欢爬上山顶看风景的人~