 # Librarian Tactician - fun with Vectors (solved)

#1

Ok - I got a little ambitious on this level and wanted only the healthy soldiers to stand in the outside circle. I was getting the error message that there is possibly a bug with Python advanced feature parsing - the code below fixed that now. The soldiers are NOT doing what I expected. (Staying in a circle around the protectee.) I deleted out the archer code to try and isolate the problem, but no joy to date. I have even cut out the part where I was trying to add additional soldiers to the SoldiersArray below. Suggestions?

I was pretty sure the problem is here, but I was wrong.

defendPos = Vector.add(Vector(41,40), Vector.multiply(Vector.normalize(Vector.rotate(Vector(1,0),angle)),10))

## I’ve played with the Vector.multiple parameter, so that’s not the issue. ``````def distanceBetween(pos1, pos2):
result = ((pos1.x-pos2.x)^2 + (pos1.y-pos2.y)^2 )^0.5
return result

# Healthy soldiers spread out in a circle and defend.
def commandSoldier():
countS = 0
# begin cycling through troops, identifying the number healthy and getting the sick to safety where they can wait to be healed.  Note: soldiersArray is a global variable.
for troop in soldiersArray:
if troop:
if (troop.health < troop.maxHealth * 0.5):                #for those that aren't doing so well
if distanceBetween(troop.pos, Vector(40,40)) > 3:    #check they aren't already within 3 of (40,40)
tar = Vector.add(troop.pos, Vector.multiply(Vector.normalize(Vector.subtract(Vector(40,40),troop.pos)),2))  #Calculate a single step towards (40,40)
self.command(troop, "move", tar)
else:
countS = countS + 1                 #This captures the # of healthy soldiers.

soldierIndex = 0
healtyIndex = 0
while soldierIndex < len(soldiersArray) and countS > 0:
troop = soldiersArray[soldierIndex]
if troop:
if (troop.health >= troop.maxHealth * 0.5):   #if it is healthy
angle = 3.14159 * 2 * healthyIndex / countS
defendPos = Vector.add(Vector(41,40), Vector.multiply(Vector.normalize(Vector.rotate(Vector(1,0),angle)),20))   #calculating where to guard
if distanceBetween(troop.pos, defendPos) >2:                 #if not close to post
self.command(troop, "move", defendPos)                    # move to post
else:
self.command(troop, "defend", defendPos)                 #defend the post
healthyIndex = healthyIndex + 1     #this one was healthy, so increment
soldierIndex = soldierIndex + 1     #go on to next soldier

# Beginning of program
if self.gold > self.costOf("soldier"):
self.summon("soldier")
soldiersArray = self.findByType("soldier",self.findFriends())
loop:
commandSoldier()``````
1 Like
#2

Ok - color me confused. I went back to the flower drawing level and the following function will construction a figure with CountM points size away from fx,fy … or roughly that. So I’m confused as to why it didn’t work above.

``````def FigureAroundPoint(fx, fy, CountM, size):
count = 0
while count < CountM:
angle = Math.PI * 2 * count/CountM
defendPos = Vector.add(Vector(fx,fy), Vector.multiply(Vector.normalize(Vector.rotate(Vector(1,0),angle)),size))   #calculating where to guard
self.moveXY(defendPos.x, defendPos.y)
count = count + 1
``````

This can be closed now. I finally found where I slightly misspelled a variable name, so it didn’t get initialized properly. !#@ and !#@
“healtyIndex = 0”