Dave H. wrote:

OK, let’s try this from the top. {grin} Here’s some fresh new code:

Thx again - very instructive.

I have managed to get the capping working in isolation as per the

following code:

class Array2D

Delta=[[0,0], [0,-1], [1,-1], [1,0], [1,1], [0,1], [-1,1], [-1,0],

[-1,-1]]

attr_reader :width, :height

attr_accessor :cell_content

def initialize(width, height, cell_content)

@width = width

@height = height

@data = Array.new(@height) {Array.new(@width){|i| cell_content} }

end

def [](x, y, z)

deltaX, deltaY = *Delta[z]

x = (x + deltaX) % @width

y = (y + deltaY)

@data[y][x] unless y<0 or y>(@height-1)

end

def []=(x, y, z, value)

deltaX, deltaY = *Delta[z]

x = (x + deltaX) % @width # modulus % allows wrapping

y = (y + deltaY)

@data[y][x] = value unless y<0 or y>(@height-1)

end

def display

@height.times {|rownum| print(@data[rownum].join(" ") + “\n”)};nil

end

end

a=Array2D.new(10,5,“X”)

m = rand(10)

n = rand(5)

a[m,n,0] = “A”

a[m,n,1] = “H”

a[m,n,2] = “H”

a[m,n,3] = “H”

a[m,n,4] = “A”

a[m,n,5] = “A”

a[m,n,6] = “A”

a[m,n,7] = “A”

a[m,n,8] = “A”

puts a.display

However, it still falls over when I try to insert the above into my main

program, as below:

class Array2D

Delta=[[0,0], [0,-1], [1,-1], [1,0], [1,1], [0,1], [-1,1], [-1,0],

[-1,-1]]

attr_reader :width, :height

def initialize(width, height)

@width = width

@height = height

@data = Array.new(@height) {Array.new(@width) {|i|“X”}}

end

def [](x, y, z)

deltaX, deltaY = *Delta[z]

x = (x + deltaX) % @width

y = (y + deltaY)

@data[y][x] unless y<0 or y>(@height-1)

end

def []=(x, y, z, value)

deltaX, deltaY = *Delta[z]

x = (x + deltaX) % @width # modulus % allows wrapping

y = (y + deltaY)

@data[y][x] = value unless y<0 or y>(@height-1)

end

def display

@height.times {|rownum| print(@data[rownum].join(" ") + “\n”)};nil

end

end

class World < Array2D

attr_reader :size

def initialize(size)

@rows = size

@cols = @rows * 2

@world = Array2D.new(@cols, @rows)

end

def populate_array_cells_with_hash

(0…@rows).each do |b|

(0…@cols).each do |a|

@world[a,b,0] = {

“hex_col_no” => a,

“hex_row_no” => b,

“hex_id_A” => "X ",

“hex_id_B” => nil,

“hex_id_C” => nil,

“hex_id_D” => nil,

“hex_id_E” => nil,

}

end

end

end

def insert_teleporting_square

m = rand(@cols)

n = rand(@rows)

@world[m,n,0][“hex_id_A”] = "A "

@world[m,n,1][“hex_id_A”] = "H "

@world[m,n,2][“hex_id_A”] = "H "

@world[m,n,3][“hex_id_A”] = "H "

@world[m,n,4][“hex_id_A”] = "A "

@world[m,n,5][“hex_id_A”] = "A "

@world[m,n,6][“hex_id_A”] = "A "

@world[m,n,7][“hex_id_A”] = "A "

@world[m,n,8][“hex_id_A”] = "A "

end

def print_world(type)

(0…@rows).each do |b|

puts

(0…@cols).each do |a|

print @world[a,b,0][type]

end

end

end

end

first_world = World.new(5)

first_world.populate_array_cells_with_hash

first_world.insert_teleporting_square

first_world.print_world(“hex_id_A”)

puts

It falls over when it hits one of these two lines:

@world[m,n,1][“hex_id_A”] = "H "

@world[m,n,4][“hex_id_A”] = "A "

With error as before:

undefined method `[]=’ for nil:NilClass (NoMethodError)

What my program does is generate an array, then populates each cell of

that array with a hash. It looks like when it tries to access the hash

values outside the array boundary it runs into problems? Do I need

another method inside the Array2D class to deal with hash access? If so,

how can this be done? If not, can anyone see any other reason for the

error?