instantiating random sub-classes (Dragon, TeethDeer, etc)

T

Thufir

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=Dragon.new #what about other
types (children/sub-classes) of creature?
print "\n"
print "someCreatures["
print i
print "]:\n"
print someCreatures.toString
end


C:\code>


thanks,

Thufir
 
C

Charles Lowe

Thufir said:
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=Dragon.new #what about other
types (children/sub-classes) of creature?
print "\n"
print "someCreatures["
print i
print "]:\n"
print someCreatures.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....
 
7

7stud --

Charles said:
Thufir said:
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=Dragon.new #what about other
types (children/sub-classes) of creature?
print "\n"
print "someCreatures["
print i
print "]:\n"
print someCreatures.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.



An example of the Class.inherited method:

class Creature
def Creature.inherited(new_subClass_that_was_defined)
puts new_subClass_that_was_defined
end
end

class Monster1 < Creature
end

class Monster2 < Creature
end

class Monster3 < Creature
end

--output:--
Monster1
Monster2
Monster3

You can save those sub Classes in an array:

class Creature
def Creature.inherited(new_subClass_that_was_defined)
puts new_subClass_that_was_defined

if not defined?(@@subs)
@@subs = []
end

@@subs << new_subClass_that_was_defined

end

def Creature.subs #can access @@subs using: Creature.subs
@@subs
end
end


require 'creaturefile'
require 'monsterfile'

p Creature.subs
 
T

Thufir

You can save those sub Classes in an array:

class Creature
def Creature.inherited(new_subClass_that_was_defined)
puts new_subClass_that_was_defined

if not defined?(@@subs)
@@subs = []
end

@@subs << new_subClass_that_was_defined

end

def Creature.subs #can access @@subs using: Creature.subs
@@subs
end
end
[...]

Ah, thank you for fleshing it out, but is it ok that @@subs isn't
declared?

I seem to have created multiple threads on this topic, oops. Thank
you everyone for the input, many good ideas and an almost overwhelming
amount of information to absorb :)



-Thufir
 
7

7stud --

Thufir said:
@@subs << new_subClass_that_was_defined

end

def Creature.subs #can access @@subs using: Creature.subs
@@subs
end
end
[...]

Ah, thank you for fleshing it out, but is it ok that @@subs isn't
declared?

In ruby, variables aren't declared--not even in classes. Instead, a
variable springs into existence when a value is assigned to the
variable.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,576
Members
45,054
Latest member
LucyCarper

Latest Threads

Top