3

テキスト アドベンチャー ゲームで少し問題が発生しています。アイデアは、リビングルームから始めて、鍵をつかむために地下に向かい、再びリビングルームに入ると勝つはずです. ただし、コードを実行すると、部屋に入るだけで、ブール値はifステートメントにそれを伝える必要がありますhas_key = trueが、常に機能しません。何かご意見は?

def welcomeMessage():
    print "Welcome to my game!!"

def winnerMessage():
    print "You're a winner!! Congratulations!!"
    userQuit()

def userQuit(): 
    print "Thanks for playing!"

def living_room():
    # This part isn't executing (Boolean doesn't work here)
    # I want the if statement to execute, not the else statement
    if has_key == True:
        winnerMessage()
        userQuit()
    else: 
        print ("\nYou are in the living room. The paint from the walls is tearing off."
        +" There is a door near you, but it seems to be locked. To your west is the"
        +" kitchen, where you can eat some tasty snacks and to your south is a bedroom. ")
        direction = raw_input("Which direction would you like to go? (W)est or (S)outh? You also have the option to (Q)uit. ")
        if direction == "W":
            kitchen()
        elif direction == "S":
            bed_room()
        elif direction == "N":
            print "Sorry, you can't go north here."
            living_room()
        elif direction == "E":
            print "Sorry, you can't go east here."
            living_room()
        elif direction == "Q":
            userQuit()
        else:
            print "Sorry, that's not a valid direction."
            living_room()


def kitchen():
    print ("\nYou are in the kitchen. The water from the sink is slightly running. All of the"
    +" cupboards in the kitchen have been left open, like someone has searched through them."
    +" To your south is the dining room, and to your east is the living room. ")
    direction = raw_input("Which direction would you like to go? (S)outh or (E)ast? You also have the option to (Q)uit. ")
    if direction == "S":
        dining_room()
    elif direction == "E":
        living_room()
    elif direction == "N":
        print "Sorry, you can't go north here."
        kitchen()
    elif direction == "W":
        print "Sorry, you can't go west here."
        kitchen()
    elif direction == "Q":
        userQuit()  
    else:
        print "Sorry, that's not a valid direction."
        kitchen()


def bed_room():
    print ("\nYou are in the bedroom. One of the windows in the room is slightly ajar. The other window"
    +" is shattered with a brick laying on the floor next to it. To your west is the dining room and"
    +" to your north is the living room.")
    direction = raw_input("Which direction would you like to go? (W)est or (N)orth? You also have the option to (Q)uit. ")  
    if direction == "W":
        dining_room()
    elif direction == "N":
        living_room()
    elif direction == "E":
        print "Sorry, you can't go east here."
        bed_room()
    elif direction == "S":
        print "Sorry, you can't go south here."
        bed_room()
    elif direction == "Q":
        userQuit()
    else:
        print "Sorry, that's not a valid direction."
        bed_room()

def dining_room():
    print ("\nYou are in the dining room. It is very hard to see in here due to the dim lighting. You notice a staircase is the"
    +" in the center of the room. To your north is the kitchen, and to your east is the bedroom.")
    direction = raw_input("Which direction would you like to go? (N)orth or (E)ast or go (D)own the staircase? You also have the option to (Q)uit. ")
    if direction == "N":
        kitchen()
    elif direction == "E":
        bed_room()
    elif direction == "D":
        basement()
    elif direction == "S":
        print "Sorry, you can't go south here."
        dining_room()
    elif direction == "W":
        print "Sorry, you can't go west here."
        dining_room()
    elif direction == "Q":
        userQuit()
    else:
        print "Sorry, that's not a valid direction."
        dining_room()

def basement():
    print ("\nYou are now in the basement. A cloud of dust passes by you and makes it hard to breath. You move away from the area"
    +" and you notice a key on the floor. You pick up the key and hold onto it. You may use it for later. ")
    direction = raw_input("Press U to go upstairs. You also have the option to (Q)uit. ")
    if direction == "U":
        has_key = True
        dining_room()
    elif direction == "Q":
        userQuit()
    else:
        print "Sorry, the only place you can go is back upstairs."
        basement()

welcomeMessage()
has_key = False
living_room()
4

4 に答える 4

2

has_key変数がグローバル型であることを Python に伝える必要があります。

def basement():
    global has_key
    ...
    if direction == "U":
        has_key = True

少し書き直せば、メッセージ パッシングを使用して、プレイヤーの現在位置を制御できます。

そのため、living_room()関数を呼び出して、内部から関数を呼び出すことでプレイヤーがどこに行くかを制御できるようにする代わりに、living_room 関数は、「ゲーム ループ」が次に呼び出す関数を返すことができます。

def game_loop():
    first_room = living_room

    next_room = first_room()
    while callable(next_room):
        next_room = next_room()

典型的なゲーム コードは、あなたのコードよりもこのようになります。これにはいくつかの利点があります。1 つ目は、再帰が少なくて済み、「スタック」がそれほど深くならないことです。2 つ目は、ルーム間で共通のロジックを適用できることです。たとえば、プレイヤーがどこにいたかを追跡できます。

于 2015-10-10T01:51:06.210 に答える
2

has_keyはLiving_room()の呼び出し前に定義されていますが、そのスコープはLiving_room()から呼び出されたルーチンで定義された同じ名前の変数には浸透しません。これは、Python では関数本体がローカル スコープ ブロックであるためです。関数本体で宣言または割り当てられた変数は、明示的にグローバルに宣言されていない限り、その関数に対してローカルです。

特に、 basement() で定義されたhas_keyは、 basement()ローカル スコープです。これは別の新しいローカル変数です。

basement()でhas_keyに加えられた状態の変更は、Living_room()を呼び出す前に最初に定義 されたhas_keyには反映されません。それらは異なる範囲にあります。

1 つのオプションは、状態が変更されるルーチン (basement() など) でhas_key変数をグローバルに宣言することですが、グローバル変数は多くの場合、ベスト プラクティスとは見なされません。関数内のグローバルの状態を変更すると、見つけにくいバグにつながる可能性があります。おそらくより良い方法は、basement に状態を返させ、呼び出し元でその状態を確認することです。

あなたの関数のいくつかが再帰的であることに気付きました.このコンテキストではそれが最良の選択であるかどうかはわかりませんが、それは別の質問です.

Python 変数のスコープに関する 1 つのチュートリアルとして、 http: //spartanideas.msu.edu/2014/05/12/a-beginners-guide-to-pythons-namespaces-scope-resolution-and-the-legb-rule/ を参照してください。

于 2015-10-10T01:37:55.137 に答える
0

プログラム全体をもう少しオブジェクト指向にして、 has_key をオブジェクトの属性として設定することもできます。self.has_key = False を初期化し、すべての関数を自己の束に費やすinitメソッドであるクラスを追加するだけです。多くのコピーと貼り付けを防ぐために、私はすでにそれを行っています。

 class TextAdventure(object):
    def __init__(self):
        self.has_key = False

    def welcomeMessage(self):
        print "Welcome to my game!!"

    def winnerMessage(self):
        print "You're a winner!! Congratulations!!"
        self.userQuit()

    def userQuit(self): 
        print "Thanks for playing!"

    def living_room(self):
        # This part isn't executing (Boolean doesn't work here)
        # I want the if statement to execute, not the else statement
        if self.has_key == True:
            self.winnerMessage()
            self.userQuit()
        else: 
            print ("\nYou are in the living room. The paint from the walls is tearing off."
            +" There is a door near you, but it seems to be locked. To your west is the"
            +" kitchen, where you can eat some tasty snacks and to your south is a bedroom. ")
            direction = raw_input("Which direction would you like to go? (W)est or (S)outh? You also have the option to (Q)uit. ")
            if direction == "W":
                self.kitchen()
            elif direction == "S":
                self.bed_room()
            elif direction == "N":
                print "Sorry, you can't go north here."
                self.living_room()
            elif direction == "E":
                print "Sorry, you can't go east here."
                self.living_room()
            elif direction == "Q":
                self.userQuit()
            else:
                print "Sorry, that's not a valid direction."
                self.living_room()


    def kitchen(self):
        print ("\nYou are in the kitchen. The water from the sink is slightly running. All of the"
        +" cupboards in the kitchen have been left open, like someone has searched through them."
        +" To your south is the dining room, and to your east is the living room. ")
        direction = raw_input("Which direction would you like to go? (S)outh or (E)ast? You also have the option to (Q)uit. ")
        if direction == "S":
            self.dining_room()
        elif direction == "E":
            self.living_room()
        elif direction == "N":
            print "Sorry, you can't go north here."
            self.kitchen()
        elif direction == "W":
            print "Sorry, you can't go west here."
            self.kitchen()
        elif direction == "Q":
            self.userQuit()  
        else:
            print "Sorry, that's not a valid direction."
            self.kitchen()


    def bed_room(self):
        print ("\nYou are in the bedroom. One of the windows in the room is slightly ajar. The other window"
        +" is shattered with a brick laying on the floor next to it. To your west is the dining room and"
        +" to your north is the living room.")
        direction = raw_input("Which direction would you like to go? (W)est or (N)orth? You also have the option to (Q)uit. ")  
        if direction == "W":
            self.dining_room()
        elif direction == "N":
            self.living_room()
        elif direction == "E":
            print "Sorry, you can't go east here."
            self.bed_room()
        elif direction == "S":
            print "Sorry, you can't go south here."
            self.bed_room()
        elif direction == "Q":
            self.userQuit()
        else:
            print "Sorry, that's not a valid direction."
            self.bed_room()

    def dining_room(self):
        print ("\nYou are in the dining room. It is very hard to see in here due to the dim lighting. You notice a staircase is the"
        +" in the center of the room. To your north is the kitchen, and to your east is the bedroom.")
        direction = raw_input("Which direction would you like to go? (N)orth or (E)ast or go (D)own the staircase? You also have the option to (Q)uit. ")
        if direction == "N":
            self.kitchen()
        elif direction == "E":
            self.bed_room()
        elif direction == "D":
            self.basement()
        elif direction == "S":
            print "Sorry, you can't go south here."
            self.dining_room()
        elif direction == "W":
            print "Sorry, you can't go west here."
            self.dining_room()
        elif direction == "Q":
            self.userQuit()
        else:
            print "Sorry, that's not a valid direction."
            self.dining_room()

    def basement(self):
        print ("\nYou are now in the basement. A cloud of dust passes by you and makes it hard to breath. You move away from the area"
        +" and you notice a key on the floor. You pick up the key and hold onto it. You may use it for later. ")
        direction = raw_input("Press U to go upstairs. You also have the option to (Q)uit. ")
        if direction == "U":
            self.has_key = True
            self.dining_room()
        elif direction == "Q":
            self.userQuit()
        else:
            print "Sorry, the only place you can go is back upstairs."
            self.basement()

def main():
    t = TextAdventure()
    t.welcomeMessage()
    t.living_room()

if __name__ == "__main__":
    main()

素晴らしいゲーム。とても楽しくプレイできました。少し短かったですが、共有してくれてありがとう、そして良い仕事を続けてください!もう少し OOP にする場合は、いくつかのユーザー アクションを提供することもできます。:)

class TextAdventure(object):

    def __init__(self):
        self.has_key = False

    def use(self):
        print 'You used something'

    def eat(self):
        print 'You ate something'

    def drink(self):
        print 'You drank something'


def main():
    t = TextAdventure()
    actions = { 'use' : t.use, 'eat' : t.eat, 'drink' : t.drink }
    a, b, c = actions.keys()
    action = raw_input('Choose what to do [{0}, {1}, {2}]'.format(a,b,c))
    if action in actions:
        actions[action]()
于 2015-10-10T02:58:46.813 に答える