2011-11-25 41 views
1

我在做一個python文本冒險。它基於學習Python困難方式中的ex41,因此它有點類似。但是,我的問題與這個練習無關。我正在努力製作一份清單,以便可以拾取和使用一件物品(即鑰匙或少女)。我正在做一個蟒蛇文字冒險。製作「庫存」需要幫助

起初,我的計劃是使用一個布爾變量,以便當該項目被「拾取」時,它會將值設置爲True,但它似乎不起作用。我認爲問題在於,一旦我離開房間,價值就會重置。

現在我正在嘗試一個列表,當物品被「拾取」時,該物品被添加到庫存清單中。

我該如何製作庫存,或者至少是「拿起」一個物品,然後「使用」它?

我認爲重要的代碼行是18-20(在def __init__(self, start)下),77(在def cell(self)下),161-162(在def janitor(self)下)。

from sys import exit 
from random import randint 
import time 

prompt = '> ' 


class Game(object): 

    def __init__(self, start): 
     self.quips = [ 
      "Way to go, you died." 
      "Now you're dead. Sweet.", 
      "Well isn't this just peachy? You're dead. (It's not peachy.)" 
        ] 
     self.start = start 
     #self.smell = 0 
     #self.Febreeze = False 
     #self.key = False 
     self.inventory = [] 

     #if self.smell >=2: 
     # return 'death' 

    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 intro(self): 
     print "You wake up." 
     print "You're in a dark cell." 
     print "You have no idea who you are or where you are." 
     print "The door is slightly open." 
     print "You stagger through the door. The light is blinding." 
     print "You have just escaped imprisonment and you're on the run." 
     return 'central_corridor' 

    def central_corridor(self): 
     print "In front of you is a long corridor with no doors on the side, but you think you can make out a door at the very end." 
     print "Behind you is the cell that you have just escaped." 

     next = raw_input(prompt) 

     if "cell" in next: 
      print "You decide to go back into your cell." 
      return 'cell' 
     elif "forward" in next: 
      print "You travel down the corridor towards the door." 
      return 'front_corridor' 
     else: 
      print "That command doesn't exist." 
      return 'central_corridor' 

    def cell(self): 
     print "You're standing in the middle of a musty cell." 
     print "There is a bed in the corner with a rotting mattress." 
     print "Under the bed the bricks are loose." 
     print "In the opposite corner there is a dirty toilet that implies that prison food is even worse than Taco Bell." 
     print "There are some scratches on the wall next to the toilet." 
     print "Behind you is an exit into the corridor." 


     next = raw_input(prompt) 

     if "toilet" in next: 
      print "It'd probably be best if this toilet wasn't described." 
      #self.smell = self.smell + 1 
      return 'cell' 
     elif "febreeze" in next and "Febreeze" in self.inventory #and self.Febreeze = True: 
      print "You use the Febreeze on the toilet to get rid of the odor." 
      print "Now you can go behind the toilet to read the rest of the scratches." 
     elif "scratches" in next: 
      print "The scratches on the wall seem to be tally marks. It goes up to 123. I wonder what it means." 
      print "You see more scratches behind the toilet, but the stench is too much for you to handle." 
      print "If only you could get rid of the smell..." 
      #self.smell = self.smell + 1 
      return 'cell' 
     elif "bed" in next: 
      print "There are various stains on the mattress. Some of the springs are poking up into the mattress. Ouch." 
      print "Buried between the wall and the mattress is a stuffed animal." 
      return 'cell' 
     elif "bricks" in next: 
      print "You pull the bricks out of the floor and find a few pieces of toilet paper." 
      print "There is a note written on them in what you hope is dried blood." 
      print "The note reads:\n -------------------------\nthe closet!! the closet in the walls i'm not \nsure\twhich one it is but its defin-\nly in the hall. i hear it in the bricks!\n---------------------------" 
      print "Hmm, maybe it's a hint or something." 
     elif "corridor" in next: 
      return 'central_corridor' 
     else: 
      print "I do not understand how to %s" % next 
      return 'cell' 

    def front_corridor(self): 
     print "You are standing in front of a door." 
     print "On the side of the door is a keypad." 

     next = raw_input(prompt) 

     if "keypad" in next: 
      return 'keypad' 
     elif "wall" in next: 
      return 'wall' 
     elif "back" in next: 
      return 'central_corridor' 
     else: 
      print "I don't understand %s" % next 
      return 'front_corridor' 

    def wall(self): 
     print "Which wall do you want to check?" 

     next = raw_input(prompt) 

     if "left" in next: 
      return 'left' 
     elif "right" in next: 
      return 'right' 
     elif "back" in next: 
      return 'front_corridor' 

    def right(self): 
     print "You examine the wall carefully, running your fingers across each of the bricks." 
     print "Unfortunately it doesn't look like anything of value is in this wall." 
     print "Well, you just wasted some time." 
     return 'wall' 

    def left(self): 
     print "You examine the wall carefully, running your fingers across each of the bricks." 
     print "One of the bricks seems to be protruding from the wall." 
     print "Do you push it?" 

     next = raw_input(prompt) 

     if next[0] == "y": 
      print "A few of the bricks shift, revealing a secret door way." 
      return 'janitor' 
     elif next[0] == "n": 
      print "You decide not to push the brick. Good thinking, it may have been a booby trap." 
      return 'front_corridor' 
     else: 
      print "That doesn't exactly make sense..." 
      return 'wall' 

    def janitor(self): 
     print "You are in a room filled with janitorial tools." 
     print "On your left you see a few cans of Febreeze, a plunger and a Playboy magazine." 

     next = raw_input(prompt) 

     if "febreeze" in next: 
      print "You pick up some Febreeze and put it in your back pocket." 
      print "Maybe this will be useful somewhere down the line." 
      self.inventory.append("Febreeze") 
      #self.Febreeze = True 
      return 'janitor' 
     elif "plunger" in next: 
      print "You try to pick up the plunger but it appears to be stuck in the ground." 
      print "After tugging for a few minutes the handle comes out, leaving the rubber suction cup plastered to the floor." 
      print "Who knows what's keeping it there." 
      print "You decide not to touch it." 
      return 'janitor' 
     elif "playboy" in next: 
      print "Well isn't that nice." 
      print "These janitors certainly have good taste." 
      return 'janitor' 
     elif "back" in next: 
      return 'front_corridor' 
     else: 
      print "Do WHAT with WHAT?" 
      return 'janitor' 

    def keypad(self): 
     print "Above the keypad there is a sign that reads:\n-----------\nInput a 3 digit code.\nWarning: If code is incorrect 3 times, keypad will self-destruct.\n-----------" 
     code = "%d%d%d" % (randint(1,9), randint(1,9), randint(1,9)) 
     guess = raw_input("Password: ") 
     guesses = 0 

     while guess != code and guesses < 2: 
      print "BZZZZZEDD!" 
      guesses += 1 
      guess = raw_input("Password: ") 

     if guess == code: 
      print "The keypad beeps in acceptance. Wow, that was a good guess" 
      print "The door swings open." 
      print "Behind the door is a long bridge suspended over a lake of lava." 
      return 'bridge' 
     elif "key" in guess and key == True: 
      print "You flash your card key across the keypad." 
      print "There is a beep as the door swings open." 
      print "Behind the door is a long bridge suspended over a lake of lava." 
      return 'bridge' 
     else: 
      print "The keypad buzzes one last time and then you hear a sickening melting" 
      print "sound as the lock mechanism fuses together." 
      print "There is a small clicking while the keypad countsdown." 
      print "3" 
      time.sleep(1) 
      print "2" 
      time.sleep(1) 
      print "1" 
      time.sleep(1) 
      print "There is a large explosion and you are caught right in the middle of it." 
      print "The fiery blast tears your skin from your body as you scream in agony." 
      return 'death' 

    def bridge(self): 
     print "You carefully walk onto the bridge." 
     print "One false move and you could be dead." 
     print "Across the bridge is a door leading to the outside world." 

     next = raw_input(prompt) 

     if "jump" in next: 
      print "You jump to your death." 
      print "Probably not the best idea." 
     elif "run" in next: 
      print "You run" 

a_game = Game("intro") 
a_game.play() 
+0

對於文本冒險遊戲,一堆布爾應該工作。你有沒有嘗試調查爲什麼他們的價值觀被重置爲假? – millimoose

+0

它似乎沒有工作?您是否嘗試過插入打印語句以查看拾取物品後的值,然後在離開房間之後? –

+2

使用[set](http://docs.python.org/library/stdtypes.html#set)來實現庫存(而不是'list')最終會更加地道。你可以使用'add'和'remove'來添加和刪除項目。 'in'運算符也適用於'list',我看到... – moooeeeep

回答

2

你的方法似乎工作正常,但你有幾個錯誤。在cell()中,在elif "febreeze"...聲明(註釋開始之前)之後需要:。另外,在elif區塊末尾,您需要return 'cell'。有了這些變化,我可以拿起Febreeze並使用它。

-1

如果你tryed將其定義爲一個列表,如(猜這是蟒蛇)

def inventory[] 
    inventory.append 
add item (inventory) 

不能的rember如何將它添加到庫存,但有基本

0

如果定義庫存作爲一個列表(這就是我所做的那樣),那麼你可以做:

class Attributes: 
     def __init__(self, inventory): 
      self.inventory = inventory 

    Player = Attributes([]) 
    Player.inventory.append("Febreeze") 

方括號做庫存,而「追加」補充Febreeze它。