2017-01-05 3 views
-1

私はこのエラーを修正して、勝ったすべてのゲームのポイントを加算してラウンドを取り除くことはできません。TまたはFのゲームでグローバル変数を使用しようとしています

あなたがプレイしたいラウンド数を選んで、それぞれをプレイするときに、1が「丸い」変数から外れて0になると、もうプレイできなくなり、スコア機能にまっすぐに進みます。

ポイントは(すべてのラウンドが完了した後に)あなた/ボットが最後に勝った人を確認するために、

を獲得している何のゲームを追跡するためにしている私は、次のエラーを取得する:

Traceback (most recent call last): 
    File "python", line 99, in <module> 
    File "python", line 13, in login 
    File "python", line 30, in start 
    File "python", line 33, in rcheck 
UnboundLocalError: local variable 'round' referenced before assignment 
from time import sleep 
import random 

print("Rock, Paper, Scissors. By Leona Bryant") 
print("") 

def login(): 
    username=input("Username: ") 
    password=input("Password: ") 
    if (username == "shinleona") and (password == "hacker101"): 
    print ("") 
    print ("Welcome back Leona!") 
    start() 
    else: 
    print("") 
    print ("Invalid credidentals, try again.") 
    login() 


def start(): 
    print("") 
    round=int(input("How many rounds would you like to play? Please pick from 3-10")) 
    if (round <3): 
    print("Invalid number, try again.") 
    start() 
    else: 
    print("") 
    print("Loading..") 
    sleep(3) 
    rcheck() 

def rcheck(): 
    if (round <=0): 
    print("End of game!") 
    print("Calculating scores...") 
    score() 
    else: 
    round-=1 
    game() 


def game(): 
    print("") 
    rps=("rock" , "paper" , "scissors") 
    bot = random.choice(rps) 
    user=input("Rock..Paper..Scissors..SHOOT!").lower() 
    print("The bot chose" , bot) 

    if (bot == user): 
    print ("This round was a draw, you both gain 1 point!") 
    point+=1 
    bpoint+=1 
    rcheck() 

    elif ((bot == "paper") and (user == "rock")) or ((bot == "scissors") and (user == "paper")) or ((bot == "rock") and (user == "scissors")): 
    print ("You Lose this round, Bot gains 1 point!") 
    bpoint+=1 
    rcheck() 

    else: 
    print("You won this round, User gains 1 point!") 
    point+=1 
    rcheck() 




def score(): 
    if (point > bpoint): 
    print("Congratulations, you won the game with" , point , "points") 
    again() 

    else: 
    print("Sorry, you lost the game. The bot won with" , bpoint , "points") 
    again() 


def again(): 
    play=input("Play again?").lower 
    if (play[0] == "y"): 
    start() 

    elif (play[0] == "n"): 
    print("Thanks for playing!") 
    exit() 

    else: 
    print ("Invalid answer, try again.") 
    again() 

round = 0 
point = 0 
bpoint = 0 

global round 
global bpoint 
global point 

login() 
+1

変数代入(関数代入を含む)は、順番に行われます。グローバル定義を一番上に移動するとうまくいくはずです。また、このプログラミングでは、[オブジェクト指向の原則](https://www.tutorialspoint.com/python/python_classes_objects.htm)を使用しています。おそらく 'round'、' point'、 'bpoint'はクラスプロパティですグローバル値よりも –

+6

グローバル変数は使用しないでください。関数のパラメータと戻り値はこのために作成されます。 –

+0

絶対変数**が必要でない限り、グローバル変数はあなたが到達するものであってはなりません。この場合、私はそれらを使用する利点を見ることはできません。明示的に引数を関数に渡し、関数から明示的に値を返します。小さなテスト以上のプログラムを作成すると、グローバル変数があらゆる種類の問題を引き起こします。 – Carcigenicate

答えて

1

global

は、それが変更された値は、外部(モジュール)の範囲であることを示すために、関数内で使用される:

はここに私のコードです。これはモジュールレベルのコードでは役に立たない。行を削除する必要があります。

global round 
global bpoint 
global point 

MATLABでは、名前をグローバルに使用できるようにします。 Pythonでは、変数はモジュールスコープで既に定義されているため、何もしません。

global roundrcheck(対応する行はグローバル変数を使用する関数に対応しています)を追加してください。これは、関数内の名前roundが実際にはグローバル変数、つまりモジュールで定義されていることをPythonに伝えます。 globalステートメントがなければ、関数はround = round + 1を実行しようとしますが、右側のroundは関数の有効範囲に定義されていません。

もちろん、回避することができる場合は、グローバルを使用しないでください。すべての必要な状態と機能を持つクラスを作成するか、少なくとも値を関数に渡し、戻り値で更新を受け入れます。

+0

ありがとう!本当にうまくいった。 – ShinLeona

0

あなたは)(あなたのrcheckの先頭に以下を追加する方法にグローバル変数に持っていない方法:

global round 

これは、このグローバル変数を使用できるようにする必要があります。

関連する問題