# Cant pass level sarven-shepherd: my hero wont attack

It would appear that my hero wouldnt fight against being bullied, since he just gets beaten from the enemys and doesnt attack. Heres my code at the moment:

``````loop:
enemies = self.findEnemies()
enemyIndex = 0

# Wrap this logic in a while loop to attack all enemies.
# Find the array's length with: len(enemies)
while enemyIndex < len(enemies):
enemy = enemies[enemyIndex]
# "!=" means "not equal to."
if enemy.type != "sand-yak":
# While the enemy's health is greater than 0, attack it!
while enemy.health > 0:
self.attack(enemy)
enemyIndex += 1

# Between waves, move back to the center.
self.moveXY(40, 30)``````

Your `while` loop is outside of the main `loop`, so it is never reached (hint: indent the whole `while` block).

Also, you only increment `enemyIndex` when the enemy is not a `sand-yak`, so you’d get an infinite loop upon reaching the first `sand-yak` (hint: deindent `enemyIndex += 1` twice).

`self.moveXY` should also be inside the `loop`.

``````> loop:
>     enemies = self.findEnemies()
>     enemyIndex = 0
>     while enemyIndex < len(enemies):
>         enemy = enemies[enemyIndex]
>         if enemy.type != "sand-yak":
>             while enemy.health > 0:
>                 self.attack(enemy)
>                 enemyIndex += 1
>         pass
>     self.moveXY(40, 33)
``````

My hero wont attack can someone tell me what`s wrong ?

Move the `enemyIndex +=1` out of the if

``````    enemyIndex=0
while enemyIndex < len(enemies):
enemy=enemies[enemyIndex]
#do something with the enemy
# conditional blocks are indented more than parent blocks
enemyIndex+=1
#end while
``````

Observe that enemyIndex+=1 is at the same level as enemy=enemies[enemyIndex]

Also you do not need the pass. It means do nothing and it is only used if the code syntax requires a instruction to be present:

For example:

``````if (enemy):
# attack enemy here
pass
``````

This is a teaching code. The if requires at least one instruction. But you do not have an instruction yet because the student must write it. So the teacher puts a pass until the student writes it

Can you help me figure out what is wrong with my code? It keeps coming back saying that I have an infinite loop, or the code is really slow. Thanks.

``````while(true) {
var enemies = hero.findEnemies();
var enemyIndex = 0;

while (enemyIndex < enemies.length) {
var enemy = enemies[enemyIndex];
if (enemy.type != "sand-yak") {
while (enemy.health > 0) {
hero.attack(enemy);
}
enemyIndex += 1;
}
}

// Between waves, move back to the center.
hero.moveXY(40, 32);
}
``````

Never mind, found out problem.

``````while (hero.now() < 60) {
var enemies = hero.findEnemies();
var enemyIndex = 0;
while (enemyIndex < enemies.length) {
var enemy = enemies[enemyIndex];
var target = hero.findNearest(hero.findEnemies());
if (target) {
if (target.type != "sand-yak") {
while (target.health > 0) {
hero.attack(target);
}
enemyIndex += 1;
}
else {
break;
}
}
}
hero.moveXY(40, 32);
}
``````

Actually, the problem with your first code is that it only increments the `enemyIndex` when the enemy is not a yak, so when it finds a yak the loop would get stuck checking the same enemy (yak) and never go forward. You need to always increment the `enemyIndex` so the loop can skip the yaks:

``````    var enemies = hero.findEnemies();
var enemyIndex = 0;

while (enemyIndex < enemies.length) {
var enemy = enemies[enemyIndex];
if (enemy.type != "sand-yak") {
// ...
}
enemyIndex += 1; // Increment enemyIndex outside of the `if` statement
}
``````

But yeah, I see you have found a workaround to the problem and it works, so it’s fine I guess. Keep in mind the “correct” logic though, as you most likely will need it in the future.

should my while loop be inside of the main loop r should it be outside of the loop?

It should be inside of the main loop.

but where is the center?

The center? What do you mean by the center?