CodeCombat 逻辑与或

逻辑运算符 OR 系列(32-37关)

第 32 关

宝石或者死亡 (Gem or Death)

战术思路分析:调试逻辑

英雄被困在一个房间里,周围是地雷和宝石。**地雷**的 `if` 语句必须是 **False**,而**宝石**的 `if` 语句必须是 **True**。

布尔值的控制艺术

我们通过修改条件表达式,来控制 `if` 语句的结果是 `True` 还是 `False`:
- 想要 `True`:`2 + 2 == 4`
- 想要 `False`:`2 + 2 == 5` 或使用 `!=` 或 `not`

IF False: Avoid Mine
IF True: Go Gem

Python 程序解法

1
if 1 + 1 + 1 == 4: # ∆ 将其设为 false。
修正:1+1+1==4 (False) 避免地雷
2
hero.moveXY(5, 15)
不执行
3
4
if 2 + 2 == 4: # ∆ 将其设为 true。
修正:2+2==4 (True) 移动到宝石 1
5
hero.moveXY(15, 40)
执行
6
7
if 2 + 2 != 5: # ∆ 将其设为 true。
修正:2+2!=5 (True) 移动到宝石 2
8
hero.moveXY(25, 15)
执行
9
10
if 2 + 2 < 5: # ∆ 将其设为 true。
修正:4<5 (True) 攻击敌人
11
enemy = hero.findNearestEnemy()
执行
12
hero.attack(enemy)
执行
13
14
if 2 < 1: # ∆ 将其设为 false。
修正:2<1 (False) 避免地雷
15
hero.moveXY(40, 55)
不执行
16
17
if not True: # ∆ 将其设为 false。
修正:not True (False) 避免地雷
18
hero.moveXY(50, 10)
不执行
19
20
if not False: # ∆ 将其设为 true。
修正:not False (True) 移动到宝石 3
21
hero.moveXY(55, 25)
执行
第 33 关

Burl和布尔 (Burl and Booleans)

战术思路分析:回答问题

友善的 Burl 巫师在考你关于**布尔值**的知识。你需要准确判断比较运算符(`==`)的结果是 `True` 还是 `False`。

注意类型匹配

- 数字 (`3`) 只能和数字比较。
- 字符串 (`"Three"`) 只能和字符串比较。
例如:`"Three" == 3` 结果是 `False`,因为类型不同。

3 == "3" != True

Python 程序解法

1
# 问题: 2 == 3
2
hero.say(False)
答案是 False
3
4
# 问题: 3 == 3
5
hero.say(True)
答案是 True
6
7
# 问题: "Three" == 3
8
hero.say(False)
答案是 False (字符串 != 数字)
9
10
# 问题: "Three" == "Three"
11
hero.say(True)
答案是 True
12
13
# 问题: 1 + 2 == 3
14
hero.say(True)
答案是 True
第 34 关

盐碱地 (Salted Lands)

战术思路分析:多选一

我们必须攻击两种敌人:矮人 (`"munchkin"`) 或投矛手 (`"thrower"`)。我们必须收集两种物品:宝石 (`"gem"`) 或硬币 (`"coin"`)。

逻辑 OR (`or`)

`A or B` 的结果是:
- 只要 A 或 B 中**至少有一个是 True**,结果就是 `True`。
- 只有当 A 和 B **都是 False** 时,结果才是 `False`。
这让我们可以在一个 `if` 语句中处理多种目标。

IF (A or B): Action

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
3
if enemy.type == "munchkin" or enemy.type == "thrower":
如果敌人是矮人 **或** 投矛手
4
hero.attack(enemy)
攻击敌人
5
item = hero.findNearestItem()
6
# 如果物品的类型是"gem"或"coin":
7
if item.type == "coin" or item.type == "gem":
如果物品是硬币 **或** 宝石
8
hero.moveXY(item.pos.x, item.pos.y)
移动去收集
第 35 关

流星雨 (Meteor Shower)

战术思路分析:宝物急救

流星雨下的硬币很快会消失(需要近距离抢)。但宝石不会消失(可以慢慢捡)。
决策逻辑是:**如果它是宝石 (永远可以捡) 或 距离近 (硬币快消失了)**,就去捡。

OR 连接不同类型条件

硬币是**距离**条件,宝石是**类型**条件。OR 可以将这两个完全不同的判断连接起来:
`if item.type == "gem" or distance < 20:`

(Is Gem?) or (Is Close?)

Python 程序解法

1
while True:
2
item = hero.findNearestItem()
3
distance = hero.distanceTo(item)
计算到物品的距离
4
# 如果物品的类型是"gem"
5
# 或到物品的距离小于20米:
6
if item.type == "gem" or distance < 20:
如果物品是宝石 **或** 距离小于 20
7
# 移动到物品的位置。
8
hero.moveXY(item.pos.x, item.pos.y)
移动
第 36 关

森林影子 (Forest Shadow)

战术思路分析:多目标搜寻

大食人魔看不见你,所以你只需要对付小食人魔(矮人/投矛手)和收集宝物(宝石/硬币)。
我们需要两次使用 `or`:一次用于敌人,一次用于物品。

两次 OR 的应用

- **攻击条件:** `enemy.type == "thrower" or enemy.type == "munchkin"`
- **收集条件:** `item.type == "gem" or item.type == "coin"`

(Munchkin or Thrower)
AND
(Gem or Coin)

Python 程序解法

1
while True:
2
# 只有当类型是"thrower"或"munchkin"时才攻击。
3
enemy = hero.findNearestEnemy()
4
if enemy.type == "thrower" or enemy.type == "munchkin":
攻击小食人魔或投矛手
5
hero.attack(enemy)
6
# 只有当类型是"gem"或"coin"时才收集。
7
item = hero.findNearestItem()
8
if item.type == "gem" or item.type == "coin":
收集宝石或硬币
9
hero.moveXY(item.pos.x, item.pos.y)
第 37 关

概念挑战. 守护者 (The Guardian)

战术思路分析:纯 OR 过滤

英雄必须攻击两种类型的敌人:矮人 (`"munchkin"`) 和投掷者 (`"thrower"`)。这是一个直接使用 `or` 运算符来过滤目标的练习。

最简洁的 OR 语句

将两个 `==` 语句用 `or` 连接起来,是 Python 中处理多条件满足的常用方法。

IF (Munchkin or Thrower): Attack()

Python 程序解法

1
while True:
2
enemy = hero.findNearestEnemy()
3
if enemy.type == "munchkin" or enemy.type == "thrower":
如果敌人是矮人 **或** 投掷者
4
hero.attack(enemy)
发起攻击