2014-12-06 47 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