轨道
/
Elm
Elm
/
练习
/
Annalyn 的潜入
Annalyn 的潜入

Annalyn 的潜入

学习练习

简介

布尔值

Bool类型是这门编程语言的基本组成部分之一。它用来描述某个东西是真的还是假的,对应的值分别是True和False。

布尔值可以用&&(“AND”)和||(“OR”)运算符组合,也可以用not函数取反。

布尔值还非常适合用来在代码中创建分支:只有当满足特定条件时,这些分支才会执行。在 Elm 中,这通过if-then-else表达式实现,用法如下。

if someCondition || (someOtherCondition && anotherCondition) then
    doSomething
else
    doSomethingElse

说明

在这个练习中,你要为一个朋友正在开发的新角色扮演游戏(RPG)实现冒险任务的逻辑。游戏的主角叫 Annalyn,是个勇敢的女孩,身边有一只凶猛又忠诚的宠物狗。不幸的是,灾难降临了:她最好的朋友在森林里采浆果时被绑架了。Annalyn 会设法找到并解救她最好的朋友,在这次冒险中她可以选择带上自己的狗。

沿着最好朋友的踪迹追踪了一段时间后,她找到了关押着她最好朋友的营地。原来有两个绑匪:一个强大的骑士和一个狡猾的弓箭手。

找到绑匪之后,Annalyn 思考自己可以采取以下哪些行动:

  • 快速攻击:如果骑士正在睡觉,就可以发动快速攻击,因为他穿上盔甲需要时间,这段时间里他很脆弱。
  • 潜行攻击:如果 Annalyn 能在不被发现的情况下接近睡着的骑士,她的潜行攻击会造成 12 点伤害。否则,她对骑士只能造成 7 点伤害。
  • 侦查:只要这群人里至少有一个醒着,就可以对他们进行侦查。否则,侦查就是浪费时间。
  • 向囚犯发信号:如果囚犯醒着,而弓箭手在睡觉,就可以用鸟叫声向囚犯发信号,因为弓箭手受过鸟叫信号的训练,可能会截获信息。
  • 解救囚犯:Annalyn 可以试着潜入营地解救囚犯。 这么做风险很大,只有两种情况下能成功:
    • 如果 Annalyn 带着她的宠物狗,那么在弓箭手睡着时她就能救出囚犯。 骑士怕狗,弓箭手来不及做好准备,Annalyn 和囚犯就能逃走。
    • 如果 Annalyn 没带狗,那她和囚犯就必须非常小心地行动! 如果囚犯醒着,且骑士和弓箭手都睡着了,Annalyn 就能解救囚犯;但如果囚犯在睡觉,就没法救:Annalyn 突然出现会吓到囚犯,囚犯会惊醒骑士和弓箭手。

你有五项任务:根据森林里这三个角色的状态,以及 Annalyn 的宠物狗是否在场,实现判断上述行动是否可行的逻辑。

1. 检查是否可以发动快速攻击

实现 canFastAttack 函数,它接受一个布尔值,表示骑士是否醒着。如果根据骑士的状态可以发动快速攻击,这个函数返回 True。否则,返回 False:

knightIsAwake = True

canFastAttack knightIsAwake
    --> False

2. 检查是否可以侦查这群人

实现 canSpy 函数,它接受三个布尔值,分别表示骑士、弓箭手和囚犯是否醒着。如果根据这三个角色的状态可以侦查这群人,这个函数返回 True。否则,返回 False:

knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False

canSpy knightIsAwake archerIsAwake prisonerIsAwake
    --> True

3. 检查是否可以给囚犯发信号

实现 canSignalPrisoner 函数,它接受两个布尔值,分别表示弓箭手和囚犯是否醒着。如果根据这两个角色的状态可以给囚犯发信号,这个函数返回 True。否则,返回 False:

archerIsAwake = False
prisonerIsAwake = True

canSignalPrisoner archerIsAwake prisonerIsAwake
    --> True

4. 检查是否可以解救囚犯

实现 canFreePrisoner 函数,它接受四个布尔值。前三个形参分别表示骑士、弓箭手和囚犯是否醒着,最后一个形参表示 Annalyn 的宠物狗是否在场。如果根据这三个角色的状态以及 Annalyn 的宠物狗是否在场可以解救囚犯,这个函数返回 True。否则,它返回 False:

knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False
petDogIsPresent = False

canFreePrisoner knightIsAwake archerIsAwake prisonerIsAwake petDogIsPresent
    --> False

5. 计算潜行攻击可以造成的伤害

实现 stealthAttackDamage 函数,它接受一个布尔值,表示 Annalyn 是否被发现。如果她被发现,这个函数返回 7,否则返回 12。

annalynIsDetected = True

stealthAttackDamage annalynIsDetected
    --> 7
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Elm Exercism

准备好开始 Annalyn 的潜入 了吗?

注册 Exercism,借助 28 个概念110 个练习 和真人导师指导,学习并掌握 Elm,全部免费。