2013-12-17 44 views
0

我寫了一些代碼,我想轉換成我可以導入的東西,而不是用作主要的代碼。python方法中斷代碼

floorMap = [[000,000,000,000,000,999,999,999,999,999], 
      [000,000,999,000,999,000,000,000,999,999], 
      [000,000,999,000,999,000,000,000,999,999], 
      [000,000,000,000,999,000,000,000,999,999], 
      [999,000,000,000,999,000,999,999,999,999], 
      [999,000,000,000,000,000,999,000,000,999], 
      [999,000,000,000,999,999,999,000,000,999], 
      [999,000,999,000,000,000,999,000,000,999], 
      [999,000,999,999,999,000,000,000,000,999], 
      [999,999,999,999,999,999,999,999,000,000]] 


currentNum=0 

wall=999 
uncalculated=000 

robotX=0 
robotY=0 
goalX=9 
goalY=9 

floorMap[goalY][goalX]=1 

def changeSurroundings(X, Y): 

     #left 
     if(floorMap[X-1][Y]==uncalculated and X > 0): 
      floorMap[X-1][Y]=currentNum 
     #right 
     if(X < len(floorMap[0])-1 and floorMap[X+1][Y]==uncalculated): 
      floorMap[X+1][Y]=currentNum 
     #up 
     if(floorMap[X][Y-1]==uncalculated and Y > 0): 
      floorMap[X][Y-1]=currentNum 
     #down 
     if(Y < len(floorMap)-1 and floorMap[X][Y+1]==uncalculated): 
      floorMap[X][Y+1]=currentNum  


def printMap(): 
    i=0 
    floorMap[goalY][goalX]='G' 
    floorMap[robotY][robotX]='R' 

    while(i<len(floorMap)): 
     print floorMap[i] 
     print "" 
     i+=1 
    print "" 
    print "" 

#------------------MOST IMPORTANT CHUNK OF CODE-------------- 

while(floorMap[robotY][robotX]==uncalculated): 
    x=0 
    while(x<len(floorMap[0])): 
     y=0 
     while(y<len(floorMap)): 
      if(floorMap[x][y] > uncalculated and floorMap[x][y] < wall): 
       currentNum=floorMap[x][y]+1 
       changeSurroundings(x,y)         
      y+=1 
     x+=1 

printMap() 

我的問題是,每當我嘗試把最重要的代碼塊放在底部的方法就像這樣;

def calcMap(): 
while(floorMap[robotY][robotX]==uncalculated): 
    x=0 
    while(x<len(floorMap[0])): 
     y=0 
     while(y<len(floorMap)): 
      if(floorMap[x][y] > uncalculated and floorMap[x][y] < wall): 
       currentNum=floorMap[x][y]+1 
       changeSurroundings(x,y)         
      y+=1 
     x+=1 

printMap() 

它打破了我的代碼。爲什麼?我似乎沒有得到任何錯誤,它只是卡在其中一個嵌套循環。我沒有看到任何理由應該這樣做,但你們也許會;)

感謝,洛根

+1

請考慮用'for y,列舉(floorMap):' – Eric

+0

'替換'y = 0','while(y

+0

您確定縮進是正確的嗎?也許'y + = 1'或'x + = 1'從其循環中溜走了。 –

回答

3

你的問題來自於您的全局變量,尤其是currentNum。這基本上是你在做什麼:

current = 0 

def f(): 
    current = 1 
    g() 

def g(): 
    print(current) 

f() # Output: 0 

你需要做的是:

current = 0 

def f(): 
    global current 
    current = 1 
    g() 

def g(): 
    print(current) 

f() # Output: 1 

或者更好:

def f(): 
    current = 1 
    g(current) 

def g(current): 
    print(current) 

f() # Output: 1 

此外,你應該考慮使用更Python synthax爲您的calcMap功能,類似於:

def calc_map(): 
    while floor_map[robot_x][robot_y] == uncalculated : 
     for x,array in enumerate(floor_map): 
      for y,element in enumerate(array): 
       if uncalculated < element < wall: 
        current_num = element + 1 
        change_surroundings(x, y, current_num) 
+0

小心,您已經在最終代碼中交換了x和y的含義 - 爲什麼不把它們保留原樣並交換循環? – Eric

+0

是的,因爲OP犯了一個錯誤。它只適用於他,因爲'floorMap'是一個矩形矩陣,否則他的代碼會引發一個'IndexError'。 – Vincent