From: Charles Lowe Date: 2007-11-08T07:53:32+09:00 Subject: Re: instantiating random sub-classes (Dragon, TeethDeer, etc Thufir wrote: > In Driver, I was considering creating a pseudo-random number between 0 > and 4, then using case: > > case 0 > AssistantViceTentacleAndOmbudsman > > case 1 > Dragon > > case 2 > DwarvenAngel > > case 3 > IntrepidDecomposedCyclist > > case 4 > TeethDeer > > > so that the array of Creatures is filled with a variety of monsters > which inherit from Creature. However, there's gotta be another way. > Perhaps ask Creature what its sub-classes are? Then randomly select > from that list/array of monsters? > > Here's the code: > > C:\code> > C:\code>type Driver.rb > require 'ArrayOfCreatures' > require 'Dragon' #Dragon inherits > from Creature > require 'Creature' #Subclasses > include: Dragon, TeethDeer, etc > > #numOfCreatures=Kernel.rand(3) > > puts "\nquantity of creatures:" > numOfCreatures = gets.chomp.to_i > > > someCreatures = ArrayOfCreatures.new > > > 0.upto(numOfCreatures) do |i| > someCreatures[i]=Dragon.new #what about other > types (children/sub-classes) of creature? > print "\n" > print "someCreatures[" > print i > print "]:\n" > print someCreatures[i].toString > end > > > C:\code> > > > thanks, > > Thufir There are two ways to get a list of subclasses. One is to use ObjectSpace#each_object, which is kind of messy, and the other is to use the Creature.inherited hook, to build up the array. Alternatively, and to add more flexibilty, you could add a creature weights hash. Eg something like: class Creature WEIGHTS = {} end class Dragon < Creature WEIGHTS[self] = 0.5 end class SomeScaryGuy < Creature WEIGHTS[self] = 0.25 end (Doesn't matter if they don't add to one) Or make the weights be dependent on some difficulty setting.... -- Posted via http://www.ruby-forum.com/.