> For the complete documentation index, see [llms.txt](https://raster.gitbook.io/zh-hans_choicescript-guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://raster.gitbook.io/zh-hans_choicescript-guide/she-qu-zhi-nan/liu-lan/ming-ling/if.md).

# \*if

`*if` 条件命令主要有三个用途：

1. 比较\[\[变量类型|变量]]（包括文本\[\[Data types|字符串]]变量），
2. 检查一个变量是否为真，
3. 检查一个数值变量的值是否等于、不等于、大于或小于某个特定值。

## 变量比较｜Comparing variables

假设我们创建了值为 10 的 var1 和值为 20 的 var2。随后我们可以使用 `*if` 命令对它们进行比较：

```
*temp var1 = 10
*temp var2 = 20

*if (var1 = var2)

    10 等于 20!

    *finish

10 不等于 20！

*finish
```

显然这是不正确的（10 当然不等于 20！），条件检查将失败，程序会跳过两个缩进行直接执行下一个同级缩进行，也就是显示“10 不等于 20！”的那一行。但如果条件成立，程序就会执行缩进行并显示“10 等于 20”的文本。

当单个条件检查独占一行时，用括号围绕 `(var1 = var2)` 就**不是**严格且必需的，就如同上方示例所示。但如果你在同一行有多个条件或其他内容（例如 `*choice #option`），那么这些括号就是必需的，因此您最好能养成即使不严格要求也使用括号的习惯。但是否照做完全取决于您的个人选择。

## 相等与不等｜Equality and inequality

使用基本的 `*if` 命令，可以用多种方式检查变量；以下是一些常见示例。

```
Equal to: *if var = 40 (Is var equal to 40?)

Not equal to: *if var != 40 (Is var different from 40?)

Greater than: *if var > 40 (Is var greater than 40?)

Less than: *if var < 40 (Is var less than 40?)

Greater than or equal to: *if var >= 40 (Is var greater than or equal to 40?)

Less than or equal to: *if var <= 40 (Is var less than or equal to 40?)
```

注意：对于大于、小于或不等于，大于、小于或不等于符号必须放在等号之前。

## 与、或、非｜And / Or / Not

此外，可以使用 and 和 or 为单个 `*if` 语句分配两个或更多条件。请注意，当同时检查两个或更多条件时，**需要**用括号将它们分隔开，如下所示：

```
使用 And: *if (var1 > 10) and (var2 > 20)
```

var1 是否大于 10 且 var2 大于20？（仅当两个条件都为真时继续。）

```
使用 Or: *if (var1 > 10) or (var2 > 20)
```

var1 是否大于 10，或者 var2 是否大于 20？（任一条件为真则继续。）

```
使用 Not: *if not (var > 10)
```

var 不大于 10 吗？（仅当 var 小于或等于 10 时继续）。

也可以检查多个条件，这需要更多括号来分隔它们：

```
三个条件：*if (((var1 > 10) and (var2 > 20)) and (var3 > 30))
```

var1 是否大于 10 且 var2 是否大于 20 且 var3 是否大于 30？请注意，每个“且”或“或”只能连接两个等式，且每个等式只能连接一个“且”或“或”。下面是个错误的示例：

```
*if ((var1 > 10) and (var2 > 20) and (var3 > 30))
```

将无法正常工作，因为第二个条件试图连接 `(var2 > 20)`，而该条件已与 `(var1 > 10)` 相连。

```
混合条件：*if ((var1 > 10) and (var2 > 20)) or (var1 > 70)
```

var1 是否大于 10 且 var2 大于 20？或者 var1 是否大于 70？（仅当var1 大于 10 且 var2 大于 20 时继续执行，但如果这个组合条件不成立，只要 var1 大于 70 仍会继续执行。）

## 布尔检查｜Boolean check

\[\[Data types|布尔]]（简单的真/假）变量有一种特殊的 `*if` 检查，它仅检查变量是否为真。

```
*if (var)
```

这将检查变量是否被设为真。(变量名) 必须用括号括起来，如图所示。

**注意**：如果变量不是布尔类型，却使用了这种检查方式，将导致游戏停止的错误。例如，对于这种特定的简单真或假检查，一个文本值为 "**true**" 的字符串变量，与一个被设为**真**的布尔变量是不同的。

你也可以通过以下方式检查布尔变量当前是否为假（即不为真）：

```
*if not(var)
```

再次强调，(变量名) 名称必须用括号括起来。（王洛木：注意括号是半角括号。）

> **注意**
>
> 仅当此检查独占一行时，`*if not(var)` 才能正确工作。例如，在以下代码中，"not" 会被完全忽略，并且如果 `(var)` 实际上为真，反而会显示该 `#选项` 文本：

```
*choice

  *if not(var) #此选项将显示

    *goto next
```

为了正确运行，这段代码实际上应该写成：

```
*choice

  *if not(var)

    #This option to be displayed

      *goto next
```

另一种解决方案是将 “not” 用另一对括号括起来，如下所示：

```
*choice

  *if (not(var)) #This option to be displayed

    *goto next
```

## 文本比较｜Comparing text

假设我们有一个名为 **name** 的\[\[Data types|字符串]]变量，其中包含一些文本。您可以使用 `*if` 来检查其当前包含的文本是否完全等于某个特定的单词或短语，例如：

```
*if (name = "alex")
```

请注意，检查字符串变量时必须始终使用 "引号"。

你也可以检查一个字符串是否不等于特定的单词或短语：

```
*if (name != "alex")
```

多功能的 `*if` 命令在 ChoiceScript 中用途广泛。以下是一些常见的使用示例：

## 用法｜Usage

`*if` 命令的主要用途之一是在玩家通过检查时添加特定的变化。你可以在代码块下添加各种命令，这对于将故事设置到不同路径非常有用。

### 将其他布尔变量设为真或假｜Setting other boolean variables to true or false

```
*if (exam_passed)

    *set happy true

    你过关！

    *finish
```

如果\[\[Data types|布尔]]变量 `"exam_passed"` 为真，你可以添加代码 `*set happy true` 以供将来使用。

### 修改数值与字符串变量｜Modifying numeric & string variables

```
*if (exam_passed)

    *set happiness + 30

    *set graduated "With Honors"

    你过关！

    *finish
```

在这个例子中，如果变量 `"exam_passed"` 为真，则 `"happiness"` 将增加 30，字符串变量 `"graduated"` 将更改为 `"With Honors"`，并且会显示文本“你过关！”。

### 显示条件文本｜Displaying conditional text

你也可以使用 `*if` 命令，在不改变任何变量的情况下，对你游戏显示的文本进行微小的调整：

```
你去了学校，参加了考试，

*if (exam_passed)

    并通过了考试,

然后去吃午餐。
```

（Especially for Boolean variables, this can also be done relatively easily using [**multireplace**](https://choicescriptdev.fandom.com/wiki/Multireplace)--so for example, `@{exam_passed passed it,|)` would do the same thing as the `*if` clause above.)

（对于布尔变量，使用\[\[Multireplace|多重替换]]也能相对轻松地实现——例如，`@{exam_passed 通过了考试,|)` 的效果与上述 `*if` 子句相同。）

### 将 `*if` 与 \[\[Elseif|\*elseif]] 和 \[\[Else|\*else]] 结合使用｜`*if` used in combination with \[\[Elseif|\*elseif]] and \[\[Else|\*else]]

当您需要根据不同条件显示一系列不同选项时，仅使用`*if`命令也能实现，但通常最好结合使用相关的 `*elseif` 和 `*else` 命令。一个实用的[指导原则](https://forum.choiceofgames.com/t/ultimate-noob-coding/28655/800?u=havenstone)是：

当您希望向部分玩家展示多个额外信息片段，且结果非互斥且非强制时，使用 `*if/*if/*if...` 的组合。

当您希望向部分玩家精确展示多个可能额外信息片段中的某一个，且结果互斥但非强制时，使用 `*if/*elseif/*elseif...` 的组合（不使用 `*else`）。

（虽然您可以使用一系列 `*if` 命令来实现此效果，但通过使用 `*elseif` 来明确表达结果的互斥性是更佳的编码实践。这将有助于任何审阅者和编辑者，也包括您自己。）

当每个人都需要恰好获得一个选项时，使用 `*if/*else` 或 `*if/*elseif/*else` 来处理互斥且必须选择的结果会比较好。

例如，对于后者：

```
*if (happiness < 10)

    你今天非常沮丧。

    *finish

*elseif (happiness < 30)

    你今天不开心。

    *finish

*elseif (happiness < 60)

    今天不是特别快乐。

    *finish

*elseif (happiness < 80)

    你今天心情还不错。

    *finish

*else

    你今天非常开心！

    *finish
```

以上述例子为例，向玩家显示的文本（你今天非常沮丧。）由角色当前的 `"happiness"` 决定。系统会逐一检查每个`*if` 和 `*elseif` 条件块，直到找到为真的条件，然后显示相应的信息。如果所有条件均不适用（即“happiness”实际达到 80 或更高），系统将默认执行末尾的“兜底” `*else` 语句。`*else` 语句本身不应设定具体条件，因为它本质上表示“若以上条件均不满足，则执行此操作”。

ChoiceScript 的代码执行顺序也是从上到下，因此在安排代码结构时必须格外小心。确保你的条件检查代码按数值递增或递减的顺序排列，并在最后添加一个兜底的 `*else` 语句。如果上面的例子以 `*if happiness < 80` 开头，接着写 `*elseif happiness < 60`，那么第二个条件将永远无法被触发——因为所有小于 60 的 `"happiness"` 值也都小于 80！

### 注意｜Note

ChoiceScript 逻辑的基本要求是，任何将 \[\[Elseif|\*elseif]] 或 \[\[Else|\*else]] 命令与 `*if` 结合使用的情况，都必须以 \[\[Finish|\*finish]]、\[\[Goto\_Scene|\*goto\_scene]]、\[\[Goto|\*goto]]、\[\[Goto random scene|\*goto\_random\_scene]]、\[\[Ending|\*ending]] 或 \[\[Ref Commands|\*gotoref]]命令结束，如上例所示。以下代码将导致错误：

```
*if (happiness < 30)

    你今天非常沮丧。

*elseif (happiness < 60)

    今天不是特别快乐。

*else

    你今天非常开心！
```

ChoiceScript 会崩溃，因为它没有被告知在找到有效条件并显示相应文本后该做什么。

不过，通过使用\[\[Implicit Control Flow|隐式控制流]]，可以避免这一要求。
