5-5 pairs と ipairs

5-4 でも、parts と ipairs が登場しましたが、ここではもう少し詳しく解説しましょう。

最初に学んだ for 文は、開始値、終了値、増減値を指定しましたが、配列や辞書を扱う for はこれとは少々異なります。「pairs」(ペアーズ)、「ipairs」(アイペアーズ)というキーワードを使用しての操作になります。

辞書とpairs()

pairs()は、辞書で使用されます。以下に例を示します。今までの for とは全く異なるのが分かると思います。

local myDictionary = {
    ["Blue Player"] = "Ana",
    ["Gold Player"] = "Binh",
    ["Red Player"] = "Cate",
}

for key, value in pairs(myDictionary) do
    print(key .. " is " .. value)
end

for に続いて変数を、カンマで区切り、2つ目の変数を、「in pairs(辞書名) 」と続きます。その後ろの do から end までは通常の for 文と全く同じです。
最初の変数 key にはキー名が入り、次の value にはその値が入ります。すべての要素が取り出されるまで、do から end 内をループします。

local inventory = {
    ["Gold Bricks"] = 43,
    Carrots = 3,
    Torches  = 2,
}

print("You have:")

for itemName, itemValue in pairs(inventory) do
    print(itemName, itemValue)
end

こちらを実行すると、次のように表示されると思います。表示の順番を確認してください。辞書の場合、必ずしも inventory で初期化した順番にならないということになります。

You have:
Carrots 3
Gold Bricks 43
Torches 2

配列と ipairs()

ipairs() は配列で使用されます。ipairs()の頭の「i」は「インデックス」を表します。使用方法は辞書のときと同じです。配列の場合は、キー名ではなくインデックス番号が取得できます。

local players = { "Ali", "Ben", "Cammy" }

for playerRank, playerName in ipairs(players) do
    print("Winner #" .. playerRank .. " is " .. playerName)
end

実行すると、次のように表示されます。配列の場合は必ず初期化した順番通りになります。

Winner #1 is Ali
Winner #2 is Ben
Winner #3 is Cammy

辞書と配列を組み合わせた例

スープの具材を辞書に登録しておき、お客さんが選んだものをスープのリストに追加していくという処理を考えてみましょう。
スープの具材は辞書になりますので pairs() を使用します。スープのリストは配列になりますので ipairs() を使うことになります。

  1. menu という名前の辞書を作成します。キーを具材、値は追加するかどうかを示します。true が 追加する具材になり、false が追加しない具材になります。まずは、すべてfalseに設定しておき、動作テストを行います。
local menu = {
    cabbage = false,    -- キャベツ
    beef = false,       -- 牛肉
    tomato = false,     -- トマト
    noodles = false,    -- 麺
}
  1. menu の下に、空の配列を追加します。この配列には、お客さんが追加した具材が入ります。
-- お客様が追加したスープの具材
local isInSoup = {}
  1. pairs() を使用して、辞書内の要素を確認します。その具材が true の場合、それをスープのリストに追加します。
-- お客様が追加したスープの具材
local isInSoup = {}

-- スープにお客様の選択肢を追加
for menuChoice, value in pairs(menu) do
    if value then
        table.insert(isInSoup, menuChoice)
    end
end
  1. 最後に顧客に注文を繰り返します。プログラムは、次のようにコーディングします。
  • isInSoup に具材が入っているかどうかを確認します。もし1つでも入っていたら 「ご注文のスープの具材は」を表示します。
  • 次に、ipairs() を使用して isInSoup 配列に入っている具材を表示します。
  • まず、このまま実行してみましょう。1つも表示しないはずです。
  • 次に、少なくとも menu 内のどれか1つを true に変更してみましょう。その具材が表示するはずです。
-- isInSoup からスープの順番を表示する
if isInSoup then
    print("ご注文のスープの具材は")
    for index, soupIngredient in ipairs(isInSoup) do
        print(soupIngredient)
    end
    print("です。")
end
  1. 具材を1つも選んでいなかった場合のために else 文を追加します。そして、それにふさわしいメッセージを表示してみましょう。
    ちなみに、isInSoup が空だった場合の条件式は「if not isInSoup then」と記述することができます。
if isInSoup then
    print("ご注文のスープの具材は")
    for index, soupIngredient in ipairs(isInSoup) do
        print(soupIngredient)
    end
    print("です。")
else
    print("具材を入れないスープでよろしいでしょうか?")
end

オプションのチャレンジ

以下は、pairs と ipairs をさまざまな方法で使用する際に適用されるいくつかの課題です。これらのコードを構築できるかどうかを試してください。

【初級チャレンジ】ウェイター NPC を作成する 出力ウィンドウを使用する代わりに、 Intro To Arraysの NPC を使用して、顧客の注文を受けるウェイターを作成します。

【中級チャレンジ】プレイヤーに注文を許可する プレイヤーがProximity Prompts などの物理的な部分に触れて材料を選択できるようにします。詳細については、Proximity Prompts を参照してください。

【上級チャレンジ】Make Me Some Soup Simulator ~プレイヤーがシェフになるレストラン シミュレーターを作成しましょう! プレイヤーはウェイターからの注文に合わせて材料を組み合わせなければなりません。

  1. 3 ~ 5 つの異なる材料用にゲーム内小道具を作成します。
  2. このレッスンと同様の辞書を使用して、3 ~ 5 つのレシピを作成します。
  3. すべてのレシピを保持する配列を作成します。
  4. レシピをランダムに選択し、NPC を使ってプレイヤーに材料が何であるかを伝えます。
  5. 新しい辞書を作成して、プレイヤーが触れた小道具の材料に基づいてレシピを作成します。
  6. プレイヤーのレシピとNPCが選んだレシピを比較してください。
  7. タイマーなどの追加条件を追加して、難易度を高めます。

コメントを残す