# Recruit soldiers and archers to fill out each squadron.
# Each paladin has a decimal number stored in her deployment attribute.
# Convert these to binary and represent them with lines of soldiers and archers next to each paladin.
# Soldiers are 0s, archers are 1s.
# For the bonus goal, add griffins as 2s for trinary number lines next to the warlocks.
# Check the guide for help with binary numbers.
posx = [17,26,35,44,53,57,62,69]
def commandPaladin(paladin):
g = paladin.deployment
y = paladin.pos.y
gg = g
j = 0
h = 0
k = 7
if paladin.type == "paladin":
kk = 128
else:
kk = 2187
while g <= kk: # putting the zeros before the numbers
if g < kk:
hero.summon("soldier")
friend = hero.findNearest(hero.findByType("soldier"))
hero.command(friend, "move", {"x":posx[h],"y":paladin.pos.y})
h += 1
if paladin.type == "paladin":
kk = kk / 2
else:
kk = kk / 3
hero.wait(1)
else:
hero.summon("archer")
friend = hero.findNearest(hero.findByType("archer"))
hero.command(friend, "move", {"x":posx[h],"y":paladin.pos.y})
hero.wait(1)
h += 1
while h <= 7:
hero.summon("soldier")
friend = hero.findNearest(hero.findByType("soldier"))
hero.command(friend, "move", {"x":posx[h],"y":paladin.pos.y})
h += 1
hero.wait(1)
k = 9 - h
while g != 0: # the mutation from decimal numbers to binary or trinary
if paladin.type == "paladin":
if g % 2 == 0:
hero.summon("soldier")
friend = hero.findNearest(hero.findByType("soldier"))
hero.command(friend, "move", {"x":posx[k],"y":paladin.pos.y})
else:
g -= 1
hero.summon("archer")
friend = hero.findNearest(hero.findByType("archer"))
hero.command(friend, "move", {"x":posx[k],"y":paladin.pos.y})
hero.wait(1)
g = g / 2
else:
if g % 3 == 0:
hero.summon("soldier")
friend = hero.findNearest(hero.findByType("soldier"))
hero.command(friend, "move", {"x":posx[k],"y":paladin.pos.y})
elif g % 3 == 1:
g -= 1
hero.summon("archer")
friend = hero.findNearest(hero.findByType("archer"))
hero.command(friend, "move", {"x":posx[k],"y":paladin.pos.y})
else:
g -= 2
hero.summon("griffin-rider")
friend = hero.findNearest(hero.findByType("griffin-rider"))
hero.command(friend, "move", {"x":posx[k],"y":paladin.pos.y})
hero.wait(1)
g = g / 3
k -= 1
paladins = hero.findByType("paladin")
for paladin in paladins:
commandPaladin(paladin)
enemies = hero.findEnemies()
for enemy in enemies:
commandPaladin(enemy)
Hello. Yes I know that this is several months old but you seem to have solved the level and I was wondering if you could help me with my code in binary deployment. Thank you for your consideration.
And can you tell us if you do not understand the algorith of this level so we will try to explain it to you? (and format your code as it is described here)
# Recruit soldiers and archers to fill out each squadron.
# Each paladin has a decimal number stored in her deployment attribute.
# Convert these to binary and represent them with lines of soldiers and archers next to each paladin.
# Soldiers are 0s, archers are 1s.
# For the bonus goal, add griffins as 2s for trinary number lines next to the warlocks.
# Check the guide for help with binary numbers.
def toTernary(number):
# Start with an empty string.
string = ""
# Then, while the number isn't zero:
while number != 0:
# We grab the remainder of our number.
remainder = number % 3
# This is our iterator method. 'number' decrements here.
number = (number - remainder) / 3
# Append the string to the remainder.
string = remainder + string
# Finally we want to return our constructed string.
return string
def toBinary(number):
string = ""
# Go through the steps again:
# Get remainder, decrement, and append string.
# Remember that binary is another way of saying '2'!
while number != 0:
# We grab the remainder of our number.
remainder = number % 2
# This is our iterator method. 'number' decrements here.
number = (number - remainder) / 2
# Append the string to the remainder.
string = remainder + string
# Finally we want to return our constructed string.
return string
while True:
paladins = hero.findByType("paladin")
warlocks = hero.findByType("warlock")
for warlock in warlocks:
deployment1 = warlock.deployment
message1 = toTernary(deployment1)
y = warlock.pos.y
if len(message1) < 6:
message1 = 0 + message1
if len(message1) < 7:
message1 = 0 + message1
if len(message1) < 8:
message1 = 0 + message1
#hero.say(message1)
for paladin in paladins:
deployment = paladin.deployment
message = toBinary(deployment)
y = paladin.pos.y
if len(message) < 5:
message = 0 + message
if len(message) < 6:
message = 0 + message
if len(message) < 7:
message = 0 + message
if len(message) < 8:
message = 0 + message
#hero.say(message)
for i in range(len(message)):
word = message[i]
#hero.say(word)
if word == 0:
hero.summon("soldier")
if word == 1:
hero.summon("archer")
for j in range(len(message1)):
word1 = message1[j]
hero.say(word1)
if word1 == 0:
hero.summon("soldier")
if word1 == 1:
hero.summon("archer")
if word1 == 2:
hero.summon("griffin-rider")
friends = hero.built
for friend in friends:
xArr = [50, 45, 40, 35, 30, 25, 20, 15]
for x in xArr:
hero.command(friend, "move", {'x': x, 'y': y})
OK, I mostly do JavaScript so I might be wrong. But I think this:
should be indented more, so it sits inside the ‘for paladin in paladins’ loop (and a similar bit of code inside the ‘for warlock in warlocks’ code).
Also, I had to command the new soldiers/archers to move straight away, so that I could command the right one to the right place; otherwise it turned into chaos of who was sent where.