我想在Python代码中进行一次跳跃(比如goto…)。我知道后藤的编程很糟糕,但我现在太"深入"了,无法重建我的结构。
此外,使用函数不是一个好主意,因为我不希望程序在函数调用后继续运行代码。
我在考虑提出一个例外。我不确定这是否可行。
问题(简化):
比方说我在自由奔跑。
如果我按"左",我的角色应该开始向左跑,当他撞到墙上时,他应该开始向右跑。(类似于按下"右")
换句话说:当我的角色撞到墙上时,我希望代码块停止运行,并启动另一个代码块。
例外情况在这里有效吗?因为我不确定异常引发下的代码是否会运行,即使没有遇到异常本身。
提前感谢
编辑:我的代码:http://pastebin.com/QBy5x3g8(死)
如果我按"左",我的角色应该开始向左跑,当他撞到墙上时,他应该开始向右跑。(类似于按下"Right")换句话说:当我的角色撞到墙上时,我希望代码块停止运行,并启动另一个代码块。
这可以像一样完成
# main loop
while True:
# check for input and respond appropriately
if left_key_pressed:
# keep running left until you hit a wall
while not hit_wall:
run_left()
# hit a wall, do something after
elif right_key_pressed:
while not hit_wall:
run_right()
# hit a wall, do something after
不需要做任何类型的显式Goto
此外,使用函数不是一个好主意,因为我不希望程序在函数调用后继续运行代码。
如果你不希望程序在函数调用后继续运行,你总是可以显式终止程序或抛出异常使其崩溃,但我怀疑这是你想要做的。至少,作为一名用户,我可能不希望程序因为撞到墙而终止。
"跳跃"通过函数调用、if/else、while和异常来完成。根据您的代码,以上任何一项都可能是正确的答案。如果没有,你需要重做你的代码,无论你对它有多深入。
"我知道后藤的编程很糟糕,但我太‘深入’了,不知道该如何重现我的结构。"
重构代码永远不会太深入。要求goto
就是要找很多麻烦,这些麻烦会让你陷得更深,让你的问题变得更棘手。
看起来您正在函数句柄中寻找一个返回语句,该语句会中断您的进程。
祝你好运。
将逻辑移动到方法中。例如,如果您有一个"Sprite"类。如果要简化主循环,不要害怕使用什么都不做的方法
class Player(Sprite):
...
def handle_key(self, keystroke):
if keystroke == "l":
self.dx = -1
elif keystroke == "r"
self.dx = 1
...
def move(self):
self.x += self.dx
self.y += self.sy
...
class Wall(Sprite):
...
def handle_key(self, keystroke):
pass
...
def move(self):
pass
...
def main():
sprites = init_sprites()
...
while True:
for obj in sprites:
obj.handle_key(keystroke)
obj.move
...
您可以使用一个异常:
try:
move()
except Blocked:
otherMove()
或者只使用if语句:
if canMove()
move()
else:
otherMove()
第一种方法的问题是,在抛出异常之前,很容易意外地改变状态。要么很容易将其重构为第二个选项,要么可能会产生某种意想不到的副作用。有一个无效果的检查函数,然后是一个总是能成功改变完整状态的函数,这要容易得多。
使用异常:
class Goto(Exception):
pass
try:
i=1
while True:
while True:
while True:
while True:
i+=1
if i==100:
raise Goto
except Goto:
print(i)