首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python-2问题:在函数中编辑变量,并在运行时内部/期间更改if else语句的顺序

Python-2问题:在函数中编辑变量,并在运行时内部/期间更改if else语句的顺序
EN

Stack Overflow用户
提问于 2010-04-30 15:14:41
回答 2查看 173关注 0票数 0

首先,我应该先解释一下我想做什么。

我正在创建一个类似于地牢的爬虫游戏,并且我试图在地图上对计算机字符/怪物的移动进行编程。地图基本上是笛卡尔坐标网格。字符的位置由x和y值的元组(x,y)表示。该游戏轮流工作,在一个回合中,一个角色只能移动上,下,左或右1空间。我正在创建一个非常简单的移动系统,在这个系统中,角色将简单地做出决定,在一个转身的基础上移动。本质上是一个“健忘”的运动系统。

我打算做的事情的基本流程图:

destination

  • Make
  1. 找到了一个使用方向(如“r”、“u”、“d”、“l”)完成的优先动作列表,意思是先向右移动,然后向上移动,然后向下移动,然后向左移动。
  2. 试着按照优先级顺序进行每一种可能性的尝试。如果第一次动作失败(被障碍物阻挡等),那么它会连续尝试这些动作,直到第一次成功,然后停止。

在第三步,我试图这样做:

代码语言:javascript
复制
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语句的顺序以遵循优先级列表的顺序?它需要能够在运行时进行更改,因为优先级列表可能会发生变化,从而导致尝试的移动顺序不同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-30 15:21:17

我会将您相对较大的if/elif树更改为一个简单的循环:

代码语言:javascript
复制
prioritylist = ('r','u','d','l')
for direction in prioritylist:
  if move(direction, location): break

如果你想要允许对角线步骤或者其他什么的话,重复更少,将来更容易扩展--并且自动“跟随优先级列表”,不管它是什么顺序,而不需要改变你的代码本身。

,您可以从一个函数返回多个值:

代码语言:javascript
复制
def move(direction,location):
    try:
        -snip-
        return True, newlocation
    except Movementerror:
        return False, location

然后将上述循环更改为,例如:

代码语言:javascript
复制
prioritylist = ('r','u','d','l')
for direction in prioritylist:
  success, newlocation = move(direction, location)
  if success: break

其他: newlocation = location

使用else分支的for (如果for中没有发生break就执行)来处理没有尝试成功的情况。

票数 3
EN

Stack Overflow用户

发布于 2010-04-30 15:19:26

您可以使用for-循环,并在第一个成功的选择中跳出循环:

代码语言:javascript
复制
for option in prioritylist:
    if move(option,location): # succeeded
        break

您还应该返回TrueFalse,而不是10,因为它使意图更加清晰。

另外,我应该补充一点,关于不编辑参数的声明并不完全正确.不能编辑参数本身,但假设参数是可变对象,则可以编辑该参数的内容。您正在使用的元组是不可变的,因此不能修改,但是列表可以修改:

代码语言:javascript
复制
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']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2745547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档