когда я пытаюсь определить код, он не работает - PullRequest
0 голосов
/ 19 ноября 2018

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

while enemy_score>=0:
    if picked_troop == 1 or picked_troop == 2 or picked_troop == 3:
        shoot = input()
        if shoot == 'w':
            enemy_score -= random.randint(1, 10)
            print(enemy_score)
            if enemy_score<0:
                break

enemy_score уже был установлен на 50, и строка «если выбранный отряд» должна убедиться, что код стрельбы нуждаетсязапускать как стрелять больше 0 в начале кода (потому что стрелять = 50).Я попытался изменить код на ..

def kill(enemy_score=None):
    shoot = input()
    if shoot == 'w':
        enemy_score -= random.randint(1, 10)
        print(enemy_score)

, поэтому я заменил все с shoot = input() на kill ,,,, однако, когда я делаю это, программа принимает случайное число 0, когда клавиша wнажмите, а затем снова вернитесь к 50.так в консоли это выглядит так

w
46
w
47
w
46
w
48

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

w
47
w
41
w
31
etc

1 Ответ

0 голосов
/ 19 ноября 2018

Проблема в объеме. enemy_score в вашей функции kill() - это не то же самое enemy_score, которое существует вне функции. Скажем, у вас есть эта договоренность:

enemy_score = 50
...
def kill(enemy_score):
    enemy_score -= 10
    print(enemy_score)

print(enemy_score)
kill(enemy_score)
print(enemy_score)

Вы увидите, что вывод этого фрагмента

50
40
50

Другими словами, enemy_score из внешней области видимости явно не меняется, тогда как enemy_score внутри функции явно делает .


Дело в том, что когда вы определяете kill(enemy_score=...), вы делаете следующее: «Я хочу, чтобы функция называлась kill, и я хочу, чтобы она вызывалась с одним аргументом, который назначен переменной с именем enemy_score «. Python знает, что у вас уже есть переменная enemy_score, но вы объявили, что вне этой функции, и ясно, что если вы определяете ее по-разному внутри функции, то , пока вы находитесь внутри функции, python будет использовать версия изнутри функции . Внешние enemy_score и внутренние enemy_score являются различными переменными , и в результате изменение внутреннего enemy_score не изменяет внешнее enemy_score.

Когда python вызывает функцию с переменной (например, kill(enemy_score)), он не передает саму переменную (называемую передачей по ссылке - некоторые другие языки программирования делают это, и если в этом случае изменение внутреннего enemy_score изменило бы внешнее enemy_score). Скорее, он передает значение - он копирует значение enemy_score и отправляет его функции.


Теперь есть два способа решения этой проблемы. Во-первых, вместо передачи enemy_score в качестве переменной, наследовать ее из глобальной области видимости:

enemy_score = 50
...
def kill():
    global enemy_score   # <----
    enemy_score -= 10
    print(enemy_score)

print(enemy_score)
kill()
print(enemy_score)

Это печатает 50 40 40.

Тот факт, что вы должны сказать global enemy_score, - это странная причуда python, но вы должны сделать это, если хотите вывести переменную из глобального пространства имен внутри функции.

Вторым решением будет kill() вернуть значение внутреннего enemy_score после его изменения, а затем присвоить его внешнему enemy_score:

enemy_score = 50
...
def kill(enemy_score):
    enemy_score -= 10
    print(enemy_score)
    return enemy_score    # <----

print(enemy_score)
enemy_score = kill(enemy_score)
print(enemy_score)

Также печатается 50 40 40, как и ожидалось.

Оба эти решения довольно распространены, хотя то, что лучше использовать, зависит от ситуации. В этом случае я бы рекомендовал использовать вторую версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...