「网易官方」极客战记(codecombat)攻略-沙漠-一打宝石-diamond-dozen

(点击图片进入关卡)

在荒漠中,打败兽人军团的同时,高效收集金币。

简介

有时最近的金币不是最好的金币。

我们已经给你一个叫 valueOverDistance() 的函数。

用这个函数找到最好的金币,在它们消失之前收集!

你只有一名弓箭手,因此你需要首先打败兽人首领!

遍历 enemies 数组,比较他们的 health 。最多 health 的敌人就是了!

默认代码

# 打败前来劫掠的食人魔,让他们把金币交出来!

 

def findMostHealth(enemies):
    target = None
    targetHealth = 0
    enemyIndex = 0
    while enemyIndex < len(enemies):
        enemy = enemies[enemyIndex]
        if enemy.health > targetHealth:
            target = enemy
            targetHealth = enemy.health
        enemyIndex += 1
    return target

 

def valueOverDistance(item):
    return item.value / hero.distanceTo(item)

 

# 返回有最高 valueOverDistance(item) 的物品。
def findBestItem(items):
    bestItem = None
    bestValue = 0
    itemsIndex = 0

 

    # 循环于 items 数组内。
    # 发现这个物品的最高 valueOverDistance()

 

    return bestItem

 

while True:
    enemies = hero.findEnemies()
    enemy = findMostHealth(enemies)
    if enemy and enemy.health > 15:
        while enemy.health > 0:
            hero.attack(enemy)
    else:
        coins = hero.findItems()
        coin = None
        coin = findBestItem(coins)
        if coin:
            hero.moveXY(coin.pos.x, coin.pos.y)

概览

在这关你要写一个找最大的函数。待会你会用到这个函数从一堆金币中找出最佳的一个。为了让过程更直观,我们假设一下:

coinA
    value = 3
    distance = 2
coinB
    value = 1
    distance = 1
coinC
    value = 2
    distance = 3

如果我们用 value / distance 这个公式,我们就知道哪个金币最好:

coinA
    3 / 2 = 1.5
coinB
    1 / 1 = 1
coinC
    2 / 3 = ~0.6

看,我们就知道了最好的金币是 coinA。

一打宝石解法

# 打败前来劫掠的食人魔,让他们把金币交出来!

 

def findMostHealth(enemies):
    target = None
    targetHealth = 0
    enemyIndex = 0
    while enemyIndex < len(enemies):
        enemy = enemies[enemyIndex]
        if enemy.health > targetHealth:
            target = enemy
            targetHealth = enemy.health
        enemyIndex += 1
    return target

 

def valueOverDistance(item):
    return item.value / hero.distanceTo(item)

 

# 返回有最高 valueOverDistance(item) 的物品。
def findBestItem(items):
    bestItem = None
    bestValue = 0
    itemsIndex = 0
    # 循环于 items 数组内。
    # 发现这个物品的最高 valueOverDistance()
    while itemsIndex<items.length:
        if bestValue<valueOverDistance(items[itemsIndex]):
            bestValue = valueOverDistance(items[itemsIndex])
            bestItem = items[itemsIndex]
        itemsIndex += 1
    return bestItem

 

while True:
    enemies = hero.findEnemies()
    enemy = findMostHealth(enemies)
    if enemy and enemy.health > 15:
        while enemy.health > 0:
            hero.attack(enemy)
    else:
        coins = hero.findItems()
        coin = None
        coin = findBestItem(coins)
        if coin:
            hero.moveXY(coin.pos.x, coin.pos.y)
 
本攻略发于极客战记官方教学栏目,原文地址为:
原文地址:https://www.cnblogs.com/codecombat/p/13494578.html