树精树林 (Burlwood)
战术思路分析:排除法决策
英雄必须攻击敌人,但不能攻击友好的**树精("burl")**。我们创建一个函数 `shouldAttack(target)`,让它替英雄思考:**“我应该攻击这个目标吗?”**
返回值类型:布尔值 (True/False)
函数通过返回 `True` 或 `False` 来给出明确的答案。
1. 如果目标不存在或它是树精,函数返回 `False`。
2. 否则,函数执行到底,默认返回 `True` (可以攻击)。
英雄的主代码只需要检查 `if shouldAttack(enemy):` 即可。
shouldAttack(Target)
True or False
Python 程序解法
盲距 (Blind Spot)
战术思路分析:返回距离
英雄担任盲人巫师的“观测手”,需要测量并说出敌人的距离。这次函数不再返回 True/False,而是返回一个**数字**。
数值返回与哨兵值 (Sentinel Value)
`nearestEnemyDistance()` 函数会做两件事:
1. 如果有敌人,返回精确的距离 (`hero.distanceTo(enemy)`)。
2. 如果没有敌人,返回 `0`。这个 `0` 是一个特殊的**哨兵值**,告诉调用者:“虽然没找到,但别报错,结果是 0。”
主循环通过检查 `if enemyDistance > 0:` 来知道是否找到了目标。
IF Enemy: return Distance
ELSE: return 0
Say(15.42)
Python 程序解法
固定打击 (Static Shock)
战术思路分析:安全范围检查
你被困住了,移动会受伤!只能在敌人靠近到攻击范围(3米)时才能反击。我们需要一个“攻击许可”函数。
多重返回路径
`inAttackRange(enemy)` 函数会计算距离,并使用 `if/else` 来决定返回路径:
- `if distance <= 3`: return True
- `else`: return False
IF Distance <= 3: return True
ELSE: return False
Python 程序解法
金币猎手 (Coin Hunter)
战术思路分析:机会成本
毒药让英雄不能乱动!只有当硬币在**20米以内**,才值得冒险移动。函数 `isCoinClose(coin)` 接收一个参数 `coin`,专门针对这个硬币对象进行距离检查。
接收参数并返回布尔值
函数接收的 `coin` 参数让它具有通用性,可以检查任何物品的距离。
- 检查:`distance < 20`
- 结果:返回 `True` 或 `False`
return distance < 20
Move IF True
Python 程序解法
返回Agrippa (Return to Agrippa)
战术思路分析:优雅出击
这是一次代码重构(Re-factoring)练习。我们将“判断是否在攻击范围内”的逻辑封装起来,让主循环的代码读起来像流水账一样简单。
函数抽离的价值
- **`enemyInRange(enemy)`:** 负责计算距离并返回 **True** 或 **False**。
- **`cleaveOrAttack(enemy)`:** 负责决定是使用 `cleave` 还是 `attack`。
主循环:`if enemy: if enemyInRange(enemy): cleaveOrAttack(enemy)`,**逻辑清晰,易于维护!**
checkDistance()
return True/False
cleaveOrAttack()
Python 程序解法
金属探测器 (Metal Detector)
战术思路分析:测量与报告
英雄是炮兵的测距仪。你必须测量到金币的距离。如果找不到金币,则报告 `0`。
返回值类型:数字 (含 0)
- 如果 `coin` 存在,`return distance` (实际数字)。
- 否则,`return 0` (哨兵值)。
**注意:** 必须使用 `else` 语句来确保在找不到硬币时,函数能返回 `0`。
IF Coin: return Distance
ELSE: return 0
Python 程序解法
概念挑战. 食人魔入侵者 (Ogre Infiltrator)
战术思路分析:坐标报告
机器人需要敌人的 X 坐标才能发射激光。如果找不到敌人,函数应该返回一个不可能的坐标值,例如 **`-1`**,作为哨兵值。
返回值类型:坐标 (或 -1)
- 如果 `enemy` 存在,`return enemy.pos.x`。
- 否则,Python 函数默认会返回 `None`。为了确保返回值是数字类型(即使是哨兵值),我们需要显式地在 `if` 语句外添加 `return -1`。
IF Enemy: return X
enemyX = getEnemyX()
IF enemyX != -1: Say(X)
Python 程序解法
组合挑战. 森林风暴 (Storm)
战术思路分析:三层过滤
这是对函数和布尔逻辑的终极测试。英雄只有在满足以下所有条件时才能行动:**存在 + 距离近 + 类型正确**。
复合逻辑封装 (`isCloseType`)
我们使用嵌套的 `if` 语句将三个条件全部封装在一个函数中:
1. `if target:` (是否存在?)
2. `if distance < 15:` (是否靠近?)
3. `if target.type == type:` (是否类型匹配?)
只有通过所有检查,函数才会返回 `True`。
(Exists AND Close AND Type?)
One Function, One Final Decision.