2010-04-30 63 views
0

首先,我應該首先解釋我想要做的事情。Python - 2問題:在函數中編輯變量並在運行時內部/更改if else語句的順序

我正在創建一個類似地牢爬蟲的遊戲,並且我正嘗試在地圖中編寫計算機角色/怪物的移動。該地圖基本上是笛卡爾座標網格。 字符的位置由x和y值(x,y)的元組表示。 遊戲輪流工作,輪到一個角色只能移動上,下,左或右1個空間。我正在創建一個非常簡單的移動系統,角色將簡單地做出決定,依次轉向。本質上是一個「健忘」運動系統。

什麼,我打算做的簡易流程圖:

  1. 找不到方向朝着目的地
  2. 做運動的優先級列表使用方向如來完成(「R」,」。 u','d','l')意味着它會嘗試先移動,然後向上,然後向下移動,然後離開。
  3. 按照優先順序嘗試每種可能性。如果第一次移動失敗(被障礙等阻擋),那麼它將連續嘗試移動,直到第一次移動成功爲止,然後停止移動。

在步驟3,我試圖做到這一點的方法是這樣的:

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/else塊,程序會嘗試優先級列表上的優先級的第一運動。在移動功能中,角色會嘗試移動。如果角色沒有被阻擋並且移動,它會返回1,導致該角色停止。如果該字符被阻止,則返回0,然後它嘗試下一個移動。

然而,這會導致兩個問題:

1.How編輯我傳遞給函數自身內部的函數變量,而如果返回的編輯是成功的?

我被告知,你不能在一個函數內編輯一個變量,因爲它不會真的改變變量的值,它只是使得函數內的變量引用其他東西,而原始變量保持不變。所以,解決方案是返回值,然後將該變量分配給返回的值。但是,我希望它返回另一個值,指示此編輯是否成功,所以我想在函數本身內編輯此變量。我該怎麼做?

2.如何更改if/else語句的順序以遵循優先級列表的順序?它需要能夠在運行期間進行更改,因爲優先級列表可以更改,從而導致嘗試的不同移動順序。

回答

3

關於第2點,我想你的相對大的if/elif的樹變成一個簡單的循環:

prioritylist = ('r','u','d','l') 
for direction in prioritylist: 
    if move(direction, location): break 

如果您想允許對角線步驟或者其他什麼的話,那麼在未來更容易擴展,並且自動按照它的順序「遵循優先級列表」,而不需要更改代碼本身。

回覆1,你可以從一個函數返回多個值:

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 =位置

使用forelse分支,該分支在中沒有發生break時執行,以處理沒有嘗試產生成功的情況。

0

您可以使用一個for循環,並在第一次成功選擇跳出循環:

for option in prioritylist: 
    if move(option,location): # succeeded 
     break 

你也應該返回TrueFalse,而不是10,因爲它使意圖更清楚。

此外,我應該補充一點,關於不編輯參數的聲明不完全是真的......你不能編輯參數本身,但你可以編輯該參數的內容,假設它是一個可變對象。元組,你正在使用,是不可改變的,因此不能被修改,但列表可以修改:

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']