2016-03-24 4 views
1

Я пытаюсь выполнить задание для скалы, бумаги, ножниц для класса.Рок, Бумага, Ножницы - Python

Я получаю ошибку "UnboundLocalError: local variable 'tied' referenced before assignment".

Может кто-нибудь скажет мне, почему я получаю эту ошибку?

import random 

user_score = 0 
computer_score = 0 
tied = 0 

def main(): 
print ("Let's play the game of Rock, Paper, Scissors. ") 

while True: 
    print ("Your current record is", user_score, "wins,", computer_score,  "losses and", tied, "ties") 

    computer_choice = random.randint(1,3) 
    if computer_choice == 1: 
     computer_rock() 
    elif computer_choice == 2: 
     computer_paper() 
    else: 
     computer_scissors()  

def computer_rock(): 
    user_choice = input("1 for Rock, 2 for Paper, 3 for Scissors: ") 
    if user_choice == "1": 
     print ("Draw! You both chose Rock.") 
     tied += 1    
     try_again() 
    elif user_choice == "2": 
     print ("You Win! The computer chose Rock, while you picked Paper.") 
     user_score += 1    
     try_again() 
    elif user_choice == "3": 
     print ("You Lose! You chose scissors, while the computer picked Rock.") 
     computer_score += 1    
     try_again() 
else: 
    print ("ERROR: Invalid entry, please re-enter your choice. ") 
    computer_rock() 

def computer_paper(): 
    user_choice = input("1 for Rock, 2 for Paper, 3 for Scissors: ") 
    if user_choice == "1": 
     print ("You Lose! You chose rock, while the computer picked Paper.") 
     computer_score += 1   
     try_again() 
    elif user_choice == "2": 
     print ("Draw! You both picked Paper.") 
     tied += 1    
     try_again() 
    elif user_choice == "3": 
     print ("You Win! The computer chose Paper, while you picked Scissors.") 
     user_score += 1      
     try_again() 
    else: 
     print ("ERROR: Invalid entry, please re-enter your choice. ") 
     computer_paper() 

def computer_scissors(): 
    user_choice = input("1 for Rock, 2 for Paper, 3 for Scissors: ") 
    if user_choice == "1": 
     print ("You Win! You chose rock, while the computer picked Scissors.") 
     user_score += 1 
     try_again()     
    elif user_choice == "2": 
     print ("You Lose! The computer chose Scissors, while you picked Paper.") 
     computer_score += 1      
     try_again() 
    elif user_choice == "3": 
     print ("Draw! You both picked Scissors.") 
     tied += 1    
     try_again() 
    else: 
     print ("ERROR: Invalid entry, please re-enter your choice. ") 
     computer_scissors() 

def try_again(): 
    choice = input("Play again? Yes or no. ") 
    if choice == "y" or choice == "Y" or choice == "yes" or choice == "Yes": 
     main() 
    elif choice == "n" or choice == "N" or choice == "no" or choice == "No": 
     print ("Thanks for playing. ") 
    else: 
     print ("Try again") 
     try_again() 

main() 
+0

Является ли ваш отпечаток сломанным? - код ниже 'main()' не имеет отступов. – dwjohnston

+2

btw - посмотрите [этот ответ на обзор кода] (http://codereview.stackexchange.com/a/107607/35301), чтобы лучше писать этот код. Что произойдет, если вы хотите расширить свою игру, включив «lizard, spock»? Это много дополнительного кода, который вам придется писать, если вы используете существующую структуру. – dwjohnston

ответ

1

Хотя ответ триптиха является вполне приемлемым (и широко используется), для относительно программист на начальном уровне обычно лучше применять аргументы в функции вместо использования глобального ключевого слова.

Более подробную информацию можно найти в документации Python: https://docs.python.org/3/tutorial/controlflow.html#defining-functions

В сущности, речь идет о программисту передать то, что называется аргумент (или аргументы) в функции, а функция, содержащая те Параметры могут обрабатывать эти данные, а возвращает значения обратно в то место, где оно было вызвано, подобно тому, как работает функция print(). Вы передаете строку (например, «Привет») в функцию print() (например, print («Привет»)), а код внутри этой встроенной функции отображает символы «Привет» на экране.

В этом случае ваш код будет выглядеть примерно так:

# In your main function: 

def main(): 
print ("Let's play the game of Rock, Paper, Scissors. ") 

while True: 
    print ("Your current record is", user_score, "wins,", computer_score, "losses and", tied, "ties") 
     computer_choice = random.randint(1,3) 
    if computer_choice == 1: 
     result = computer_rock(user_score, computer_score, tied) ## Notice the difference here 
    elif computer_choice == 2: 
     result = computer_paper(user_score, computer_score, tied) ## Those variables you put in the function call are arguments 
    else: 
     result = computer_scissors(user_score, computer_score, tied) 


# ... 

# In the computer_rock() function: 
# Even though I only modified this function, you should probably modify all three to suit your needs. 

def computer_rock(user_score, computer_score, tied): ## <-- See the parameters? 
    user_choice = input("1 for Rock, 2 for Paper, 3 for Scissors: ") 
    if user_choice == "1": 
     print ("Draw! You both chose Rock.") 
     tied += 1    
     try_again() 
    elif user_choice == "2": 
     print ("You Win! The computer chose Rock, while you picked Paper.") 
     user_score += 1    
     try_again() 
    elif user_choice == "3": 
     print ("You Lose! You chose scissors, while the computer picked Rock.") 
     computer_score += 1    
     try_again() 
    return [user_score, computer_score, tied] # Returning a list so it is easier to sort variables 

Другая вещь отметить, даже если вы звоните try_again(), чтобы начать игру, это не очень хорошая идея, чтобы позвонить main() внутри функции, которая будет вызываться main(). (По какой-то причине я забыл). Лучше использовать цикл while в основной функции для регулирования и управления потоком программы.

Надеюсь, это помогло!

2

Добавление следующего кода в качестве первой строки в каждом из трех computer_() функций должны исправить вашу проблему.

global tied, user_score, computer_score 

Есть лучшие способы сделать то, что вы делаете, но это должно получить Вас по горбу здесь :)

+2

Вы также должны написать 'global computer_score' и' global user_score', так как эти переменные также изменяются. –

+1

Это решило. Благодарим вас за руководство. – bakervin730

0

Это вызвано функцией в Python. Следующий пример испускает то же самое Исключение. Обратите внимание, что Вы не можете назначить Global-Variable в Локальная область.

>>> variable = 1 
>>> def function(): 
...  variable += 1 
... 
>>> function() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in function 
UnboundLocalError: local variable 'variable' referenced before assignment 

Так что, если вы пишете как ниже, значение Globale-переменной является не изменилось. Эта переменная в Функция() не Глобальная переменная, но Локальная переменная. Правильно?

>>> variable = 1 
>>> def function(): 
... variable = 2 
... 
>>> function() 
>>> variable 
1 

Кстати, эта функция полезна для нас, потому что мы хотим использовать функции как можно меньше, если говорить громко, просто потому, что мы, люди, не понимают длинные функции.

Может быть, вы хотите использовать Global-Variable здесь, но когда вы пишете много и много кодов, и можете использовать Global-Variable, вы будете паник, такие как «Где же это переменных изменения? " потому что есть много мест, которые вы изменили.

Если у нас есть коды, которые мы не можем знать, где мы изменим, эти коды будут таинственными. Это так отвратительно.

Ответ @Triptych также прав. Если вы примете его ответ, эти коды будут работать. Однако я рекомендую вам не использовать глобальный.

p.s. Вы можете сделать это в JavaScript.

Смежные вопросы