# Library Tactician [Passed in Python]

Hi,all
Through 2 days of time, constant adjustment and optimization, and finally through the clearance, the following code for your reference!

===========================================================
def commandSoldier(soldier, soldierIndex, numSoldiers):

``````angle = Math.PI * 2 * soldierIndex / numSoldiers
defendPos = {"x": 41, "y": 40}
defendPos.x += 8 * Math.cos(angle)
defendPos.y += 8 * Math.sin(angle)
hero.command(soldier, "defend", defendPos);
if soldier.health <=soldier.maxHealth/2:
defendPos = {"x": 38, "y": 39}
hero.command(soldier, "move", defendPos)
hero.command(soldier, "defend", defendPos)
``````

def findStrongestTarget():
hero.buildXY(“archer”, hero .pos.x-2, hero .pos.y)
mostHealth = 0
bestTarget = None
enemies = hero.findEnemies()

``````# # i = 0
# # i < len(enemies)

# # enemy = enemies[i]
for enemy in enemies:
if enemy.health > mostHealth:

mostHealth = enemy.health
# bestTarget = enemies[i]
bestTarget = enemy
# hero.say(bestTarget)
# i = 0
# i < len(enemies)
# i += 1
# enemy = enemies[i]
# for enemy in enemies:
#     if enemy.health > mostHealth:
#         bestTarget = enemy
#         mostHealth = enemy.health
#         bestTarget = enemies[i]
#     hero.say(bestTarget)
if bestTarget and bestTarget.health >0:
return bestTarget

else:
return None
``````

def commandArcher(archer):
nearest = archer.findNearestEnemy()

``````if archerTarget:
hero.say(archerTarget)
hero.command(archer, "attack", archerTarget)
elif nearest:
hero.command(archer, "attack", nearest)
if archer.health < archer.maxHealth/3:
defendPos = {"x": 40, "y": 40}
hero.command(archer, "move", defendPos)
hero.command(archer, "defend", defendPos)
``````

# hero.command(archer, “attack”, nearest)

archerTarget = None

loop:

``````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 j, archer in enumerate(archers):
commandSoldier(archer,j,len(archers))

commandArcher(archer)
# hero.buildXY("decoy", hero .pos.x-1, hero .pos.y+2)
# hero.buildXY("archer", hero .pos.x-2, hero .pos.y)
# hero.buildXY("decoy", hero .pos.x-1, hero .pos.y+2)
# hero.buildXY("decoy", hero .pos.x-1, hero .pos.y-2)``````

Please avoid posting solutions, that just takes away the point of the game.

Also, that is not how you are supposed to solve this level. You are supposed to maintain the formation otherwise more enemies will spawn. See the related threads (e.g. this one) if you need further help.