游戏中的角色移动:闭包(closure)在实际开发中的作用
在某种情况下,我们并不方便使用全局变量,所以灵活的使用闭包可以实现替代全局变量。
例如以下的游戏开发中,我们需要将游戏中角色的移动位置保护起来,不希望被其他函数轻易可以修改到,所以我们选择使用闭包操作,参考代码及注释如下:
origin = (0, 0) # 原点
legal_x = [-100, 100] # x轴的移动范围
legal_y = [-100, 100] # y轴的移动范围
def create(pos_x=0, pos_y=0):
# 初始化位于原点为主
def moving(direction, step):
# direction参数设置方向,1为向右(向上),-1为向左(向下),0为不移动
# step参数设置移动的距离
nonlocal pos_x, pos_y
new_x = pos_x + direction * step
new_y = pos_y + direction * step
# 检查移动后是否超出x轴边界
if new_x < legal_x:
pos_x = legal_x - (new_x - legal_x)
elif new_x > legal_x:
pos_x = legal_x - (new_x - legal_x)
else:
pos_x = new_x
# 检查移动后是否超出y轴边界
if new_y < legal_y:
pos_y = legal_y - (new_y - legal_y)
elif new_y > legal_y:
pos_y = legal_y - (new_y - legal_y)
else:
pos_y = new_y
return pos_x, pos_y
return moving
move = create()
print('向右移动10步后,位置是:', move(, 10))
print('向上移动130步后,位置是:', move(, 130))
print('向左移动10步后,位置是:', move([-1, 0], 10))
这里需要注意的一点是:move = create(),如果当 move 变量重新被赋值的话,相应的 pos_x 和 pos_y 也都会被初始化为 0。
这个太高端了我怎么一点也看不懂啊 我假装说我看懂了 完全看不懂啊 请问
if new_x < legal_x:
pos_x = legal_x - (new_x - legal_x)
为什么 posx不 等于 legal_x? yu_wind 发表于 2014-1-11 16:22 static/image/common/back.gif
请问
if new_x < legal_x:
pos_x = legal_x - (new_x - legal_x)
等于的话走else:分支,临界并不算超界 :lol:JS非常喜欢写闭包 本帖最后由 yu_wind 于 2014-1-11 16:57 编辑
我估计是我没看明白咋么移动的,
我的理解是, x轴上原来-80 往左挪30变成-110然后 if的结果是-90;而 原来-90 ,往左挪30 ,变成-120 ,然后 if 的结果是 -80?
所以这个设定 是撞完墙往回走是么?
yu_wind 发表于 2014-1-11 16:55 static/image/common/back.gif
我估计是我没看明白咋么移动的,
我的理解是, x轴上原来-80 往左挪30变成-110然后 if的结果是-90 ...
是啊,只是简单介绍闭包的用法 这个是实践,真酷,继续努力!!! 本帖最后由 xiawb 于 2014-3-26 14:36 编辑
>>>
向右移动10步后,位置是: (10, 0)
向上移动130步后,位置是: (10, 70)
向左移动10步后,位置是: (0, 70)
>>>
print('向右移动10步后,位置是:', move(, 10))
print('向上移动430步后,位置是:', move(, 430))
print('向左移动10步后,位置是:', move([-1, 0], 10))
>>>
向右移动10步后,位置是: (10, 0)
向上移动430步后,位置是: (10, -230)
向左移动10步后,位置是: (0, 30)
>>>
:lol:
origin = (0, 0) # 原点
legal_x = [-100, 100] # x轴的移动范围
legal_y = [-100, 100] # y轴的移动范围
def create(pos_x=0, pos_y=0):
# 初始化位于原点为主
def moving(direction, step):
# direction参数设置方向,1为向右(向上),-1为向左(向下),0为不移动
# step参数设置移动的距离
nonlocal pos_x, pos_y
new_x = pos_x + direction * step
new_y = pos_y + direction * step
# 检查移动后是否超出x轴边界
while new_x>legal_x or new_x<legal_x:
new_x=-new_x+legal_x*2 if new_x < legal_x else -new_x+legal_x*2
pos_x = new_x
# 检查移动后是否超出y轴边界
while new_y>legal_y or new_y<legal_y:
new_y=-new_y+legal_y*2 if new_y < legal_y else -new_y+legal_y*2
pos_y = new_y
return pos_x, pos_y
return moving
move = create()
print('向右移动10步后,位置是:', move(, 10))
print('向上移动430步后,位置是:', move(, 430))
print('向左移动410步后,位置是:', move([-1, 0], 410))
完全看不懂啊!! 20题那课后题也完全不会做 也没看懂你写的代码! 难道闭包就是为了不破坏内嵌的函数吗 不太懂,moving()用到外部函数creat()的参数,就是闭包? 学习中……多谢整理和分享!{:1_1:} 原来是坐标。。完成练习了再看。 我这是完全没有入门呀!! 唉,这鱼币太难搞了,连作业都看不到,有点小失望,求鱼币、求鱼币!!!!! 小甲鱼真可爱