跳转至

变量和常量

变量和常量本质上是“值的容器”。每个都有一个名称和一个值。Mindustry 有用户可以设置的变量和仅由处理器设置的常量,用户无法更改常量。

要了解变量或常量的可能数据或参数类型,请参见术语表。

变量

创建和更改变量

变量就是它的名称所暗示的;一个可以更改的值。

例如,在这段代码中:set myVariable 3set 指令将创建一个名为 myVariable 的变量,并赋值为 3

稍后,可以将其值更改为 9set myVariable 9

请注意,我们在创建和更改变量时使用了相同的指令。这是因为如果要更改的变量尚不存在,指令将首先创建它。如果您了解 Python,您可能会意识到它的工作方式是相同的。

另一个例子是使用 sensorsensor playerX playerUnit @x(或在可视化编辑器中为 Sensor playerX = @x in playerUnit)。

假设玩家的位置是 141, 20,将首先创建一个名为 playerX 的变量,然后赋值为 141

然而,在这个例子中还有另一个变量叫 playerUnit。该变量是一个参数。参数是指令的输入值。在这种情况下,我们可能是从 radar 指令中获得 playerUnit。如果未提供参数或参数无效,指令将不会执行。

数据类型和隐式转换

变量中的值当然具有不同的类型,具体取决于不同的来源和目的,例如 Unit 用于单元,number 用于任何数字等。您可以在术语表中找到它们的完整列表。

Mindustry Logic 还具有一种称为隐式转换的变量特性。这意味着,如果需要,它将把变量的值从一种类型转换为另一种类型。

如果指令给定了一个 number,但需要一个 Object,它将被转换为 null。如果指令需要一个 number,但给定了一个 Object,如果对象不为 null,它将被转换为 1,否则为 0。

示例:

  • 53 -> null
  • null -> 0
  • Object(例如硅熔炉) -> 1

print 指令是唯一需要 String 作为输入的指令,因此其规则在手册的单独部分中说明。

变量命名

正确命名变量是编程中一项重要的技能。它有助于使代码更易于阅读和理解。因此,这可以使人们更容易学习或修复您的代码。

变量名称可以包含任何可输入的字符。然而,它们不能仅是数字,因为这将使用实际数字。

大多数 mlog 代码中的常见命名约定是 camelCase,例如 playerXcoreFoundvertexAngle

在命名变量时,请确保它们既具有描述性又简短。它们必须描述它们所持有的值或其目的。同时,它们不应是完整的句子或占据整个页面,或过于简短以至于令人困惑。您可以使用缩写、首字母缩略词或更短的术语使其更简洁。

每个人都有自己特定的风格和偏好,但请尝试从 mlog 和其他语言中的良好代码示例中学习,同时尽量保持接近常见风格。

处理器变量和常量

常量也保存值,但不能更改。每个处理器都有这些内置的常量和变量:

处理器

@this constant Building

一个表示处理器本身的 Building 对象。您可以使用它与 sensor 一起查找有关处理器的各种属性。

@thisx constant number

处理器的 x 坐标。

@thisy constant number

处理器的 y 坐标。

@ipt constant number

每个 tick 执行的指令数量(60 ticks/秒)。

  • 微处理器 -> 2
  • 逻辑处理器 -> 8
  • 超级处理器 -> 25

@counter variable number

一个表示处理器将从中读取代码的下一行的变量,相当于 x86 中的 %IP。它可以像其他变量一样更改,作为执行跳转的另一种方式。

一个(高级)示例是将 @counter 设置为跳转到一个函数,然后再跳回调用者:

op add retAddr @counter 1 # 保存函数返回后我们将继续的位置,通过将 1 加到计数器
set @counter myFunc       # 跳转到表示 myFunc 的行
...
set @counter retAddr      # 在调用函数后返回到之前设置的行

链接

一个等于链接到处理器的建筑数量的常量。当块被链接或取消链接时,处理器会更改它。

您可以将其与 getlink 一起使用,以循环遍历所有链接的建筑,如下所示:

set linkIter 0                  # 创建迭代器变量
getlink block linkIter          # 获取第 "linkIter" 个链接建筑的 Building 对象。
# 在这里对建筑执行您想要的操作
jump 1 lessThan linkIter @links # 循环

constant Building

这实际上是多个常量,每个链接到处理器的建筑都有一个。它们在建筑被取消链接或链接到处理器时被移除或添加。

buildingName 代表建筑的内部名称,您可以在 Wiki 的其他部分找到。

n 从 1 开始,并随着每个链接的同类建筑而增加。它有点像某种类型的第 n 个建筑。

这可能有点难以理解,因此这里有一些示例:

  • 第一个链接到处理器的 Scatter:scatter1
  • 第三个链接的 Ripple:ripple3
  • 第二个链接的 Laser Drill:drill2
  • 第十一个链接的 Spore Press:press11

您还可以在选择处理器时查看每个链接建筑的“常量名称”。

其他

@unit constant Unit

一个表示当前绑定单元的常量。只有在处理器解除绑定单元或绑定另一个单元时才会更改。可以使用单元指令(如 ucontrolulocateuradar)访问它。由于它是一个单元对象,您也可以将其与 sensor 一起使用。

这构成了 mlog 中单元控制的核心部分;一次只能绑定一个单元。然而,您可以在变量中引用它,例如 set unitReference @unit。不过,该变量不能用于控制引用的单元。它只能用于与其他单元进行比较或获取有关它的信息。因此,您可以将其视为“单元身份”。

@time constant number

表示当前的 UNIX 时间戳 以毫秒为单位

@tick constant float

表示自地图开始以来的 tick 数(60 ticks/秒)。

@mapw constant number

地图的宽度,以瓦片为单位。

@maph constant number

地图的高度,以瓦片为单位。