[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

instantiating random sub-classes (Dragon, TeethDeer, etc

Thufir Hawat

11/7/2007 9:16:00 PM

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


4 Answers

Charles L.

11/7/2007 10:54:00 PM

0

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-....

7stud --

11/8/2007 3:04:00 AM

0

Charles Lowe wrote:
> 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.


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


--
Posted via http://www.ruby-....

Thufir Hawat

11/8/2007 3:35:00 AM

0

On Nov 7, 7:03 pm, 7stud -- <bbxx789_0...@yahoo.com> wrote:
[...]
> 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


7stud --

11/8/2007 4:11:00 AM

0

Thufir wrote:
> On Nov 7, 7:03 pm, 7stud -- <bbxx789_0...@yahoo.com> wrote:
> [...]
>> @@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.
--
Posted via http://www.ruby-....