From: Markus Date: 2004-09-17T05:27:02+09:00 Subject: Re: 2-d arrays I suspect method 1 doesn't do what you expect because you create one single row and then make an array in which every element is that same row. Try instead: Method 1' cols = 10 $food_layout = Array.new rows.times { $food_layout.push( Array.new( cols, 0 ) ) } puts $food_layout[ 0 ][ 0 ] # 0 $food_layout[ 0 ][ 0 ] = 6 # SET FOOD ITEMS IN HEXAGON puts $food_layout[ 0 ][ 0 ] # 6 puts $food_layout[ 1 ][ 0 ] # 0 -- MarkusQ On Thu, 2004-09-16 at 13:09, Barry Sperling wrote: > Reading the recent posts about ant-wars, I thought that, as a nuby, it > would be interesting to try to recreate the ant-wars engine. I looked > at their code a little, and then started in. I appreciate that James > Edward Gray II provided us with his code, but I'll look at it after I've > made more progress. > I decided to create 2-d arrays to hold the data for given positions ( > hexagonal blocks ). One would hold the amount of food at a position, > another would hold the traversability of it, etc. My first attempt > failed in a strange way and the point of this email is: why? > > Method 1 > > cols = 10 > empty_row_int = Array.new( cols, 0 ) > $food_layout = Array.new > rows.times { $food_layout.push( empty_row_int ) } > puts $food_layout[ 0 ][ 0 ] # 0 > $food_layout[ 0 ][ 0 ] = 6 # SET FOOD ITEMS IN HEXAGON > puts $food_layout[ 0 ][ 0 ] # 6 > puts $food_layout[ 1 ][ 0 ] # 6 WRONG! > > Then I read some archived emails from the group and found Matrix > mentioned, but a matrix couldn't be changed by assignment. However, it > COULD be converted into an array, and so we get: > > Method 2 > > require 'matrix' > maf = Matrix.zero( 10 ) # A SQUARE MATRIX, 10X10, INITIALIZED TO 0 > $food2_layout = maf.to_a # MATRIX TO ARRAY > puts $food2_layout[ 0 ][ 0 ] # 0 > $food2_layout[ 0 ][ 0 ] = 6 # SET FOOD ITEMS IN HEX > puts $food2_layout[ 0 ][ 0 ] # 6 > puts $food2_layout[ 1 ][ 0 ] # 0 > > Then I found another method was mentioned as listed in The Ruby Way: > > Method 3 > > matrix = ( 0..9 ).map { ( 0..9 ).map { 0 } } > > and when I use puts with the code as above, it works. > I understand Method 2, I "sort of" understand Method 3, but I don't know > why "my" Method 1 doesn't work. > Thanks, > Barry > >