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

Annalyn 的潜入

学习练习

简介

Go 中的布尔值由预声明的布尔类型bool表示,它的值可以是true或false。它是一种定义类型。

var closed bool    // boolean variable 'closed' implicitly initialized with 'false'
speeding := true   // boolean variable 'speeding' initialized with 'true'
hasError := false  // boolean variable 'hasError' initialized with 'false' 

Go 支持三种逻辑运算符,它们可以把表达式求值为布尔值,即返回true或false。

运算符 含义
&&(与) 两个判定都为真时,结果为真。
||(或) 至少一个判定为真时,结果为真。
!(非) 只有当判定为假时,结果才为真。

说明

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

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

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

  • 快速攻击:如果骑士在睡觉,就可以发动快速攻击,因为他要花时间穿上盔甲,所以会处于脆弱状态。
  • 侦察:只要他们中至少有一个人醒着,就可以对他们进行侦察。 否则,侦察就是浪费时间。
  • 给囚犯发信号:如果囚犯醒着且弓箭手在睡觉,就可以用鸟叫声给囚犯发信号,因为弓箭手受过鸟叫信号的训练,可能会截获信息。
  • 解救囚犯:Annalyn 可以试着潜入营地解救囚犯。 这很冒险,而且只有两种方式之一能成功:
    • 如果 Annalyn 带着她的宠物狗,那么只要弓箭手在睡觉,她就能救出囚犯。 骑士害怕狗,而且弓箭手来不及准备好,Annalyn 和囚犯就能逃走。
    • 如果 Annalyn 没带狗,那她和囚犯就必须非常小心地行动! 如果囚犯醒着,而且骑士和弓箭手都在睡觉,Annalyn 就能解救囚犯;但如果囚犯在睡觉,就无法被救出:囚犯会被 Annalyn 突然出现吓到,从而惊醒骑士和弓箭手。

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

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

定义CanFastAttack()函数,它接收一个布尔值,表示骑士是否醒着。 如果根据骑士的状态可以发动快速攻击,这个函数就返回true。 否则,返回false:

var knightIsAwake = true
fmt.Println(CanFastAttack(knightIsAwake))
// Output: false

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

定义CanSpy()函数,它接收三个布尔值,分别表示骑士、弓箭手和囚犯是否醒着。 如果根据这三个角色的状态可以侦察这群人,这个函数就返回true。 否则,返回false:

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
fmt.Println(CanSpy(knightIsAwake, archerIsAwake, prisonerIsAwake))
// Output: true

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

定义CanSignalPrisoner()函数,它接收两个布尔值,分别表示弓箭手和囚犯是否醒着。 如果根据这两个角色的状态可以给囚犯发信号,这个函数就返回true。 否则,返回false:

var archerIsAwake = false
var prisonerIsAwake = true
fmt.Println(CanSignalPrisoner(archerIsAwake, prisonerIsAwake))
// Output: true

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

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

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
var petDogIsPresent = false
fmt.Println(CanFreePrisoner(knightIsAwake, archerIsAwake, prisonerIsAwake, petDogIsPresent))
// Output: false
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Go Exercism

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

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