Ошибка Python: UnboundLocalError: локальная переменная 'score1', на которую ссылается перед назначением - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь сделать простую игру с броском игральных костей, в которой два игрока бросают кости один раз за пять раундов, и выигрывает человек с наибольшим количеством очков.

Я уже пытался установить для переменной Score1 значение 0 в пределахфункции и вне функции, однако это приведет к тому, что счет будет каждый раз сбрасываться в 0.

#setting the scores as 0 before.
score1=0
score2=0

def round1():
    print('Round 1, lets go')
    input("Player 1 press ENTER to roll dice")
    diceroll1()
    input("Player 2 press ENTER to roll dice")
    diceroll2()
    round2()
#Round 1, calls upon dice roll functions and.

#dice roll function for player 1
def diceroll1():
    import random
    number = random.randint(1,6)
    print("Your number is: " + str(number))
    if number % 2 == 0:
        number = number + 10
        score1 = score1 + number
        print("Your new score is: " + str(score1))
    else:
        number = number - 5
        score1 = score1 + number
        print("Your new score is: " + str(score1))
    if score1 < 0:
        score1 = 0
    else:
        score1=score1

#dice roll function for player 2
def diceroll2():
    import random
    number = random.randint(1,6)
    print("Your number is: " + str(number))
    score2
    if number % 2 == 0:
        number = number + 10
        score2 = score2 + number
        print("Your new score is: " + str(score2))
    else:
        number = number - 5
        score2 = score2 + number
        print("Your new score is: " + str(score2))
    if score2 < 0:
        score2 = 0
    else:
        score2=score2

Я хочу, чтобы он просто добавил значение кости в счет, но я получаю эту ошибку:

UnboundLocalError: локальная переменная 'score1', на которую ссылается перед присваиванием

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Это просто очень распространенный вопрос для Python. Ниже мой ответ где-то еще.

global и nonlocal очень странные вещи, когда я был новичком.

Подумайте только: зачем они нужны в Python?

Это потому, что нам не нужны var, let и подобные вещи для объявления переменных.

Подумайте о Javascript, это тоже динамический язык сценариев и очень похожий на python, но для объявления переменных ему нужно var или let или const.

Самая важная вещь для объявления переменных - это определение области видимости.

Итак, в Python наши переменные имеют неявную область видимости по умолчанию: текущую область видимости, в которой они определены, и если мы хотим изменить область видимости некоторых переменных, нам нужно явно использовать global или nonlocal.

Все имена в левой части = означают определение переменных.

Перед выполнением кода некоторой определенной области, Python предварительно вычислит все local variables, которые находятся в левой части =. Вот почему вы получили UnboundLocalError: local variable 'X' referenced before assignment в:

def foo():
    X = X + 10

Итак, если мы посмотрим эти имена не в определенной текущей области, просто следуйте правилам цепочки прицелов: вверх, вверх, вверх и до built_in.

Помните : область любого имени в левой части = является текущей областью по умолчанию, и вы должны назначить ее (связать с ней что-то) перед ссылкой на нее.

Глобальная и локальная область видимости в Python - переполнение стека

0 голосов
/ 20 июня 2019

Вы должны использовать «глобальный» идентификатор.

Несколько замечаний по поводу кода:

1) импорт должен быть в верхней части кода. И достаточно один раз импортировать библиотеку. 2) Вам не нужно переопределять значение переменной для ее собственного значения. Как эта оценка2 = оценка2. Просто не делай этого. 3) Я рекомендую вам использовать цикл while, чтобы сделать игру бесконечным, или цикл for для постоянного количества раундов. 4) Просмотрите ваш код и посчитайте дубликаты. Их очень много. Попробуйте уменьшить число.

Я изменил ваш код и жил там с некоторыми интересными функциями, которые помогут вам в будущем и сейчас.

from random import randint


#setting the scores as 0 before.
score1=0
score2=0


#dice roll function for player 1
def diceroll1():
    global score1
    import random
    number = randint(1,6)
    print(f"Your number is: {str(number)}")

    number += - 5 if number % 2 else 10
    score1 += number

    if score1 < 0:
        score1 = 0

    print(f"Your new score is: {str(score1)}")


#dice roll function for player 2
def diceroll2():
    global score2
    import random
    number = randint(1,6)
    print(f"Your number is: {str(number)}")

    number += - 5 if number % 2 else 10
    score2 += number

    if score2 < 0:
        score2 = 0

    print(f"Your new score is: {str(score2)}")


def game_loop():
    for _ in range(int(input("Raound number: "))):
        print('Round 1, lets go')
        input("Player 1 press ENTER to roll dice")
        diceroll1()
        input("Player 2 press ENTER to roll dice")
        diceroll2()
        print()


if __name__ == "__main__":
    game_loop()

Далее попробуйте сделать из этих двух функций одну.

...