Where did the monsters go?

Stuck again. My random monster-fight generator works, but it’s so BASIC.
How can I do this without the if-statements? Is it a bad thing to stick
class objects into an array?

Also, I know Moblist[0].fight works, but why not Moblist[0…2].fight ?

##############################################
class Mob
def fight
“THIS IS A FIGHT METHOD”
end
end

GOBO = Mob.new
DRAGON = Mob.new
SLIME= Mob.new

Moblist = [GOBO, DRAGON, SLIME]

def rand_fight
a = rand(Moblist.length)#<-----------Has to be a better way|
if a ==0 then GOBO.fight
elsif a==1 then DRAGON.fight
elsif a==2 then SLIME.fight
end#------------------------------------------------------|

end

p rand_fight
##############################################

Ben G. wrote:

Stuck again. My random monster-fight generator works, but it’s so BASIC.
How can I do this without the if-statements? Is it a bad thing to stick
class objects into an array?
Yep.

def rand_fight
Moblist[rand(Moblist.size)].fight
end

Also, I know Moblist[0].fight works, but why not Moblist[0…2].fight ?
Because array[range] returns an array.

And btw…

Moblist = [GOBO, DRAGON, SLIME]
Why are you using constants for all this?

You can also initialize your list something like
moblist = []
3.times do
moblist << Mob.new
end

Ben G. wrote:

Stuck again. My random monster-fight generator works, but it’s so BASIC.
How can I do this without the if-statements? Is it a bad thing to stick
class objects into an array?

Also, I know Moblist[0].fight works, but why not Moblist[0…2].fight ?

##############################################
class Mob
def fight
“THIS IS A FIGHT METHOD”
end
end

GOBO = Mob.new
DRAGON = Mob.new
SLIME= Mob.new

Moblist = [GOBO, DRAGON, SLIME]

def rand_fight
a = rand(Moblist.length)#<-----------Has to be a better way|
if a ==0 then GOBO.fight
elsif a==1 then DRAGON.fight
elsif a==2 then SLIME.fight
end#------------------------------------------------------|

end

p rand_fight
##############################################

As the great Julian R. once said, one level of indirection solves
everything. :slight_smile:

Also, I know Moblist[0].fight works, but why
not Moblist[0…2].fight ?

Because [0…2] is a Range object, which does not respond to the fight
method. You could monkey patch (ducks) Range to make it work, but a
better idea would be to take a step back and create a class responsible
for representing multiple monsters. GroupOfMonsters or MonsterParty,
perhaps? :wink:

As with your rand(Moblist.length) bit, that should also be put into its
own class (or several classes). Think about what you’re really trying to
say, then figure out the players (objects) and who is responsible for
doing what.

If you’re trying to write anything remotely resembling a game, you’ve a
lot of work ahead of you.

Have you looked at _why’s creature code?
http://poignantguide.net/ruby/chapter-6.html

Ben G. wrote:

"THIS IS A FIGHT METHOD"

a = rand(Moblist.length)#<-----------Has to be a better way|
if a ==0 then GOBO.fight
elsif a==1 then DRAGON.fight
elsif a==2 then SLIME.fight
end#------------------------------------------------------|

end

p rand_fight
##############################################

Try this…

def rand_fight
monster = Moblist[rand(Moblist.length)]
monster.fight
end

or…

def rand_fight
Moblist[rand(Moblist.length)].fight
end

http://www.5valleys.com/

http://www.workingwithrails.com/person/8078

On Tue, Apr 22, 2008 at 1:36 PM, Ben G. [email protected]
wrote:

"THIS IS A FIGHT METHOD"

a = rand(Moblist.length)#<-----------Has to be a better way|
if a ==0 then GOBO.fight
elsif a==1 then DRAGON.fight
elsif a==2 then SLIME.fight
end#------------------------------------------------------|

end

p rand_fight
##############################################

I’m not sure why you use constants, but…

class C
def fight
puts ‘hi, nice to meet you’
puts 'I am " << self.id.to_s
end
end

a = Array.new(3) {C.new}
puts a[rand(a.size)].fight

Just to illustrate.

Todd

On Tue, Apr 22, 2008 at 2:00 PM, Todd B. [email protected]
wrote:

class Mob

##############################################

I’m not sure why you use constants, but…

class C
def fight
puts ‘hi, nice to meet you’
puts 'I am " << self.id.to_s

Once again that weird todd person makes a slight mishap :slight_smile: That double
quote is supposed to be a single one. And I really wanted to say
something a little more sinister, like “So, we meet again }>),
muahaha.” but the nice thing is kind of funny.

Todd