pairs 和 ipairs

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

很多脚本通常需要遍历字典或数组。但有时,您可能不知道这些数据结构的开始和结束。例如,玩家的字典可能在变化,或者玩家可能拥有大小不一的数组库存。

在这种情况下,您可以使用 pairs()ipairs()。这些可以与 for 循环一起使用,以遍历每个元素,而无需已知的开始和结束点。

本文将介绍它们的用法,并提供一个实际的脚本示例,您可以在烹饪游戏中跟踪餐厅订单。

字典和 pairs()

pairs() 用于 字典。下面可以看到一个示例。


local myDictionary = {
["蓝色玩家"] = "Ana",
["金色玩家"] = "Binh",
["红色玩家"] = "Cate",
}
for key, value in pairs(myDictionary) do
print(key .. " 是 " .. value)
end

pairs() 可以用于处理字典元素的键、值或两者。在下面的 for 循环中,第一个变量是键。第二个变量是值。您要处理的字典被传递给 pairs()


local inventory = {
["金砖"] = 43,
胡萝卜 = 3,
火炬 = 2,
}
print("您拥有:")
for itemName, itemValue in pairs(inventory) do
print(itemValue, itemName)
end

执行时,代码将打印以下内容:


您拥有:
43 金砖
3 胡萝卜
2 火炬

数组和 ipairs()

ipairs() 用于 数组ipairs() 中的 "i" 代表 "索引"。使用 ipairs() 和数组结合 for 循环来处理类似排行榜的有序值。下面是一个示例。


local players = {"Ali", "Ben", "Cammy"}
for playerRank, playerName in ipairs(players) do
print("获胜者 #" .. playerRank .. " 是 " .. playerName)
end

执行时,代码将打印以下内容:


获胜者 #1 是 Ali
获胜者 #2 是 Ben
获胜者 #3 是 Cammy

实践 - 餐厅汤模拟器

让我们制作一些汤,用于一个餐厅模拟器,玩家可以从可能的汤配料列表中选择。配料将作为键存储,值将开始为 false,以便玩家仅获得他们选择的内容。

使用 pairs() 查看所选内容,然后使用 ipairs() 打印配料列表。

  1. 创建一个新的 字典,命名为 menu。添加 3 - 5 个键值对,其中键是配料,值为 false。


    local menu = {
    卷心菜 = false,
    牛肉 = false,
    西红柿 = false,
    面条 = false,
    }
  2. 在菜单字典下方,添加一个 空数组,稍后将填充客户的选择。


    -- 客户的汤
    local selectedIngredients = {}
  3. 使用 pairs() 检查字典中的每个配料是否标记为 true 或 false。如果为 true,将配料添加到汤中。


    -- 客户的汤
    local selectedIngredients = {}
    -- 将客户的选择添加到他们的汤中
    for menuChoice, value in pairs(menu) do
    if value then
    table.insert(selectedIngredients, menuChoice)
    end
    end
  4. 向客户重复订单。在脚本中,下面编码以下内容。

    • 检查 selectedIngredients 中是否有菜单项。如果有,则打印 "您点的汤包含:"
    • 使用 ipairs() 遍历 selectedIngredients 数组并打印每种配料。
    • 通过将至少一个菜单项更改为 true 进行测试。

    -- 从 "selectedIngredients" 打印汤订单
    if #selectedIngredients > 0 then
    print("您点的汤包含:")
    for index, soupIngredient in ipairs(selectedIngredients) do
    print(soupIngredient)
    end
    end
  5. 在检查是否有菜单项的 if 语句中,添加一个 else 条件,告诉客户是否未选择配料。


    if #selectedIngredients > 0 then
    print("您点的汤包含:")
    for index, soupIngredient in ipairs(selectedIngredients) do
    print(soupIngredient)
    end
    else
    print("没有选择任何配料。你是不饿吗?")
    end

可选挑战

以下是一些挑战,应用 pairsipairs 以不同方式使用。尝试看看您能否为这些内容构建代码。

挑战:创建一个服务员 NPC 不使用输出窗口,而是使用 数组简介 中的 NPC 创建一个服务员以接收客户订单。

挑战:允许玩家下订单 允许玩家通过触碰物理部件(例如接近提示)来选择配料。有关更多信息,请参见 接近提示

高级挑战:制作一些汤模拟器 创建一个餐厅模拟器,玩家是厨师!玩家必须组合配料以匹配服务员给他们的订单。

  1. 为 3 - 5 种不同的配料创建游戏内道具。
  2. 使用与本课程类似的字典创建 3 - 5 个食谱。
  3. 创建一个数组来保存所有食谱。
  4. 随机选择一个食谱,并使用 NPC 告诉玩家配料是什么。
  5. 创建一个新字典,以根据玩家触碰的道具配料制作食谱。
  6. 比较玩家的食谱与 NPC 选择的食谱。
  7. 通过添加额外条件,例如计时器,来增加挑战性。