[SOLVED] Library Tactictian HELP! SOS

Good idea but I get the warning: Your code either has a infinite loop or is really slow.

Can I see the code? :face_with_raised_eyebrow:

Here :slight_smile:

def commandSoldier(soldier, soldierIndex, numSoldiers):
    angle = Math.PI * 2 * soldierIndex / numSoldiers
    defendPos = {"x": 41, "y": 40}
    defendPos.x += 10 * Math.cos(angle)
    defendPos.y += 10 * Math.sin(angle)
    hero.command(soldier, "defend", defendPos);

def findStrongestTarget():
    mostHealth = 0 
    enemies = hero.findEnemies() 
    enemyIndex = 0
for enemy in hero.findEnemies():
    if enemy.health > mostHealth:
        bestTarget = enemy
        mostHealth = enemy.health
        bestTarget = enemy
    if bestTarget and bestTarget.health > 15:
        return bestTarget
    else:
        return None



def commandArcher(archer):
    nearest = archer.findNearestEnemy()
    if archerTarget:
        hero.command(archer, "attack", archerTarget)
    elif nearest:
        hero.command(archer, "attack", nearest)
        
archerTarget = None

while True:
    
    if hero.gold > hero.costOf("soldier"):
        hero.summon("soldier")
    if not archerTarget or archerTarget.health <= 0:
        archerTarget = findStrongestTarget()
        friends = hero.findFriends()
        soldiers = hero.findByType("soldier")
        archers = hero.findByType("archers")
    for i, soldier in enumerate(soldiers):
        commandSoldier(soldier, i, len(soldiers));
    for i in range(len(archers)):
        archer = archers[i]
        commandArcher(archer)
    

You did not put 4 empty spaces before those lines.
Do you need any more assistance at this level?

I did I just took it out

OK here is the code with your advice:

def commandSoldier(soldier, soldierIndex, numSoldiers):
    angle = Math.PI * 2 * soldierIndex / numSoldiers
    defendPos = {"x": 41, "y": 40}
    defendPos.x += 10 * Math.cos(angle)
    defendPos.y += 10 * Math.sin(angle)
    hero.command(soldier, "defend", defendPos);

def findStrongestTarget():
    mostHealth = 0 
    enemies = hero.findEnemies() 
    enemyIndex = 0
    for enemy in hero.findEnemies():
        if enemy.health > mostHealth:
            bestTarget = enemy
            mostHealth = enemy.health
            bestTarget = enemy
        if bestTarget and bestTarget.health > 15:
            return bestTarget
        else:
            return None



def commandArcher(archer):
    nearest = archer.findNearestEnemy()
    if archerTarget:
        hero.command(archer, "attack", archerTarget)
    elif nearest:
        hero.command(archer, "attack", nearest)
        
archerTarget = None

while True:
    
    if hero.gold > hero.costOf("soldier"):
        hero.summon("soldier")
    if not archerTarget or archerTarget.health <= 0:
        archerTarget = findStrongestTarget()
        friends = hero.findFriends()
        soldiers = hero.findByType("soldier")
        archers = hero.findByType("archers")
    for i, soldier in enumerate(soldiers):
        commandSoldier(soldier, i, len(soldiers));
    for i in range(len(archers)):
        archer = archers[i]
        commandArcher(archer)

Does the code work? :face_with_raised_eyebrow:

No the soldier Shannon dies

Try to delete 4 empty spaces before those lines.
Do you need any more assistance at this level?

Nope same thing happens

Could you show me your current code?

Here

def commandSoldier(soldier, soldierIndex, numSoldiers):
    angle = Math.PI * 2 * soldierIndex / numSoldiers
    defendPos = {"x": 41, "y": 40}
    defendPos.x += 10 * Math.cos(angle)
    defendPos.y += 10 * Math.sin(angle)
    hero.command(soldier, "defend", defendPos);

def findStrongestTarget():
    mostHealth = 0 
    enemies = hero.findEnemies() 
    enemyIndex = 0
    for enemy in hero.findEnemies():
        if enemy.health > mostHealth:
            bestTarget = enemy
            mostHealth = enemy.health
            bestTarget = enemy
    if bestTarget and bestTarget.health > 15:
        return bestTarget
    else:
        return None



def commandArcher(archer):
    nearest = archer.findNearestEnemy()
    if archerTarget:
        hero.command(archer, "attack", archerTarget)
    elif nearest:
        hero.command(archer, "attack", nearest)
        
archerTarget = None

while True:
    
    if hero.gold > hero.costOf("soldier"):
        hero.summon("soldier")
    if not archerTarget or archerTarget.health <= 0:
        archerTarget = findStrongestTarget()
        friends = hero.findFriends()
        soldiers = hero.findByType("soldier")
        archers = hero.findByType("archers")
    for i, soldier in enumerate(soldiers):
        commandSoldier(soldier, i, len(soldiers));
    for i in range(len(archers)):
        archer = archers[i]
        commandArcher(archer)
    

If you delete this, does the code work?

Here try

hero.findByType("archer")

Do you need any more assistance at this level?

when you said take away the best target then it doesn’t work it say’s erorr to slow

What is the code that you have now?

Sorry to say but both ideas make it say to slow

What code is too slow?

This code:

def commandSoldier(soldier, soldierIndex, numSoldiers):
    angle = Math.PI * 2 * soldierIndex / numSoldiers
    defendPos = {"x": 41, "y": 40}
    defendPos.x += 10 * Math.cos(angle)
    defendPos.y += 10 * Math.sin(angle)
    hero.command(soldier, "defend", defendPos);

def findStrongestTarget():
    mostHealth = 0 
    enemies = hero.findEnemies() 
    enemyIndex = 0
    for enemy in hero.findEnemies():
        if enemy.health > mostHealth:
            bestTarget = enemy
            mostHealth = enemy.health
    if bestTarget and bestTarget.health > 15:
        return bestTarget
    else:
        return None



def commandArcher(archer):
    nearest = archer.findNearestEnemy()
    if archerTarget:
        hero.command(archer, "attack", archerTarget)
    elif nearest:
        hero.command(archer, "attack", nearest)
        
archerTarget = None

while True:
    
    if hero.gold > hero.costOf("soldier"):
        hero.summon("soldier")
    if not archerTarget or archerTarget.health <= 0:
        archerTarget = findStrongestTarget()
        friends = hero.findFriends()
        soldiers = hero.findByType("soldier")
        archers = hero.findByType("archer")
    for i, soldier in enumerate(soldiers):
        commandSoldier(soldier, i, len(soldiers));
    for i in range(len(archers)):
        archer = archers[i]
        commandArcher(archer)
    

If you delete this does the code work?