Help needed with my grid and code

Hey guys,

Im in need of some help here...i have a lot of code (with help of a
teacher) and now i need to figure out how this code works and i have to
improve it.

The code works out a grid of 14 x 14 cells...then it places some roads
(cell type 1 cell distance to road = 0) in the last column, the 6th row
and the 6th column:

grid.column(13).each do |cell|
  cell.type = 1
  cell.distance_road = 0
end
grid.column(6).each do |cell|
  cell.type = 1
  cell.distance_road = 0
end
grid.row(6).each do |cell|
  cell.type = 1
  cell.distance_road = 0
end

What i need to have is the distance of each cell to these road
cells...But since im a noob at ruby maybe someone can help me by
overlooking the code and see what is wrong.

Because till now it prints out this:

xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00
xx xx xx xx xx xx 00 xx xx xx xx xx xx 00

Where you can see 00 as roads (why isnt this 10 via):

grid.column(13).each do |cell|
  cell.type = 1
  cell.distance_road = 0

and it has to be something like this:

06 05 04 03 02 01 00 01 02 03 03 02 01 00
05 05 04 03 02 01 00 01 02 03 03 02 01 00
04 04 04 03 02 01 00 01 02 03 03 02 01 00
03 03 03 03 02 01 00 01 02 03 03 02 01 00
02 02 02 02 02 01 00 01 02 02 02 02 01 00
01 01 01 01 01 01 00 01 01 01 01 01 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00
01 01 01 01 01 01 00 01 01 01 01 01 01 00
02 02 02 02 02 01 00 01 02 02 02 02 01 00
03 03 03 03 02 01 00 01 02 03 03 02 01 00
04 04 04 03 02 01 00 01 02 03 03 02 01 00
05 05 04 03 02 01 00 01 02 03 03 02 01 00
06 05 04 03 02 01 00 01 02 03 03 02 01 00
06 05 04 03 02 01 00 01 02 03 03 02 01 00

Where 00 are those cells representing roads and the other cells all have
type 0 and the second digit is the distance to the nearest roadcell...

please help me because im stuck!

Here's the total ruby code (maybe its a lot but i hope some ruby experts
can read a lot faster through the code as i can):

class Grid
  attr :width
  attr :height

  def initialize(width, height)
    @grid = Array.new(width * height)
    @width = width
    @height = height
  end

  def [](x, y)
    raise IndexError.new("Index (#{x}, #{y}) out of range") if x < 0 ||
y < 0 || x >= @width || y >= @width
    @grid[y * width + x]
  end

  def []=(x, y, value)
    raise IndexError.new("Index (#{x}, #{y}) out of range") if x < 0 ||
y < 0 || x >= @width || y >= @width
    @grid[y * width + x] = value
  end

  def column(column)
    Column.new(self, column)
  end

  def row(row)
    Row.new(self, row)
  end

  def neighbours(x, y)
    result = []
    (x - 1).step(x + 1) do |xx|
      (y - 1).step(y + 1) do |yy|
        next if x == xx && y == yy
        begin
          result << self[xx, yy]
        rescue IndexError
        end
      end
    end
    result
  end

  def each
    (@width * @height).times { |i| yield @grid[i] }
  end

  def each_index
    @height.times do |y|
      @width.times do |x|
        yield x, y
      end
    end
  end

  def map
    (@width * @height).times { |i| @grid[i] = yield @grid[i] }
  end

  alias_method :collect, :map

  def to_a
    result = []
    @height.times do |y|
      row = []
      @width.times { |x| row << self[x, y] }
      result << row
    end
    result
  end

  def inspect
    "Grid#{to_a.inspect}"
  end

private
  class Column
    def initialize(grid, column)
      @grid = grid
      @column = column
    end

    def [](i)
      @grid[@column, i]
    end

    def []=(i, value)
      @grid[@column, i] = value
    end

    def size
      @grid.height
    end

    def each
      size.times { |i| yield self[i] }
    end

    def map
      size.times { |i| self[i] = yield self [i] }
    end

    alias_method :collect, :map

    def to_a
      result = []
      size.times { |i| result << self[i] }
      result
    end

    def inspect
      "Grid.Column#{to.inspect}"
    end
  end

  class Row
    def initialize(grid, row)
      @grid = grid
      @row = row
    end

    def [](i)
      @grid[i, @row]
    end

    def []=(i, value)
      @grid[i, @row] = value
    end

    def size
      @grid.width
    end

    def each
      size.times { |i| yield self[i] }
    end

    def map
      size.times { |i| self[i] = yield self[i] }
    end

    alias_method :collect, :map

    def to_a
      result = []
      size.times { |i| result << self[i] }
      result
    end

    def inspect
      "Grid.Row#{to_a.inspect}"
    end
  end

end

class Cell
  attr_accessor :type
  attr_accessor :distance_road

  def inspect
    "Cell[#{type}, #{distance_road || 'nil'}]"
  end
end

# Voorbeeld met wegen uit email
grid = Grid.new(14, 14)
# Zet alle cellen op 0
grid.map do
  cell = Cell.new
  cell.type = 0
  cell
end
# Maak de 3 wegen

grid.column(13).each do |cell|
  cell.type = 1
  cell.distance_road = 0
end
grid.column(6).each do |cell|
  cell.type = 1
  cell.distance_road = 0
end
grid.row(6).each do |cell|
  cell.type = 1
  cell.distance_road = 0
end
p grid

0.times do
  grid.each_index do |x, y|
    #next if grid[x, y].distance_road

    n = grid.neighbours(x, y)
    c = grid[x, y]
    n.each do |cell|
      if cell.distance_road
        if c.distance_road.nil? || c.distance_road > cell.distance_road
          c = cell
        end
      end
    end

    if c.distance_road
      grid[x, y].distance_road = c.distance_road + 1
    end
  end
end

grid.height.times do |y|
grid.width.times do |x|
    if grid[x, y].distance_road
      print " %02d " % grid[x, y].distance_road
    else
      print" xx "
    end
  end
  print "\n"
end

I hope someone can help me thanks!!!

···

--
Posted via http://www.ruby-forum.com/.

So i adjusted some of my code and now it is a little bit better...the
last part of the code is now:

grid.height.times do |y|
grid.width.times do |x|
    if grid[x, y].distance_road
      print grid[x, y].type
      print grid[x, y].distance_road
    else
      print grid[x, y].type
      print grid[x, y].distance_road

    end
  end
  print "\n"
end

and generates:

0nil0nil0nil0nil0nil011101020304050111
0nil0nil0nil0nil02011101020304020111
0nil0nil0nil0302011101020303020111
0nil0nil040302011101020303020111
0nil05040302011101020303020111
0101010101011101010101010111
1111111111111111111111111111
0202020202011101020202020111
0303030302011101020303020111
0404040302011101020303020111
0505040302011101020303020111
0605040302011101020303020111
0605040302011101020303020111
0605040302011102020303020111

Anyone has any pointers what im doing wrong? Thanks!

···

--
Posted via http://www.ruby-forum.com/.