2010-07-28 3 views
0

Je crée une carte pour mon jeu roguelike et déjà je suis tombé sur un problème. Je veux créer un tableau bidimensionnel d'objets. Dans mon précédent jeu C++ Je l'ai fait:Comment créer un tableau 2D d'objets dans Ruby?

class tile; //found in another file. 

tile theMap[MAP_WIDTH][MAP_HEIGHT]; 

Je ne peux pas comprendre comment je devrais le faire avec Ruby.

Répondre

4
theMap = Array.new(MAP_HEIGHT) { Array.new(MAP_WIDTH) { Tile.new } } 
+0

Merci. Comment puis-je appeler les fonctions d'objets dans ce tableau? J'ai besoin de faire défiler le tableau et d'appeler chaque fonction de dessin d'objets. –

+1

@Shub: 'theMap.each {| y | y.each {| x | x.draw}} ' – Adrian

+0

@Adrian serait' theMap.flatten.each {| x | x.draw} 'travail (je sais que ce serait lent)? –

1

Utilisez des tableaux de tableaux.

board = [ 
[ 1, 2, 3 ], 
[ 4, 5, 6 ] 
] 

x = Array.new(3){|i| Array.new(3){|j| i+j}} 

Regardez aussi dans la classe Matrix:

require 'matrix' 
Matrix.build(3,3){|i, j| i+j} 
+0

Je suis familier avec les tableaux multidimensionnels et les matrices en général, mon problème réside dans le fait de ne pas savoir comment en déclarer un comme un tableau d'objets dans ruby. –

+0

Vous n'avez pas besoin de déclarer des choses dans Ruby, grâce à la frappe dynamique. –

+0

Note: Ruby> = 1.9.2 ne supporte que les matrices rectangulaires. Voir: http://svn.ruby-lang.org/repos/ruby/tags/v1_9_2_rc1/NEWS – Baju

2

tableaux 2D ne sont pas la sueur

array = [[1,2],[3,4],[5,6]] 
=> [[1, 2], [3, 4], [5, 6]] 
array[0][0] 
=> 1 
array.flatten 
=> [1, 2, 3, 4, 5, 6] 
array.transpose 
=> [[1, 3, 5], [2, 4, 6]] 

Pour les tableaux de chargement 2D essayer quelque chose comme:

rows, cols = 2,3 
mat = Array.new(rows) { Array.new(cols) } 
0
# Let's define some class 
class Foo 
    # constructor 
    def initialize(smthng) 
    @print_me = smthng 
    end 
    def print 
    puts @print_me 
    end 
# Now let's create 2×2 array with Foo objects 
the_map = [ 
[Foo.new("Dark"), Foo.new("side")], 
[Foo.new("of the"), Foo.new("spoon")] ] 

# Now to call one of the object's methods just do something like 
the_map[0][0].print # will print "Dark" 
the_map[1][1].print # will print "spoon" 
Questions connexes