Вопросы о синтаксисе Python в CodeCombat

Решил я на старости лет поучиться программированию, нашел этот очень удобный ресурс ,но столкнулся с проблемой . Не понимаю очень многих моментов в объяснениях к примеру hero.findItems() возвращает массив всех предметов в зоне видимости выглядит это так
items = hero.findItems() так вот куда он это возвращает можно как то узнать тип type этого итемс что можно сделать с ним и еще куча вопросов. Есть какой то чат в котором разбирают подобные моменты ? Я понимаю что еще в начале пути и чем дальше тем больше будет вопросов. может быть есть какой то ресурс где могут разжевать такие вопросы ? Очень желательно на русском. vk facebook телеграмм да что угодно. Помощь в прохождении не нужна только объяснение синтаксиса и разных моментов не очевидных для полного нуба в программировании.

Привет, Араксус,
Я понимаю, почему на первый взгляд кодирование может показаться немного запутанным.
О массивах: позвольте мне привести пример использования массивов в разных настройках:

enemies = hero.findEnemies() # это найти список всех врагов в поле зрения, как вы сказали

enemy = hero.findNearest(enemies) #это то же самое, что и функция:

enemy = hero.findNearestEnemy() #Эта строка важна, потому что вы не можете найти тип массива. 

#Например, вам нужно получить одного врага: ближайшего, чтобы проверить его тип и, возможно, атаковать его.

if enemy.type == "munchkin": #теперь, когда у нас выделен один враг, мы можем проверить его тип
    hero.attack(enemy) #и мы можем также атаковать его

Я думаю, что самое важное в массивах - это понять, какие функции вы можете использовать для каких элементов массива.
Поэтому, если вы найдете ближайший предмет, вы можете проверить его тип и подобрать его.
Но вы не можете проверить тип массива.
Есть несколько функций, которые вы используете для массивов.
Вот один из самых простых, который часто появляется на более поздних уровнях:

items = hero.findItems()

python:

number = len(items) #возвращает его длину в числе.

javascript:

number = items.length #делает то же самое.

О том, что есть место, чтобы поговорить о коде, я не думаю, что есть.
Но вы всегда можете задать новые вопросы по этой теме, и я, или другой человек в беседе, могу ответить на них.
Если бы вы сделали это, я бы переименовал тему примерно так:
Вопросы о синтаксисе Python в CodeCombat.
И вы всегда сможете размещать свои посты там, чтобы никто не говорил, что вы не по теме (это случается довольно часто).
Надеюсь, это поможет,
:lion: :lion: :lion:

1 Like

прохожу "месиво сакрвена 4"столкнулся с такой проблеммой typeError: cannot read proptrty “health” of null

code
# Выживи две минуты.
# Если выиграешь, то сложность и награда возрастут.
# Если проиграешь, то придется подождать сутки до следующей попытки.
# Помни: каждая игра генерируется случайно.
def dl15(target):#  вампирик рэнж 15
    if target:
        distance = hero.distanceTo( target)
        if distance<15:
            if hero.canCast("drain-life", target):
                hero.cast("drain-life",  target)

def burl():
    if hero.canCast("summon-burl"):
        hero.cast("summon-burl")

def zomb():
    if hero.canCast("summon-undead"):
        hero.cast("summon-undead")

def zomb2():
    if hero.canCast("raise-dead"):
        hero.cast("raise-dead")

def ata(target):
    if target:
        hero.attack( target)

def invi():
    if hero.canCast("invisibility", hero):
        hero.cast("invisibility", hero)

x=0

enemyName = ["shaman","thrower","fangrider","brawler","scout","ogre"]
enemyIndex=0
while True :
    targets1 = hero.findByType("shaman")
    targets2 = hero.findByType("thrower")
    targets3 = hero.findByType("fangrider")
    targets4 = hero.findByType("brawler")
    targets5 = hero.findByType("ogre")
    targets6 = hero.findByType("scout")
    hero.say(" присваиваем имена1")
    burl()
    zomb()
    zomb2()
    if targets1:
        target1 = hero.findNearest(targets1)
        while target1.health>0:
            dl15(target1)
            ata(target1)
            hero.say("выбираем ближайшего шама и бьем ")
    if targets2:
        target2 = hero.findNearest(targets2)
        while target2.health >= 0:
            dl15(target2)
            ata(target2)
            hero.say("выбираем ближайшего лучника и  бьем ")
    if targets3:
        target3 = hero.findNearest(targets3)
        while target3.health > 0:
            dl15(target3)
            ata(target3)
            hero.say("выбираем ближайшего летуна и бьем ")
    if targets4:
        target4 = hero.findNearest(targets4)
        while target4.health > 0:
            dl15(target4)
            ata(target4)
            hero.say("выбираем ближайшего броулера и  бьем ")
    if targets5:
        target5 = hero.findNearest(targets5)
        while target5.health > 0:
            dl15(target5)
            ata(target5)
            hero.say("выбираем ближайшего огра и бьем ")
    if targets6:
        target6 = hero.findNearest(targets6)
        while target6.health > 0:
            dl15(target6)
            ata(target6)
            hero.say("выбираем ближайшего скаута и бьем ")
    
    hero.say(x)
    x+=1

    



я считаю, что проблему вызывает то что код находит 2 переменных и target имеет 2 переменных к примеру 0 и 100 подскажите как оптимизировать код ? возможно ли удалить старый target ?

И снова здравствуйте,
Он не может найти работоспособность ни одной из целей, потому что вы только проверили, существует ли массив. Массив всегда будет существовать, даже если в нем нет целей. Что вам нужно сделать, это проверить, существует ли ваша конкретная цель, или вы проверите здоровье цели, которая не существует.
Надеюсь, это поможет,

Hello again,
It can’t find the health of any of the targets because you’ve only checked whether the array exists. The array will always exist even if there aren’t any targets in it. What you need to do is to check whether your specific target exists, or you’ll check the health of a target who doesn’t exist.
I hope this helps,

:lion: :lion: :lion:

Доброго времени суток . Уровень ice hunter . код почему то задевает других быков . не могу понять где ошибка

# Охоться на 4 яков. Выбирай только самых маленьких.
# Имена небольших яков содержат подстроку "bos".
# Эта функция проверяет, содержится ли подстрока в слове.
def isSubstring(word, substring):
    # Мы перебираем только начальные индексы.
    rightEdge = len(word) - len(substring)
    # Перебери индексы слова.
    for i in range(rightEdge + 1):
        # Для каждого из них пробегись по подстроке.
        for j in range(len(substring)):
            # Используй смещение для индексов слова.
            shiftedIndex = i + j
            # Если буквы не совпадают:
            if word[shiftedIndex] != substring[j]:
                # Проверь следующий начальный индекс.
                break
            # Это была последняя буква в подстроке:
            if j == len(substring) - 1:
                # Подстрока имеется в слове.
                return True
    # Мы не нашли подстроки в слове.
    return False

# Перебери всех врагов.
enemies = hero.findEnemies()
for e  in range(len(enemies)):
    enemy = enemies[e]
    name = enemy.id
    if isSubstring(name, "bos"):
        # Используй функцию `isSubstring` для проверки
        # Если имя врага (id) содержит "bos":
        while True:
            distance = hero.distanceTo(enemy)
            if hero.isPathClear(hero.pos, enemy.pos):
                    
                if distance<15:
                    if hero.canCast("drain-life", enemy):
                        hero.cast("drain-life", enemy)
                if distance < hero.attackRange:
                    hero.attack(enemy)
                # Тогда победи его.
                if enemy.health <= 0:
                    break

Здравствуйте. Я вообще-то прохожу на JavaScript, не силён в синтаксисе Python, но вот так у меня работает:

Код Python
# Охоться на 4 яков. Выбирай только самых маленьких.
# Имена небольших яков содержат подстроку "bos".
# Эта функция проверяет, содержится ли подстрока в слове.
def isSubstring(word, substring):
    # Мы перебираем только начальные индексы.
    rightEdge = len(word) - len(substring)
    # Перебери индексы слова.
    for i in range(rightEdge + 1):
        # Для каждого из них пробегись по подстроке.
        for j in range(len(substring)):
            # Используй смещение для индексов слова.
            shiftedIndex = i + j
            # Если буквы не совпадают:
            if word[shiftedIndex] != substring[j]:
                # Проверь следующий начальный индекс.
                break
            # Это была последняя буква в подстроке:
            if j == len(substring) - 1:
                # Подстрока имеется в слове.
                return True
    # Мы не нашли подстроки в слове.
    return False

# Перебери всех врагов.
enemies = hero.findEnemies()
for e  in range(len(enemies)):
    enemy = enemies[e]
    name = enemy.id
    if isSubstring(name, "bos"):
        # Используй функцию `isSubstring` для проверки
        # Если имя врага (id) содержит "bos":
        while True:
            distance = hero.distanceTo(enemy)
            if hero.isPathClear(hero.pos, enemy.pos):
                hero.attack(enemy)
                # Тогда победи его.
                if enemy.health <= 0:
                    break

А вот мне интересно, есть ли в уровнях CodeCombat какие-нибудь “пасхальные яйца”? Например на этом уровне я сначала убил двух йети, за которых дали по 300 золота, потом пособирал драгоценные камни, которых оказалось 6 штук и за каждый дали около 200 золота. Потом уже убил маленьких яков за которых тоже дали золото. Повлияло ли это на полученный опыт и количество полученных камней после прохождения уровня не знаю. Но для чего-то же там поставили йети и напрятали камней?

Как то странно … у меня этот код не работает . Героя убивают .

А кто убивает? Больших яков задеваете или маленькие убивают?

когда целевой як задевает других яков они толпой агрятся на героя вероятно проблемма в этом . сделаю проверку ху целевого яка по отношению кротивникам надеюсь поможет

У меня вроде такого не было. Сейчас гляну какая у меня там логика действий и ещё раз проверю ваш код.

1 Like

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

Ах да, я там прикалывался вчера. Если хотите, можете вставить мой код (только на JS переключитесь). Звезда командира 2 уже есть? Нужна для вызова лучников.

Убиваю всех яков
// Охоться на 4 яков. Выбирай только самых маленьких.
// Имена небольших яков содержат подстроку "bos".

// Эта функция проверяет, содержится ли подстрока в слове.
function isSubstring(word, substring) {
    // Мы перебираем только начальные индексы.
    var rightEdge = word.length - substring.length;
    // Перебери индексы слова.
    for (var i = 0; i <= rightEdge; i++) {
        // Для каждого из них пробегись по подстроке.
        for (var j = 0; j < substring.length; j++) {
            // Используй смещение для индексов слова.
            var shiftedIndex = i + j;
            // Если буквы не совпадают:
            if (word[shiftedIndex] != substring[j]) {
                // Проверь следующий начальный индекс.
                break;
            }
            // Это была последняя буква в подстроке:
            if (j == substring.length - 1) {
                // Подстрока имеется в слове.
                return true;
            }
        }
    }
    // Мы не нашли подстроки в слове.
    return false;
}

// Перебери всех врагов.
function killAllLitleYaks() {
    var enemies = hero.findEnemies();
    for (var e = 0; e < enemies.length; e++) {
        var enemy = enemies[e];
        // Используй функцию `isSubstring` для проверки
        // Если имя врага (id) содержит "bos":
        if (isSubstring(enemy.id, "bos")) {
            // Тогда победи его.
            while(enemy.health > 0) {
                hero.attack(enemy);
            }
        }
    }
}

function killYeti() {
    var enemies = hero.findEnemies();
    var yetis = hero.findByType("yeti");
    var nearestYeti = hero.findNearest(yetis);
    while (nearestYeti && nearestYeti.health > 0) {
        hero.attack(nearestYeti);
    }
}

function killAllYeti() {
    var yetis = hero.findByType("yeti");
    for (var y = 0; y < yetis.length; y++) {
        var yeti = yetis[y];
        while (yeti && yeti.health > 0) {
            hero.attack(yeti);
        }
    }
}

function takeItem() {
    var item = hero.findNearestItem();
    if (item) {
        hero.move(item.pos);
    } 
}

function takeAllItem() {
    var items = hero.findItems();
    if (items) {
        while(items.length > 0) {
            var item = hero.findNearestItem();
            if (item) {
                hero.moveXY(item.pos.x, item.pos.y);
            }
            items = hero.findItems();
        }
        
    }
}

function summonArchers() {
    var cost = hero.costOf("archer");
    while(hero.gold > cost) {
        hero.summon("archer");
    }
}

function commandAttackArchrs(target) {
    var archers = hero.findFriends();
    if (archers) {
        for(var i=0; i < archers.length; i++) {
            hero.command(archers[i], "attack", target);
        }
    }
}

function findBigYaks() {
    var yaks = hero.findByType("ice-yak");
    var bigYaks = [];
    var bigYaksIndex = 0;
    for (var yaksIndex = 0; yaksIndex < yaks.length; yaksIndex++) {
        if (yaks[yaksIndex].maxHealth > 300) {
            bigYaks[bigYaksIndex] = yaks[yaksIndex];
            bigYaksIndex++;
        }
    }
    return bigYaks;
}

function killBigYak() {
    var bigYaks = findBigYaks();
    commandAttackArchrs(bigYaks[0]);
}

function killAllBigYaks() {
    var bigYaks = findBigYaks();
    if (bigYaks.length > 0) {
        killBigYak();
    }
}

while(true) {
    killAllYeti();
    takeAllItem();
    summonArchers();
    killAllBigYaks();
    //killAllLitleYaks();
}

А, точно!! Не пользуйтесь в таких уровнях цепной молнией. Когда есть опасность задеть кого-то, кого не нужно. Я вспомнил, что когда проверял ваш код, удалил цепную молнию и драин лайф оставил только обычную атаку. Всё сработало. Да с моим кодом, который выше, Хашабум наверное не справится, там нужно двух йети вручную завалить.

странно все равно не работает … попробую очистить кэш.

Ещё раз проверил ваш код, что я исправил. Играю Тарином. Он аккуратно убивает только маленьких яков. Большие ходят рядом и не обращают на него внимания. За всё время от маленьких яков он теряет где-то 240 здоровья. Хашбаум не могу проверить - нет подписки.

Убрал щит и поставил простенький меч. Из 2290 жизней к концу осталось 1090, но всё выполнено успешно.
У вашей Хашбаум сколько здоровья и ДПС у оружия (обычной атаки)?

Дело не в количестве хп а в том что механики незадокументированы. итак отчет по мытарствам )))) попробовал снести кэш ничего не изменилось … переустановил браузел тоже ничего не изменилось . методом научного тыка и логики выяснил что есть какая то невыясненная кореляция с использованием функции hero.attack и агров всех целей на героя в итоге использовал лиш функцию вампирика и все заработало …

# Охоться на 4 яков. Выбирай только самых маленьких.
# Имена небольших яков содержат подстроку "bos".
# Эта функция проверяет, содержится ли подстрока в слове.
def isSubstring(word, substring):
    # Мы перебираем только начальные индексы.
    rightEdge = len(word) - len(substring)
    # Перебери индексы слова.
    for i in range(rightEdge + 1):
        # Для каждого из них пробегись по подстроке.
        for j in range(len(substring)):
            # Используй смещение для индексов слова.
            shiftedIndex = i + j
            # Если буквы не совпадают:
            if word[shiftedIndex] != substring[j]:
                # Проверь следующий начальный индекс.
                break
            # Это была последняя буква в подстроке:
            if j == len(substring) - 1:
                # Подстрока имеется в слове.
                return True
    # Мы не нашли подстроки в слове.
    return False

# Перебери всех врагов.
enemies = hero.findEnemies()
for e  in range(len(enemies)):
    enemy = enemies[e]
    name = enemy.id
    if isSubstring(name, "bos"):
        # Используй функцию `isSubstring` для проверки
        # Если имя врага (id) содержит "bos":
        while True:
            if hero.canCast("drain-life", enemy):
                hero.cast("drain-life", enemy)
            # Тогда победи его.
            if enemy.health <= 0:
                break

Т.е. обычная атака волшебной палочкой задевает других врагов?

не совсем так в какой то момент палочка бьет случайного врага . именно на этом уровне . убирал экипировку многое пробовал . и в итоге все работает если использовать только заклинания без атаки с руки