2014-10-02 2 views
0

Привет, я только начинаю с Python 2 и программирование в целом и решил сделать текстовое приключение для немного но я полностью застрял на титул.Python: как я могу вернуть функцию как True и применить ее к более ранней функции для изменения оператора true/false

Это код, который до сих пор полностью угадывал весь True/False, но то, что я пытаюсь выработать, - это когда вы вводите «view_room», вы сталкиваетесь с запертой дверью, но если вы идете в «lab_room» и получить ключ от тела, который вы можете открыть. Я пытаюсь сделать так, чтобы заблокированная дверь была ложной, но когда вы берете ключ-карту, она меняется на True, и дверь становится разблокированной. Я благодарю за помощь!

prompt = "> " 
decision = "What do you do?" 
not_assigned = "Say wa?" 

def engine_room(): 
    print "You are in a dark room with the sound of moaning engines." 
    print "You see a corridor to your left and one to your right and an elevator straight ahead of you." 
    print decision 
    choice = raw_input(prompt) 

    if choice == "go left": 
     viewing_room() 

    elif choice == "go right": 
     right_corridor_dead_end() 

    elif choice == "use elevator": 
     print "you get in the elevator and go up." 
     main_hallway() 

    else: 
     print not_assigned 
     engine_room() 


def right_corridor_dead_end(): 
    print "You walk down the corridor only to be blocked by a collapsed ceiling." 
    print decision 
    choice = raw_input(prompt) 

    if choice == "go back": 
     engine_room() 

    else: 
     print not_assigned 

def viewing_room(): 
    print "You walk down the corridor and enter and a large room with a window covering the size of the wall." 
    print "Straight ahead is another door" 
    print decision 
    choice = raw_input(prompt) 

    if search_body() == False: 
     if choice == "open door": 
      print "The door is locked" 
      viewing_room() 

     elif choice == "go back": 
      engine_room() 

     else: 
      print not_assigned 

    if search_body() == True: 
     if choice == "open door": 
      print "The door opens you walk through" 
      storage_room() 

     else: 
      print not_assigned 
      viewing_room() 


def main_hallway(): 
     print "You enter a large brightly lit room with 3 rooms connected to it and another elevator straight ahead." 
     print "The rooms are named, the two on the left are the armoury and lab rooms and to the right are the cabins." 
     print decision 
     choice = raw_input(prompt) 

     if choice == "go to lab room": 
      lab_room() 

     elif choice == "go back": 
      engine_room() 



def lab_room(): 
    print "You enter the lab room which is cluttered with unexplainable machines." 
    print "To the back of the room you see the dead body of a man with no obvious cause" 
    print "He might have something useful on him" 
    print decision 
    choice = raw_input(prompt) 

    if choice == "search body": 
     search_body() 

    elif choice == "go back": 
     main_hallway() 

def search_body(): 
    print "You find a keycard that says 'storage' on it." 
    return True 
    lab_room() 



engine_room() 
+0

'lab_room()' недопустим в 'search_body' после вашего оператора возврата –

+2

Вы должны взглянуть на класс вместо функций. – EL3PHANTEN

+1

Необходимо как-то сохранить состояние. Обычно это делается с объектами, и это действительно яркий пример использования объектно-ориентированного программирования. Посмотрите на ООП в Python. –

ответ

0

Вы должны изучить классы. Если вы делаете игры, то объектно-ориентированное программирование - лучший способ сделать это.

Когда вы привыкаете к занятиям, становится легче создавать игры.

Вот пример вашей игры, как объект класса

prompt = "> " 
decision = "What do you do?" 
not_assigned = "Say wa?" 

class Game: 

    def __init__(self): 
     self.bodySearched = False 
     self.engine_room() 

    def engine_room(self): 
     print "You are in a dark room with the sound of moaning engines." 
     print "You see a corridor to your left and one to your right and an elevator straight ahead of you." 
     print decision 
     self.choice = raw_input(prompt) 

     if self.choice == "go left": 
      self.viewing_room() 

     elif self.choice == "go right": 
      self.right_corridor_dead_end() 

     elif self.choice == "use elevator": 
      print "you get in the elevator and go up." 
      self.main_hallway() 

     else: 
      print not_assigned 
      self.engine_room() 


    def right_corridor_dead_end(self): 
     print "You walk down the corridor only to be blocked by a collapsed ceiling." 
     print decision 
     self.choice = raw_input(prompt) 

     if choice == "go back": 
      self.engine_room() 

     else: 
      print not_assigned 

    def viewing_room(self): 
     print "You walk down the corridor and enter and a large room with a window covering the size of the wall." 
     print "Straight ahead is another door" 
     print decision 
     self.choice = raw_input(prompt) 

     if not self.bodySearched: 
      if self.choice == "open door": 
       print "The door is locked" 
       self.viewing_room() 

      elif self.choice == "go back": 
       self.engine_room() 

      else: 
       print not_assigned 

     if self.bodySearched: 
      if self.choice == "open door": 
       print "The door opens you walk through" 
       self.storage_room() 

      else: 
       print not_assigned 
       self.viewing_room() 


    def main_hallway(self): 
      print "You enter a large brightly lit room with 3 rooms connected to it and another elevator straight ahead." 
      print "The rooms are named, the two on the left are the armoury and lab rooms and to the right are the cabins." 
      print decision 
      self.choice = raw_input(prompt) 

      if choice == "go to lab room": 
       self.lab_room() 

      elif choice == "go back": 
       self.engine_room() 



    def lab_room(self): 
     print "You enter the lab room which is cluttered with unexplainable machines." 
     print "To the back of the room you see the dead body of a man with no obvious cause" 
     print "He might have something useful on him" 
     print decision 
     self.choice = raw_input(prompt) 

     if self.choice == "search body": 
      self.bodySearched = True 
      print "You find a keycard that says 'storage' on it." 
      self.lab_room() 

     elif self.choice == "go back": 
      self.main_hallway() 

newGame = Game() 

Теперь NewGame является объектом типа игры, и будет помнить его состояние. Def init (self) - это метод, который будет вызываться, когда вы создадите новый объект этого класса. И вы можете создать столько объектов Game, сколько хотите, имя newGame или другое, что вы называете новым объектом, заменит self. Таким образом, player1.searchedBody может быть правдой, в то время как player2.searchedBody может быть ложным. Это очень удобно.

+0

Почему это работает лучше? Я предполагаю себя. ссылается на игрока, поддерживает ли оно свое состояние, и если да, почему это не так легко кодировать без использования класса? Не могли бы вы также объяснить, что делает функция def __init __ (self):? – KingSwan

+0

Я обновлю ответ – EL3PHANTEN

+0

Проще может быть неправильный способ поставить его. Но если вы используете класс, у каждого объекта есть свои методы, как у игрока, есть метод dealDamage и takeDamage move и т. Д. Вы также можете сделать это со словарями и функциями, как некоторые из них – EL3PHANTEN

1

Ну, мне кажется, что это не вопрос Питона, а вопрос общего программирования. Вам нужно каким-то образом сохранить состояние своей программы - в частности, был ли поиск тела ранее или нет. Вы должны прочитать немного о state machines или просмотреть проходящие объекты с сохранением состояния между вашими различными функциями (возможно, объект «Player» или «Character», который поддерживает какое-то состояние).

BTW при сравнении с логическим значением в случае, если вы можете просто сделать:

if search_body(): 
    pass 

или:

if not search_body(): 
    pass 

Вместо того, по сравнению с True или False.

+0

, глядя на него сейчас, но не могли бы вы объяснить мне, что делает пропуск, описание, которое у меня есть, говорит: «Этот блок пуст», я знаю, что такое блок (или, может быть, просто недостаточно), но что это даже означает или имеет отношение к сравнению с булевым значением? – KingSwan

+1

@KingSwan - В Python в любое время, когда у вас есть оператор, заканчивающийся двоеточием (например, 'if',' for', 'while' и т. Д.), Он ожидает, что блок последует за ним. Этот блок * должен содержать * хотя бы один оператор. Так как довольно часто требуется определить блок, который ничего не делает (например, если вы хотите определить «пустую» функцию), был создан оператор 'pass' (который ничего не делает). Таким образом, поскольку блок * должен * содержать хотя бы один оператор, если вы хотите блок, который ничего не делает, вы можете использовать оператор 'pass' для создания допустимого блока, который ничего не делает. – rmunn

+0

@KingSwan - И причина, по которой shevron использовал 'pass' в своем примере, является заполнителем. Если бы он оставил это, его ответ содержал бы недопустимый код Python (так как оператор 'if' должен всегда следовать блоку, содержащему хотя бы один оператор). В вашем коде вы, вероятно, будете что-то делать, если функция 'search_body()' вернула True или False, и поэтому вы заменили бы свой собственный код (каким бы он ни был), где он поставил этот оператор 'pass'. – rmunn

Смежные вопросы