2014-12-06 72 views
0

我想創建一個方法來創建一個矩陣,並用特定的值填充它,但對於一些奇怪的和意想不到的原因,說明標記爲while循環內的註釋贏得根本不工作,我做錯了什麼?下面的代碼:紅寶石鞋的多維數組沒有按預期工作

def map(r,c) 

    row = 0 #row counter 
    map = Array.new 

    while (row < r) 

     map[row] = Array.new #Creates an array with row Rows 

     col = 0 #col counter 

     while (col < c) 

      map[row][col] = 0 #Floor 
      map[0][col] = 1 #Top wall 
      #map[r][col] = 2 #Bottom wall 
      map[row][0] = 3 #Left wall 
      map[row][c] = 4 #Right wall 
      map[0][0]  = 5 #Top left corner 
      map[0][c]  = 6 #Top right corner 
      #map[r][0]  = 7 #Bottom left corner 
      #map[r][c]  = 8 #Bottom right corner 

      col = col + 1 
     end 
     row = row + 1 
    end 
    alert(map) 
end 

Shoes.app(:width => 650,:height => 450) do 
    map(17,22) 
end 

回答

1

當你嘗試分配一個值在Ruby中的數組這是它的邊界之外,陣列充滿nil s到這一點,並設定在正確的位置值:

a = [] 
a[5] = 5 
puts a 
# => [nil, nil, nil, nil, nil, 5] 

如果你試圖獲取數組邊界之外的值,你會得到nil

a = [] 
a[5] 
# => nil 

這就是爲什麼當你嘗試分配map[r][col] = 2你出現錯誤,因爲map[r]nil

爲了解決這個問題,你需要r空數組預填充map陣列:

map = Array.new(r+1) { [] } 

這樣map[r]將不會返回nil,你可以設置它的值:

def map(r,c) 

    row = 0 #row counter 
    map = Array.new(r+1) { [] } 

    while (row < r) 

     col = 0 #col counter 

     while (col < c) 

      map[row][col] = 0 #Floor 
      map[0][col] = 1 #Top wall 
      map[r][col] = 2 #Bottom wall 
      map[row][0] = 3 #Left wall 
      map[row][c] = 4 #Right wall 
      map[0][0]  = 5 #Top left corner 
      map[0][c]  = 6 #Top right corner 
      map[r][0]  = 7 #Bottom left corner 
      map[r][c]  = 8 #Bottom right corner 

      col = col + 1 
     end 
     row = row + 1 
    end 
    alert(map) 
end 

Shoes.app(:width => 650,:height => 450) do 
    map(17,22) 
end 
+0

非常感謝你向我解釋! – Polariced 2014-12-06 18:07:37