我遇到的主要问题是当用户正在玩电脑时(随机功能)试图获得总胜利损失和关系。但是每当我为player_choice输入摇滚剪刀的1,2或3时,我都会收到此错误。
Welcome to a game of paper, rock, scissors!
Please input the correct number according
to the object.
Select rock(1), paper(2), or scissors(3): 2
Computer chose ROCK .
You chose PAPER .
Traceback (most recent call last):
File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line
114, in <module>
File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line
43, in main
File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line
106, in determine_winner
builtins.UnboundLocalError: local variable 'win' referenced before assignment
显然是一个局部变量问题。还有其他解决方案吗? 这是我的代码:
#import the library function "random" so that you can use it for computer
#choice
import random
#define main
def main():
#assign win, lose, and tie variables to zero so that later it can be added
#and displayed
win = 0
lose = 0
tie = 0
#control loop with 'y' variable
play_again = 'y'
#start the game
while play_again == 'y':
#make a welcome message and give directions
print('Welcome to a game of paper, rock, scissors!')
print('Please input the correct number according')
print('to the object.')
#write computer and players choices as value returning functions and
#assign them to variables
computer_choice = get_computer_choice()
player_choice = get_player_choice()
#print outcome
print('Computer chose', computer_choice, '.')
print('You chose', player_choice, '.')
#determine who won by defining a function
determine_winner(computer_choice, player_choice)
#ask the user if they want to play again
play_again = input("Play again? Enter 'y' for yes or 'n' for no. ")
#print results
print('Your total wins are', win, '.')
print('Your total losses are', lose, '.')
print('Your total ties are', tie, '.')
#define computer choice
def get_computer_choice():
#use imported random function from library
choice = random.randint(1,3)
#assign what the computer chose to rock, paper, or scissors
if choice == 1:
choice = 'ROCK'
elif choice == 2:
choice = 'PAPER'
else:
choice = 'SCISSORS'
#return value
return choice
#define player choice
def get_player_choice():
#assign input to variable by prompting user
choice = int(input("Select rock(1), paper(2), or scissors(3): "))
#use while function if user inputs the invalid selection
while choice != 1 and choice != 2 and choice != 3:
print('The valid numbers are rock(type in 1), paper(type in 2),')
print('or scissors(type in 3).')
choice = int(input('Enter a valid number please: '))
#assign what the player chose to rock, paper, or scissors
if choice == 1:
choice = 'ROCK'
elif choice == 2:
choice = 'PAPER'
else:
choice = 'SCISSORS'
#return value
return choice
#determine the winner by assigning the assigned variables
def determine_winner(computer_choice, player_choice):
#if its a tie, add 1 to tie variable and display message
if computer_choice == player_choice:
tie += 1
print("It's a tie!")
#if its a win, add to win variable and display message
elif computer_choice == 'SCISSORS' and player_choice == 'ROCK':
win += 1
print('ROCK crushes SCISSORS! You win!')
elif computer_choice == 'PAPER' and player_choice == 'SCISSORS':
win += 1
print('SCISSORS cut PAPER! You win!')
elif computer_choice == 'ROCK' and player_choice == 'PAPER':
win += 1
print('PAPER covers ROCK! You win!')
#if it does not match any of the win criteria then add 1 to lose and
#display lose message
else:
lose += 1
print('You lose!')
main()
答案 0 :(得分:1)
函数determine_winner()
无法看到您在win
中定义的变量tie
,lose
和main()
。因此,您无法执行win +=1
。
你通常不会在Python中使用main()
例程(我最近在这里看过一些使用它们的问题 - 无论是谁教这个?),但即使你将其内容移到顶端程序的级别,它将无法工作,因为win += 1
仍然会因同样的原因而失败。
您可以在win
中定义局部变量tie
,lose
和determine_winner()
并让它返回它们的值,然后将它们添加到顶级代码中的相应变量中。实际上,你根本不需要那个函数中的那些变量。
例如:
def determine_winner(computer_choice, player_choice):
#if its a tie, add 1 to tie variable and display message
if computer_choice == player_choice:
print("It's a tie!")
return 0
#if its a win, add to win variable and display message
elif computer_choice == 'SCISSORS' and player_choice == 'ROCK':
print('ROCK crushes SCISSORS! You win!')
return 1
elif computer_choice == 'PAPER' and player_choice == 'SCISSORS':
print('SCISSORS cut PAPER! You win!')
return 1
elif computer_choice == 'ROCK' and player_choice == 'PAPER':
print('PAPER covers ROCK! You win!')
return 1
#if it does not match any of the win criteria then add 1 to lose and
#display lose message
else:
print('You lose!')
return -1
并在顶层:
result = determine_winner(computer_choice, player_choice)
if result == -1:
lose += 1
elif result == 0:
tie += 1
else:
win += 1
答案 1 :(得分:1)
您可以让您的变量赢,输并全球化。在这里,他们不是。 How to make them global
编辑:我同意制作全球不是一个好的解决方案。
答案 2 :(得分:0)
Python使用词法作用域。这意味着如果在函数内部定义了变量,则该函数外部的代码无法看到它(除非它被标记为global
)。
快速而肮脏的修复方法是将win
以及需要从main
外部看到的任何其他变量标记为global
。更好的解决方案是重构代码。