CodeCombat代码全记录(Python学习利器)--安息之云山峰(第四章)代码5

冰猎人

# 追捕4只牦牛。 只选择小的。
# 小牦牛名称包含一个"bos"子字符串。

# 这个函数检查一个单词是否包含一个子字符串。
def isSubstring(word, substring):
    # 我们通过迭代开始索引。
    rightEdge = len(word) - len(substring)
    # 循环访问单词的索引。
    for i in range(rightEdge + 1):
        # 对于它们中的每一个循环通过子字符串
        for j in range(len(substring)):
            # 为单词的索引使用偏移量。
            shiftedIndex = i + j
            # 如果字母不一样:
            if word[shiftedIndex] != substring[j]:
                # 检查Word中的下一个开始索引。
                break
            # 如果它是子字符串中的最后一个字母:
            if j == len(substring) - 1:
                # 然后子字符串在单词中。
                return True
    # 我们还没有找到这个词的子字符串。
    return False


# 循环通过所有敌人。
spyLetter = "bos"
enemies = hero.findEnemies()
for e in range(len(enemies)):
    enemy = enemies[e]
    # 使用函数isSubstring来检查
    #  37/5000 如果敌方名称(id)包含“"bos":
    enemyName = enemy.id
    while isSubstring(enemyName, spyLetter) and enemy.health >= 0:
    # 然后打败它。
        hero.attack(enemyName)

雾岛矿

# 明智地指挥农民,有效地收集黄金!
# 农民们应该收集硬币并建造诱饵。

# 函数应该返回每个目标的最佳项
# 使用ID的数组来确保,没有两个农民以同一项目作为目标。
def findBestItem(friend, excludedItems):
    items = friend.findItems()
    bestItem = None
    bestItemValue = 0
    for item in items:
        # 使用in来检查元素是否位于excludedItems数组中。
        # 在这种情况下,跳过这个项目,因为它已经是另一个农民的目标。
        if item in excludedItems:
            continue
        # 完成函数!
        # 记住,bestItemValue应该是最高的item.value / distanceTo
        distance = friend.distanceTo(item)
        if item.value/ distance > bestItemValue:
            bestItemValue = item.value / distance
            bestItem = item
        
    return bestItem

# 这个函数检查你是否有用于诱饵的足够黄金。
def enoughGoldForDecoy():
    return hero.gold >= 25

while True:
    peasants = hero.findByType("peasant")
    # 在每个循环中创建一个新数组。
    claimedItems = []
    for peasant in peasants:
        enemy = peasant.findNearestEnemy()
        if enemy:
            # 如果农民是敌人的目标
            # “且”英雄有足够的黄金用于诱饵
            if enemy.target == peasant and hero.gold > 25:
                # 命令一个农民来建造"decoy":
                hero.command(peasant, "buildXY", "decoy", peasant.pos.x -2, peasant.pos.y)
                # 添加一个continue,这样农民在建造时就不会收集硬币。
                continue
            pass
        item = findBestItem(peasant, claimedItems)
        if item:
            # 项目已经名花有主后,将它放入claimedItems数组中。
            claimedItems.append(item)
            # 命令农民收集硬币:
            hero.command(peasant, "move", item.pos)
           

不安的休战

# 对于南方多出的每个食人魔,你都需要对应招募一名士兵。
# 不要把北方的食人魔算入!

# 接受作战单位组成的数组作为参数。
# 只返回英雄南方的单位。
def findSouthernUnits(units):
    southernUnits = []
    for unit in units:
        if unit.pos.y < hero.pos.y:
            # 将单位添加到数组中: append()
            southernUnits.append(unit)
    return southernUnits


while True:
    friends = hero.findFriends()
    enemies = hero.findEnemies()
    # 使用findSouthernUnits来获得南方敌人数量。
    enemy = findSouthernUnits(enemies)
    # 如果南方食人魔数量比友军数量多。
    if len(enemy) > len(friends):
        # 然后招募另一个"soldier"。
        hero.summon("soldier")

以我的名义

# 你必须出发去找到宝藏.

# 这个函数应该返回一个字母的索引:
def letterIndex(word, letter):
    # 把每一个字母作为单词的索引。
    for i in range(len(word)):
        # 用当前索引存储单词中的字符。
        character = word[i]
        # 如果是必填字母:
        if character == letter:
            # 然后返回当前索引(数字)。
            return i
    # 如果没有,返回默认值
    return -1

ogreLetter = "z"
shaman = hero.findByType("thoktar")[0]

# 到索引并用它来寻找宝藏。
chestIndex = letterIndex(shaman.id, ogreLetter)
hero.moveXY(16 + chestIndex * 8, 36)

讨厌的牦牛

# 好多牦牛!
# 想要存活,你需要筛选出牦牛…
def removeByType(enemies, excludedType):
    tempList = []
    # 遍历每一个敌人,检查其类型是不是excludedtype。
    for enemy in enemies:
        # 如果它不是,把它'append'到列表。
        if enemy.type != excludedType:
            tempList.append(enemy)
        pass
    return tempList


while True:
    # 找出敌人!
    enemies = hero.findEnemies()
    # 清除那些讨厌的“牦牛”。
    enemies = removeByType(enemies, "sand-yak")
    enemy = hero.findNearest(enemies)
    if enemy:
        # 现在...'remove'(清除)那些敌人。
        hero.attack(enemy)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值