move小游戏拆解 |
序号 | 代码 | 拆解和思路 |
1 | origin = (0, 0) #这个是原点 | 这三行代码就不解释了,大家应该都明白是什么意思 |
2 | legal_x = [-100, 100] #限定X轴的移动范围 |
3 | legal_y = [-100, 100] #限定Y轴的移动范围 |
4 | def creat(pos_x=0, pos_y=0): | 第一层函数 |
5 | def moving(direction, step): | 第二层函数 |
6 | nonlocal pos_x, pos_y | nonlocal语句改变pos_x, pos_y的作用域,使其可以作用于整个嵌套函数 |
7 | new_x = pos_x + direction[0]*step | 对new_x和new_y进行赋值。(我在这里被卡了一下,因为不知道为啥在direction没有被赋值的情况下就可以直接进行索引了。发帖求助得到的答案是,在moving函数里,direction是一个形式参数,已经被赋值了) |
8 | new_y = pos_y + direction[1]*step |
9 | | |
10 | if new_x < legal_x[0]: | if语句设定new_x超出其“最小”移动范围时,pos_x的值 |
11 | pos_x = legal_x[0] - (new_x - legal_x[0]) |
12 | elif new_x > legal_x[1]: | 嵌入elif语句设定new_x超出其“最大”移动范围时,pos_x的值(这里能不能用“嵌入”不是很确定) |
13 | pos_x = legal_x[1] - (new_x - legal_x[1]) |
14 | else: | 嵌入else语句设定new_x在规定的移动范围时,pos_x的值(这里能不能用“嵌入”不是很确定) |
15 | pos_x = new_x |
16 | | |
17 | if new_y < legal_y[0]: | 把10-15行拆解里的x替换成y即可 |
18 | pos_y = legal_y[0] - (new_y - legal_y[0]) |
19 | elif new_y > legal_y[1]: |
20 | pos_y = legal_y[1] - (new_y - legal_y[1]) |
21 | else: |
22 | pos_y = new_y |
23 | | |
24 | return pos_x, pos_y | 生成pos_x, pos_y |
25 | return moving | 生成moving函数的结果 |
26 | | |
27 | move = creat() | 对move进行赋值(我这里不明白为什么把creat()赋值给move。思考的结果是为了看起来好看,用起来方便,这也符合Python的极简原则)。 |
28 | move() | 1、小甲鱼直接用了move([1, 0], 20),里面是列表和数字,我在想如果是空的会是什么结果,于是就试了一下,然后就报错了,原因是“方向”和“步数”参数没有。
2、我这里其实还有一个推测,当然小甲鱼也可能讲过,那就是creat()的默认是creat(0, 0),如果不对的话还请大家指正。 |
29 | Traceback (most recent call last): |
30 | File "<pyshell#6>", line 1, in <module> |
31 | move() |
32 | TypeError: creat.<locals>.moving() missing 2 required positional arguments: 'direction' and 'step' |
33 | move("85", 8) | 这里是模仿小甲鱼给了“3”个参数,我的想法是想看下这样行不行。如果行的话,那么direction[0]的结果就应该是“8”, direction[1]就应该是5.结果是报错,错误原因是整数和字符串不是“+”支持的参数,这里虽然不是很明白,但是觉得也没必要去深究,反正知道整数和字符串在这里不适用就行了,我其实还想试一下字符串来着,但是人家已经说了字符串不行,那就没必要了。 |
34 | Traceback (most recent call last): |
35 | File "<pyshell#7>", line 1, in <module> |
36 | move("85", 8) |
37 | File "<pyshell#4>", line 4, in moving |
38 | new_x = pos_x + direction[0]*step |
39 | TypeError: unsupported operand type(s) for +: 'int' and 'str' |
40 | move((8, 5), 8) | 整数和字符串不行,那么元组行不行呢?试一下,可以。 |
41 | (64, 40) |
42 | creat((8, 5), 8) | 那么creat((8, 5), 8),也就是crea函数里放一个元组行不行呢?试一下,不行、、、、报错原因以前也见到过,但是还是不大懂,有些头疼,不深究了,下次碰到再说 |
43 | <function creat.<locals>.moving at 0x00000251980072E0> |
44 | creat(8, 5, 8) | 那么给creat三个参数,也就是大家看到的creat(8, 5, 8)行不行呢?试一下,也不行。报错原因是creat只有两个参数,但是我这里给了3个,当然不行,嘿嘿嘿嘿 |
45 | Traceback (most recent call last): |
46 | File "<pyshell#10>", line 1, in <module> |
47 | creat(8, 5, 8) |
48 | TypeError: creat() takes from 0 to 2 positional arguments but 3 were given |
49 | creat()([8,5], 8) | 那么我不把creat函数赋值给别的“变量”或者说“函数”,直接多加一个()可不可以呢?试一下,可以。但是这样操作有点麻烦了,后面使用起来不方便,不符合Python的极简原则,这应该就是小甲鱼在开始举例的时候就把creat函数赋值给move的原因。 |
50 | (64, 40) |
51 | 总结:
学到第46讲,已经学了一半多,也是第一次碰到这么长的代码,很慎重,于是在这里停了差不多4天,目的是把这里面的每一个点都吃透。现在自评的话,明白了80-90%的样子。虽然还有一些点不是很透,但是我觉得问题不大,可以继续向前了。
先是nonlocal语句,然后是direction这个形式参数,再然后就是不大明白为啥要把creat函数赋值给move。前面两个问题想了半天不是很明白,然后发帖求助,把问题解决了,感谢各位大佬的回复。最后一个问题是自己想通的,给自己点个赞。
最后就是表扬一下小甲鱼的AI小助理,它是很有用的,基本上都是秒回。虽然答案有时候不是很令人满意,但是对于个人学习而言,综合体验已经超过了身边绝大部分的朋友。因为即便是朋友和老师也不能做到秒回且给到你有用的参考答案且一次又一次耐心的回复。 |