1

Python でアドベンチャー ゲーム プログラムの一部を作成しようとしています。ほとんどの作業は完了していますが、関数チェーンの 1 つの分岐の最後で "True" として宣言された値を返そうとしています。基本的に、これはモンスターとの戦いであり、適切なオプションを選択すると勝つことができます。勝つと、彼が守っていた弓を手に入れることができます。戦いのコードは次のとおりです。

#The first line imports all the text displayed in the game, saved in gametext.py
#For purposes of clarity, all text has been saved to variables imported by the file.
#Any variable that is not "HaveBow", "why" or declared by a raw_input() is actually text.

from gametext import *

def BG_fight():

    print BowGuardIntro
    print InitOptions

    BGfirstmove = raw_input('> ')

    if BGfirstmove == "1":
        spearfight()
    elif BGfirstmove == "2":
        dead(BGUnarmed1) 
    else:
        dead(BGUnarmed2)

def spearfight():        
    print GotSpear
    print SpearFight

    spearact = raw_input("> ")

    if spearact == "1":
        blindfight()
    elif spearact == "2":
        dead(SeeChest)
    elif spearact == "3":
        dead(SeeArms)
    else:
        dead(NoUseSpear)

def blindfight():
    print BlindFight

    followblow = raw_input("> ")

    if followblow == "1":
        print Victory
        HaveBow = True
        return HaveBow

    elif followblow == "2":
        dead(BlindArms)
    else:
        dead(BlindNoKill)

def dead(why):
    print why
    exit(0)

BG_fight()

(もし人々が興味を持っているなら、ゲームテキストファイルの内容を作成することもできますが、それは長く、私が抱えている問題とは何の関係もないので、むしろしたくありません)

ご覧のとおり、1 つの分岐のみが勝利条件 (私が返したい HaveBow = True 値を与える) を提供し、2 つの関数が深くネストされ、if ステートメントの一部になっています。私が知りたいのは、その "HaveBow = True" 値を関数チェーンの外に戻す方法です。これにより、ゲームの他の部分で使用できますか? コーディングしようとすると:

HaveBow = blindfight()
print HaveBow

コードの最後でそれを実行しようとすると、「True」と宣言する前に、ゲームのその部分を 2 回繰り返すだけです。ブラインドファイト() の代わりに BG_fight() を試しても同じことが言えます。しかし、私はそれを望んでいません。ゲームの他の部分で条件「HaveBow = True」を使用できるように、「HaveBow」に「True」が必要なだけです。

要するに、私の質問は、ネストされた関数チェーンから、そのチェーンのコードを繰り返さずに値を返すことができるかどうかです。

ありがとう。

4

1 に答える 1

3

名前と値ではなく、のみを返すことができます。つまり、「HaveBow = True を返す」ことはできません。できることは、True を返すことだけです。値を返すと同時に、関数の外部に存在する変数に代入する方法はありません。値を割り当てたい場合は、関数の外で行う必要があります。

あなたの言うことから、HaveBow をプログラムのどこでも使用できるグローバル変数にしたいようです。その場合、コードを次のように変更できますblindfight

if followblow == "1":
    global HaveBow
    print Victory
    HaveBow = True

この場合、True 値を返す必要はありませ。グローバル変数に直接割り当てるだけです。

最終的には、コードを構造化するためのより良い方法がありますが、それらの問題はこの質問の範囲外です。今のところ、HaveBow「ゲーム内のどこでも」使用できるようにしたいようなグローバル状態がある場合globalは、例で示したように使用してそれらのグローバル変数を作成することをお勧めします。より多くのプログラミングを学習するにつれて、グローバル変数を使用することが通常は最善のアイデアではない理由が徐々にわかりますが、このプログラムの目的では、それが最も簡単な解決策です。

于 2014-04-16T07:26:41.860 に答える