私はこのエラーを修正して、勝ったすべてのゲームのポイントを加算してラウンドを取り除くことはできません。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()
変数代入(関数代入を含む)は、順番に行われます。グローバル定義を一番上に移動するとうまくいくはずです。また、このプログラミングでは、[オブジェクト指向の原則](https://www.tutorialspoint.com/python/python_classes_objects.htm)を使用しています。おそらく 'round'、' point'、 'bpoint'はクラスプロパティですグローバル値よりも –
グローバル変数は使用しないでください。関数のパラメータと戻り値はこのために作成されます。 –
絶対変数**が必要でない限り、グローバル変数はあなたが到達するものであってはなりません。この場合、私はそれらを使用する利点を見ることはできません。明示的に引数を関数に渡し、関数から明示的に値を返します。小さなテスト以上のプログラムを作成すると、グローバル変数があらゆる種類の問題を引き起こします。 – Carcigenicate