通过编写“猜数字”游戏学习 Lua

通过编写一个简单的游戏,了解 Lua,这是一种动态类型、轻量级、高效且可嵌入的脚本语言。
47 位读者喜欢这篇文章。
Puzzle pieces coming together to form a computer screen

Opensource.com

如果您是 Bash、Python 或 Ruby 等脚本语言的爱好者,您可能会对 Lua 感兴趣。Lua 是一种动态类型、轻量级、高效且可嵌入的脚本语言,具有与 C 语言接口的 API。它通过基于寄存器的虚拟机解释字节码来运行,可用于从过程式编程到函数式编程再到数据驱动编程的各种用途。它甚至可以通过巧妙地使用数组或(用于模拟类)来实现面向对象编程。

熟悉一门语言的好方法是编写一个您已经熟悉的简单应用程序。最近,一些 Opensource.com 的记者演示了如何使用他们最喜欢的语言来创建猜数字游戏。Lua 是我最喜欢的语言之一,所以这是我的 Lua 猜数字游戏版本。

安装 Lua

如果您使用的是 Linux,您可以从发行版的软件仓库安装 Lua。在 macOS 上,您可以从 MacPortsHomebrew 安装 Lua。在 Windows 上,您可以从 Chocolatey 安装 Lua。

安装 Lua 后,打开您喜欢的文本编辑器,准备开始编码。

Lua 代码

首先,您必须设置一个伪随机数生成器,以便您的玩家有一些不可预测的东西可以猜测。这是一个两步过程:首先,您基于当前时间启动一个随机种子,然后您在 1 到 100 的范围内选择一个数字

math.randomseed(os.time())
number = math.random(1,100)

接下来,创建 Lua 所谓的来表示您的玩家。表就像 Bash 中的数组或 Java 中的 ArrayList。您可以创建一个表,然后分配与该表关联的子变量。在此代码中,player 是表,而 player.guess 是该表中的一个条目

player = {}
player.guess = 0

为了调试目的,打印秘密数字。这对游戏不利,但对测试很有帮助。Lua 中的注释以双破折号开头

print(number) --debug

接下来,设置一个 while 循环,只要分配给 player.guess 的值不等于代码开头建立的随机 number,该循环就会永远运行。目前,player.guess 设置为 0,因此它不等于 number。Lua 的不等式数学运算符是 ~=,这确实很独特,但您会在一段时间后习惯它。

在这个无限循环中发生的第一件事是游戏打印一个提示,以便玩家理解游戏。

接下来,Lua 暂停并等待玩家输入猜测。Lua 使用 io.read 函数从文件和标准输入 (stdin) 读取。您可以将 io.read 的结果分配给在 player 表中动态创建的变量。玩家输入的问题在于,即使它是数字,也会被读取为字符串。您可以使用 tonumber() 函数将此输入转换为整数类型,并将结果分配回最初包含 0 的 player.guess 变量

while ( player.guess ~= number ) do
  print("Guess a number between 1 and 100")
  player.answer = io.read()
  player.guess = tonumber(player.answer)

现在 player.guess 包含一个新值,它将在 if 语句中与随机数进行比较。Lua 使用关键字 ifelseifelse,并使用关键字 end: 终止语句

  if ( player.guess > number ) then
    print("Too high")
  elseif ( player.guess < number) then
    print("Too low")
  else
    print("That's right!")
    os.exit()
  end
end

最后,函数 os.exit() 在成功时关闭应用程序,关键字 end 使用了两次:一次用于结束 if 语句,另一次用于结束 while 循环。

运行应用程序

在终端中运行游戏

$ lua ./guess.lua
96
Guess a number between 1 and 100
1
Too low
Guess a number between 1 and 100
99
Too high
Guess a number between 1 and 100
96
That's right!

就是这样!

直观且一致

从这段代码中您可能可以看出,Lua 非常一致且相当直观。它的表机制是一种令人耳目一新的数据关联方式,其语法简洁高效。Lua 代码中几乎没有浪费的行;事实上,本例中至少有一对行可以进一步优化,但我希望演示数据转换作为一个独立的步骤(也许您可以找到我所指的两行并重组它们)。

Lua 是一种令人愉快的使用语言,其文档也令人愉快,主要是因为内容不多。您将在很短的时间内学会核心语言,然后您可以自由探索 LuaRocks,发现其他人贡献的所有出色库,让您使用 Lua 的时间更加轻松。“Lua”在葡萄牙语中意为“月亮”,所以今晚就尝试一下吧。

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时工作。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.