Назначение переменной в функции

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

Вот сценарий:

import random

while True:
    HEALTH = 20
    ENEMY_HEALTH = 20

    def punch():
        mylist = (xrange(0,3))
        x = random.choice(mylist)
        if x == 3:
            print"your hit was very effective enemy lost 3 hp"
            print("Enemy Health is" ENEMY_HEALTH - x)
        if x == 2:
            print "Your punch was effective enemy lost 2 hp"
            print("Enemy Health is" ENEMY_HEALTH - x)
        if x == 1:
            print "enemy lost 1 point"
            print("Enemy Health is" ENEMY_HEALTH - x)

    def kick():
        mylist = (xrange(0,5))
        x = random.choice(mylist)
        if x > 3:
            "%d" % x
            print"your kick was very effective enemy lost %d hp"
            print("Enemy Health is", ENEMY_HEALTH - x)
        if x > 1 < 3:
            "%d" % x
            print "Your kick was effective enemy lost %d hp"
            print("Enemy Health is" ENEMY_HEAlTH - x)
        if x == 1:
            print "enemy lost 1 point"
            print("Enemy Health is" ENEMY_HEALTH - x)

    def attackChoice(c):
        if c == "punch":
            punch()
        if c == "kick":
            kick()

    c = raw_input("Choice Attack\nKick Or Punch: ")
    attackChoice(c)

Я хочу это напечатать:

choose attack
kick or punch:kick
enemy lost 3 hp
enemy's heath is 17
choose attack
kick or punch:punch
enemy lost 1 hp
enemy's health is 16

2 ответа

Решение
  • Как отметил Блендер, вы не меняете значение ENEMY_HEALTH, вы просто вычитаете из него значение x и печатаете его, не присваивая это значение обратно.
  • переместите свое первоначальное назначение из цикла while.
  • у вас есть лишняя строка в вашем коде удара
  • используйте randint вместо построения списка и выбора одного

может быть, как:

import random
health = 20
enemy_health = 20

def punch():
    global enemy_health
    x = random.randint(1,3)
    enemy_health -= x
    if x == 3:
        print"your hit was very effective enemy lost 3 hp"
    if x == 2:
        print "Your punch was effective enemy lost 2 hp"
    if x == 1:
        print "enemy lost 1 point"
    print "Enemy Health is", enemy_health

def kick():
    global enemy_health
    x = random.randint(1,5)
    enemy_health -= x
    if x > 3:
        print "your kick was very effective enemy lost %d hp" % x
    if x > 1 < 3:
        print "Your kick was effective enemy lost %d hp" % x
    if x == 1:
        print "enemy lost 1 point"
    print "Enemy Health is", enemy_health

def attackChoice(c):
    if c == "punch":
        punch()
    if c == "kick":
        kick()

while True:
    c = raw_input("Choice Attack\nKick Or Punch: ")
    attackChoice(c)

Вы сбрасываете ЗДОРОВЬЕ и ENEMY_health на каждом шаге цикла. Вы должны инициализировать их вне цикла и выполнять манипуляции внутри цикла, например:

HEALTH = 20
ENEMY_HEALTH = 20    
while True:
    #your code
    ENEMY_HEALTH = ENEMY_HEALTH - x

Кроме того, вам нужно явно установить новое значение, как показано в примере фрагмента.

Также, пожалуйста, прочитайте руководство по стилю Python: http://www.python.org/dev/peps/pep-0008/

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

Другие вопросы по тегам