【网易官方】极客战记(codecombat)攻略-森林

【网易官方】极客战记(codecombat)攻略-森林

兽人,金币,布尔…… 看这么多次都腻了。最起码我们得把他们简化一点。

简介

使用 与 (AND) 操作符时,如果第一个条件 (在 AND 左边那个) 为假,第二个条件 (右边那个) 永远不会执行。

你可以好好利用这点!

这些代码有可能出错:

enemy = hero.findNearestEnemy()
# 如果 enemy 为 None,那么 AND 就是 False
# 所以 enemy.type 不会执行,避开了错误。
if enemy and enemy.type == "munchkin":
    hero.attack(enemy)

下面带有与操作符的代码不会有这个问题:

enemy = hero.findNearestEnemy()
# 如果 enemy 为 None,获取 enemy.type 时会出错!
if enemy.type == "munchkin":
    hero.attack(enemy)

默认代码

# 打败食人魔,收集金币。一切都那么平常。
# 使用 与(AND) 在同一行检查存在性和类型。
while True:
    enemy = hero.findNearestEnemy()
    # 有了与(AND),只在敌人存在时检查类型
    if enemy and enemy.type == "munchkin":
        hero.attack(enemy)
    # 寻找最近的物品

 

    # 如果有名为 “coin” (金币)的物品存在,那就快去收集它!

 

概览

与 (AND) 操作符具有短路求值 (short-circuit evaluation) 特性。

这句话的意思是,如果在 and 前面的表达式为 假 (或者 null), 那么在操作符后面的表达式不执行或不求值。

我们可以应用到对象属性的读取中,尤其是不确定对象是否存在的情况下。 比如,我们想读取敌人的类型,首先我们得确保那个敌人存在,否则会得到一个错误:

enemy = hero.findNearestEnemy()
if enemy:
    if enemy.type == "burl":
        ## 做点啥

But we can make it shorter:

enemy = hero.findNearestEnemy()
if enemy and enemy.type == "burl":
        ## 做点啥

我们不需要担心敌人不存在的引用错误 (reference error),因为这种情况下第二部分不会执行

平常的一天 解法

# 打败食人魔,收集金币。一切都那么平常。
# 使用 与(AND) 在同一行检查存在性和类型。
while True:
    enemy = hero.findNearestEnemy()
    # 有了与(AND),只在敌人存在时检查类型
    if enemy and enemy.type == "munchkin":
        hero.attack(enemy)
    # 寻找最近的物品
    item = hero.findNearestItem()
    # 如果有名为 “coin” (金币)的物品存在,那就快去收集它!
    if item and item.type == "coin":
        hero.moveXY(item.pos.x, item.pos.y)