Пустыня саверн. счетовод

Подскажите что с моим кодом не так. Герой не сообщает количество монет.
https://codecombat.com/play/level/bookkeeper?

# Эта функция позволяет сражаться до определенного времени
# и сообщите о побежденных врагах.
def fightAndReport(untilTime):
    defeated = 0
    while True:
        enemy = hero.findNearestEnemy()
        if enemy:
            hero.attack(enemy)
            if enemy.health <= 0:
                defeated += 1
        if hero.time > untilTime:
            break
    hero.moveXY(59, 33)
    hero.say(defeated)

# Сражайтесь 15 секунд и скажите Нарии, сколько врагов вы победили.
fightAndReport(15)

# Собирайте монеты, пока часы не достигнут 30 секунд.
coin = hero.findNearestItem()
time = 0
if coin:
    hero.moveXY(coin.pos.x, coin.pos.y) 
if hero.time >= 30:
    time += 1
# Скажите Нарии, сколько золота вы собрали.
hero.say(hero.gold)

# Сражайтесь с врагами до тех пор, пока часы не достигнут 45 секунд.
fightAndReport(45)

Используйте цикл while, проверяя, находится ли время вашего героя выше 15 и ниже 30. Затем найдите ближайший элемент и переместитесь на его позицию. Затем (вне цикла while) перейдите к перекрестным костям и скажите золото вашего героя.

Мне не понятно Ваше первое предложение.

Используйте цикл while, как цикл if.

if hero.time>15 and hero.time<30:

Вместо if используйте while, превратив его в цикл while.

Да, abc прав. Вы забыли положить программу в while true. Без него она не будет повторятся.

Сейчас буду думать. Пока не разобрался.

1 Like

У вас не должно быть нигде истинного цикла while, на этом уровне используются циклы while, поэтому, пока время героя меньше 15, он будет атаковать врагов, а затем через 15 секунд он будет собирать монеты, пока время не станет 30, после этого он будет атаковать до 45 часов.

Это я понимаю. Я не понимаю как это записать в код.

Начните с цикла while.

Где то я не прав.

# Эта функция позволяет сражаться до определенного времени
# и сообщите о побежденных врагах.
def fightAndReport(untilTime):
    defeated = 0
    while True:
        enemy = hero.findNearestEnemy()
        if enemy:
            hero.attack(enemy)
            if enemy.health <= 0:
                defeated += 1
        if hero.time > untilTime:
            break
    hero.moveXY(59, 33)
    hero.say(defeated)

# Сражайтесь 15 секунд и скажите Нарии, сколько врагов вы победили.
fightAndReport(15)

# Собирайте монеты, пока часы не достигнут 30 секунд.
coin = hero.findNearestItem()
time = 0
if coin:
    hero.moveXY(coin.pos.x, coin.pos.y) 
while hero.time>15 and hero.time<30:
    time += 1
# Скажите Нарии, сколько золота вы собрали.
hero.say(hero.gold)

# Сражайтесь с врагами до тех пор, пока часы не достигнут 45 секунд.
fightAndReport(45)

Замените все это только оператором while. После замены кода внутри цикла while найдите ближайший элемент и переместитесь к его положению, если он существует.

Мне тяжело понять, я делаю что то не так.`
``

Эта функция позволяет сражаться до определенного времени

и сообщите о побежденных врагах.

def fightAndReport(untilTime):
defeated = 0
while True:
enemy = hero.findNearestEnemy()
if enemy:
hero.attack(enemy)
if enemy.health <= 0:
defeated += 1
if hero.time > untilTime:
break
hero.moveXY(59, 33)
hero.say(defeated)

Сражайтесь 15 секунд и скажите Нарии, сколько врагов вы победили.

fightAndReport(15)

Собирайте монеты, пока часы не достигнут 30 секунд.

coin = hero.findNearestItem()
time = 0
while coin:
hero.moveXY(coin.pos.x, coin.pos.y)
while hero.time>15 and hero.time<30:
time += 1

Скажите Нарии, сколько золота вы собрали.

hero.say(hero.gold)

Сражайтесь с врагами до тех пор, пока часы не достигнут 45 секунд.

fightAndReport(45)

Часть, которая здесь неверна, - это ваш сбор монет.

coin = hero.findNearestItem()
time = 0
if coin:
    hero.moveXY(coin.pos.x, coin.pos.y) 

Удалить time = 0 часть. Тогда остальная часть этой части должна быть внутри цикла while. удалять time+=1.

Так было бы:

while hero.time>15 and hero.time<30:
    variable = hero.findNearestItem()
    #assign the variable
    if variable: 
    #check if the variable exists
    hero.moveXY(variable.pos.x,variable.pos.y)
        #move to the variable's position

То есть поменять строки местами?

Да, поменяйте местами строки над циклом while и сделайте для них отступ. Затем удалите временные рамки.

Что за временные рамки? Не понял

Это типа while hero.time>15 and hero.time<30: .

Я должен обозначить 30 сек, что бы герой закончил собирать монеты и сообщил их количество Нарии. Но как мне прописать? Hero.time >=30: ? И потом, время должно вести отсчет от 0, это так же надо обозначить time = 0 ? Или как иначе код прописать правильно? У меня именно этот момент не получается продумать.

Вот почему существует цикл while, поэтому только когда время героя больше 15 и меньше 30, код внутри цикла будет выполняться.