Level: Mad Maxer Sells Out - Problem


#1

I followed all the directions, but my hero is not collecting the nearest coin. He’s taking extra time to go to a coin farther away, and then he can’t get all the gold coins before they disappear.

I think it is because the variable minGoldDist starts out so high, and so the first coin is kind of random.

Here is a copy of my code. I have a similar problem in the next level, Mad Maxer Gets Greedy. Help would be greatly appreciated!!

# Coins here disappear after a few seconds!
# Get all the gold coins before they vanish.

loop:
    closestGold = None
    minGoldDist = 9000
    coinIndex = 0
    coins = self.findItems()
    # Find the closest coin that is gold.
    # Remember that gold coins have a value of 3.
    while coinIndex < len(coins):
        coin = coins[coinIndex]
        distance = self.distanceTo(coin)
        if distance < minGoldDist:
            if coin.value == 3:
                closestGold = coin
        coinIndex += 1
        
    if closestGold:
        self.moveXY(closestGold.pos.x, closestGold.pos.y)

#2

You never sent minGoldDist to the dist of the closetGold so it will always be the last gold coin checked…


#3

Thanks! I think that did the trick. I just added this line of code:

minGoldDist = self.distanceTo(closestGold)

I guess I just didn’t think about the fact that minGoldDist was never getting reset!


#4

Actually, this is the “distance” I had this in mind…

        if distance < minGoldDist:
            if coin.value == 3:
                closestGold = coin

                                 minGoldDist = distance

since you already know “distance” to the current coin, no need to calculate it again. :smile:


#5

Sorry, but where exactly in the code should I put the “minGoldDist = distance”?

It goes right after the “if distance < minGoldDist” but before the “if coin.value == 3”, right?


#6

I’m also stumped here. Hero collects some coins, but some disappear before he gets to them, level goals remain incomplete. He doesn’t go to the closest one first, but just some random one.

while True:
    closestGold = None
    minGoldDist = 9001
    coinIndex = 0
    coins = hero.findItems()
    # Finde die nächste Goldmünze.
    # Beachte das Goldmünzen einen Wert (value) von 3 haben
    while coinIndex < len(coins):
        coin = coins[coinIndex]
        if coin:
            distance = hero.distanceTo(coin)
            if distance < minGoldDist and coin.value == 3:
                closestGold = coin
                minGoldDistance = distance
                pass
            coinIndex += 1
            pass
    if closestGold:
        #Begib dich zur nächsten Goldmünzen und bekomme sie!
        hero.moveXY(closestGold.pos.x, closestGold.pos.y)
        pass

I wonder why the initial value settings:

    closestGold = None
    minGoldDist = 9001
    coinIndex = 0

are under the while True loop - because that means the values get reset at each iteration - and each gold coin that happens to turn out first in the array gets set as variable closestGold. But that’s the pre-written code, so it must be correct…?


#7

This line, minGoldDistance = distance is wrong.

Fix that one line and it works fine.

The pre-written code has to be in the while True loop because the code is iterating and incrementing through an array. If only one coin were to appear then yes, it would be set as closestGold, but you’ll notice that three appear at a time.


#8

Got it, thanks! 20 characters