Bots And Games

获取游戏状态

现在您可以直接在终端中看到游戏公告,您可以更好地掌握游戏动态。 然而,这些展示仅限于游戏中发生的特定动作

按需访问全面的游戏数据(例如所有玩家的位置、生命值和武力值)不是更有用吗? 这些信息可以显着改善您的战略规划,帮助您更有效地评估威胁、机遇和时机。

如果您考虑向上一篇指南 中创建的机器人添加另一个处理程序,那就对了!

编写代码

返回到 bot.lua 文件并更新现有处理程序,如下所示:

Handlers.add(
  "HandleAnnouncements",
  Handlers.utils.hasMatchingTag("Action", "Announcement"),
  function (msg)
    ao.send({Target = Game, Action = "GetGameState"})
    print(msg.Event .. ": " .. msg.Data)
  end
)

对处理程序的调整包括:

  • 重命名为 "HandleAnnouncements" 以反映其更广泛的作用。
  • 添加额外操作来请求游戏更新状态。 该游戏旨在响应 GetGameState 动作标签。

当您收到公告打印件后,您可以在 Inbox 中查看最新消息,如下所示:

Inbox[#Inbox]

该消息的 Data 字段包含游戏的最新状态,其中包括:

  • GameMode :游戏是否处于 WaitingPlaying 状态。
  • TimeRemaining:游戏开始或结束的剩余时间。
  • Players:包含每个球员的统计数据(如位置、生命值和武力值)的表格。

但这可以更进一步,这样您不仅可以阅读,还可以将最新状态的信息用于其他自动化。

让我们定义一个存储最新状态的新变量,如下所示:

LatestGameState = LatestGameState or nil

当您在终端中反复加载 bot.lua 文件时,该语法会保留变量的现有值,而不是覆盖它。 如果没有预先存在的值,则将 nil 值分配给该变量。

然后实现另一个处理程序,如下所示:

-- 接收游戏状态信息后更新游戏状态的处理程序。
Handlers.add(
  "UpdateGameState",
  Handlers.utils.hasMatchingTag("Action", "GameState"),
  function (msg)
    local json = require("json")
    LatestGameState = json.decode(msg.Data)
    ao.send({Target = ao.id, Action = "UpdatedGameState"})
    print("Game state updated. Print \'LatestGameState\' for detailed view.")
  end
)

来自前一个处理程序的游戏进程的响应有一个值为 GameState 的动作标签,可以帮助我们触发第二个处理程序。 触发后,handle 函数会加载内置的 json 包,该包将数据解析为 json 并将其存储在 LatestGameState 变量中。

该处理程序还会向您的进程发送一条消息,指示状态何时更新。 该功能的意义将在下一节中解释。

您可以在下面的代码中参考 bot.lua 的最新代码:

LatestGameState = LatestGameState or nil

Handlers.add(
  "HandleAnnouncements",
  Handlers.utils.hasMatchingTag("Action", "Announcement"),
  function (msg)
    ao.send({Target = Game, Action = "GetGameState"})
    print(msg.Event .. ": " .. msg.Data)
  end
)

Handlers.add(
  "UpdateGameState",
  Handlers.utils.hasMatchingTag("Action", "GameState"),
  function (msg)
    local json = require("json")
    LatestGameState = json.decode(msg.Data)
    ao.send({Target = ao.id, Action = "UpdatedGameState"})
    print("Game state updated. Print \'LatestGameState\' for detailed view.")
  end
)

加载和测试

像往常一样,要测试这个新功能,请在 aos 玩家终端中加载文件,如下所示:

.load bot.lua

然后检查 LatestStateVariable,通过简单地传递其名称来查看它是否已正确更新,如下所示:

LatestGameState

通过实时访问游戏的最新状态,您的机器人可以做出明智的决定来决定您的下一步行动。 接下来,让我们尝试借助这些数据来自动化操作🚶


Copyright © 2024