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!!!

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!

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs