首先,我应该先解释一下我想做什么。
我正在创建一个类似于地牢的爬虫游戏,并且我试图在地图上对计算机字符/怪物的移动进行编程。地图基本上是笛卡尔坐标网格。字符的位置由x和y值的元组(x,y)表示。该游戏轮流工作,在一个回合中,一个角色只能移动上,下,左或右1空间。我正在创建一个非常简单的移动系统,在这个系统中,角色将简单地做出决定,在一个转身的基础上移动。本质上是一个“健忘”的运动系统。
我打算做的事情的基本流程图:
destination
。
在第三步,我试图这样做:
def move(direction,location):
try:
-snip- # Tries to move, raises the exception Movementerror if cannot move in the direction
return 1 # Indicates movement successful
except Movementerror:
return 0 # Indicates movement unsuccessful (thus character has not moved yet)
prioritylist = ('r','u','d','l')
if move('r',location): pass
elif move('u',location): pass
elif move('d',location): pass
elif move('l',location): pass
else: pass在if/ the块中,程序将尝试优先级列表中优先级的第一个移动。在move函数中,字符将尝试移动。如果该字符未被阻止并确实移动,则返回1,从而导致将停止的传递。如果该字符被阻塞,则返回0,然后尝试下一个动作。
然而,这导致了两个问题:
1.如果编辑成功,如何编辑传递到函数本身内的变量,同时返回?
我被告知,您不能在函数中编辑变量,因为它不会真正更改变量的值,它只会使函数中的变量引用其他变量,而原始变量则保持不变。因此,解决方案是返回值,然后将变量赋值给返回的值。但是,我希望它返回另一个值,指示此编辑是否成功,因此我希望在函数本身内编辑这个变量。我怎样做呢?
2.如何更改if/ the语句的顺序以遵循优先级列表的顺序?它需要能够在运行时进行更改,因为优先级列表可能会发生变化,从而导致尝试的移动顺序不同。
发布于 2010-04-30 15:21:17
我会将您相对较大的if/elif树更改为一个简单的循环:
prioritylist = ('r','u','d','l')
for direction in prioritylist:
if move(direction, location): break如果你想要允许对角线步骤或者其他什么的话,重复更少,将来更容易扩展--并且自动“跟随优先级列表”,不管它是什么顺序,而不需要改变你的代码本身。
,您可以从一个函数返回多个值:
def move(direction,location):
try:
-snip-
return True, newlocation
except Movementerror:
return False, location然后将上述循环更改为,例如:
prioritylist = ('r','u','d','l')
for direction in prioritylist:
success, newlocation = move(direction, location)
if success: break其他: newlocation = location
使用else分支的for (如果for中没有发生break就执行)来处理没有尝试成功的情况。
发布于 2010-04-30 15:19:26
您可以使用for-循环,并在第一个成功的选择中跳出循环:
for option in prioritylist:
if move(option,location): # succeeded
break您还应该返回True或False,而不是1或0,因为它使意图更加清晰。
另外,我应该补充一点,关于不编辑参数的声明并不完全正确.不能编辑参数本身,但假设参数是可变对象,则可以编辑该参数的内容。您正在使用的元组是不可变的,因此不能修改,但是列表可以修改:
positions = ['N','S','E','W']
def mutate_list(p):
p.reverse()
print positions # prints ['N', 'S', 'E', 'W']
mutate_list(positions)
print positions # prints ['w', 'E', 'S', 'N']https://stackoverflow.com/questions/2745547
复制相似问题