Reputation: 203
hey guys. i am a bit stuck on something with ex42:
from sys import exit
from random import randint
class Game(object):
def __init__(self, start):
self.quips = [
"You died. You kinda suck at this.",
"Your mom would be proud. If she were smarter.",
"Such a luser.",
"I have a small puppy that's better at this."
]
self.start = start
def play(self):
next = self.start
while True:
print "\n--------"
room = getattr(self, next)
next = room()
def death(self):
print self.quips[randint(0, len(self.quips)-1)]
exit(1)
def princess_lives_here(self):
print "You see a beautiful Princess with a shiny crown."
print "She offers you some cake."
eat_it = raw_input("> ")
if eat_it == "eat it":
print "You explode like a pinata full of frogs."
print "The Princess cackles and eats the frogs. Yum!"
return 'death'
elif eat_it == "do not eat it":
print "She throws the cake at you and it cuts off your head."
print "The last thing you see is her munching on your torso. Yum!"
return 'death'
elif eat_it == "make her eat it":
print "The Princess screams as you cram the cake in her mouth."
print "Then she smiles and cries and thanks you for saving her."
print "She points to a tiny door and says, 'The Koi needs cake too.'"
print "She gives you the very last bit of cake and shoves you in."
return 'gold_koi_pond'
else:
print "The princess looks at you confused and just points at the cake."
return 'princess_lives_here'
def gold_koi_pond(self):
print "There is a garden with a koi pond in the center."
print "You walk close and see a massive fin poke out."
print "You peek in and a creepy looking huge Koi stares at you."
print "It opens its mouth waiting for food."
feed_it = raw_input("> ")
if feed_it == "feed it":
print "The Koi jumps up, and rather than eating the cake, eats your arm."
print "You fall in and the Koi shrugs than eats you."
print "You are then pooped out sometime later."
return 'death'
elif feed_it == "do not feed it":
print "The Koi grimaces, then thrashes around for a second."
print "It rushes to the other end of the pond, braces against the wall..."
print "then it *lunges* out of the water, up in the air and over your"
print "entire body, cake and all."
print "You are then pooped out a week later."
return 'death'
elif feed_it == "throw it in":
print "The Koi wiggles, then leaps into the air to eat the cake."
print "You can see it's happy, it then grunts, thrashes..."
print "and finally rolls over and poops a magic diamond into the air"
print "at your feet."
return 'bear_with_sword'
else:
print "The Koi gets annoyed and wiggles a bit."
return 'gold_koi_pond'
def bear_with_sword(self):
print "Puzzled, you are about to pick up the fish poop diamond when"
print "a bear bearing a load bearing sword walks in."
print '"Hey! That\' my diamond! Where\'d you get that!?"'
print "It holds its paw out and looks at you."
give_it = raw_input("> ")
if give_it == "give it":
print "The bear swipes at your hand to grab the diamond and"
print "rips your hand off in the process. It then looks at"
print 'your bloody stump and says, "Oh crap, sorry about that."'
print "It tries to put your hand back on, but you collapse."
print "The last thing you see is the bear shrug and eat you."
return 'death'
elif give_it == "say no":
print "The bear looks shocked. Nobody ever told a bear"
print "with a broadsword 'no'. It asks, "
print '"Is it because it\'s not a katana? I could go get one!"'
print "It then runs off and now you notice a big iron gate."
print '"Where the hell did that come from?" You say.'
return 'big_iron_gate'
def big_iron_gate(self):
print "You walk up to the big iron gate and see there's a handle."
open_it = raw_input("> ")
if open_it == 'open it':
print "You open it and you are free!"
print "There are mountains. And berries! And..."
print "Oh, but then the bear comes with his katana and stabs you."
print '"Who\'s laughing now!? Love this katana."'
return 'death'
else:
print "That doesn't seem sensible. I mean, the door's right there."
return 'big_iron_gate'
a_game = Game("princess_lives_here")
a_game.play()
play is confusing me, i get how next gets the first room, which is passed when the instance of Game() is created, but how does it get the next room?
thanks
Upvotes: 0
Views: 3031
Reputation: 13541
Nice code.
Just look at this snippt(it is part of play()):
while True:
print "\n--------"
room = getattr(self, next)
next = room()
The getattr()
line gets the function with the name next.
So in the beginning it is the function with the name 'princess_lives_here'
The line next = room()
executes the function and stores the name of the next room,
which will be mapped to the function and executes in the next round.
EDIT: You're all pretty fast in answering questions. ;)
Upvotes: 2
Reputation: 76949
This part here:
while True:
# The following line accesses a class member without knowing
# its name in advance.
# The name is stored in a string (next), and is initially
# "princess_lives"here". So, for the first case, this would be like
# room = self.princess_lives_here -> room is assigned a method from
# this class.
room = getattr(self, next)
# Now, room has the method for the room we'll play. We call it, which in
# the first case mentioned above would be like self.princess_lives_here()
# and the return value is assigned to next. princess_lives_here returns
# 'princess_lives_here', 'death', etc. That string will be the one used
# in the getattr() call in the next iteration.
next = room()
See the python docs for getitem()
, and google "python functions first class objects" for more information.
Upvotes: 2
Reputation: 75609
Each method returns the name of another method.
It retrieves this method by getting the property named next
from the self
object.
getattr(self, next)
Next, it calls this method
room()
Upvotes: 1
Reputation: 22149
It gets the first room through getattr
. If you look at princess_lives_here
for example it returns the name of a function. getattr
retrieves this function and places it in room, which is then called. room
then returns the next method and so forth.
It's basically a pretty simple state machine where the name of the method signals the next state.
I would however say that it is quite a... bad way of doing it. Functions are first class in Python, one could merely return the next function as a value. On the other hand, I don't know the intentions of this exercise, I am not familiar with it.
Upvotes: 0