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 > 0 then
    print("ご注文のスープの具材は")
    for index, soupIngredient in ipairs(isInSoup) do
        print(soupIngredient)
    end
    print("です。")
end
  1. 具材を1つも選んでいなかった場合のために else 文を追加します。そして、それにふさわしいメッセージを表示してみましょう。
    ちなみに、isInSoup が空だった場合の条件式は「if not isInSoup then」と記述することができます。
if #isInSoup > 0 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. タイマーなどの追加条件を追加して、難易度を高めます。
3 thoughts on “5-5 pairs と ipairs”
  1. いつもお世話になっております。
    また、タイムリーな お返事もありがとうございます。

    さて、最後のコードの else ですが、うまく機能していません。
    この条件文でうまく 分岐できていないように思います。 >if isInSoup then

    以下、実行しているコードです。
    よろしくお願い致します。
    〜〜〜
    local myDictionary = {
    [“Blue Player”] = “Ana”,
    [“Gold Player”] = “Binh”,
    [“Red Player”] = “Cate”,
    }

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

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

    print(“You have:”)

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

    local players = { “Ali”, “Ben”, “Cammy” }

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

    print(“ipairs and pairs….”)

    local menu = {
    cabbage = false, — キャベツ
    beef = false, — 牛肉
    tomato = false, — トマト
    noodles = false, — 麺
    }

    — お客様が追加したスープの具材
    local isInSoup = {}

    — スープにお客様の選択肢を追加
    for menuChoice, value in pairs(menu) do
    if value then
    table.insert(isInSoup, menuChoice)
    end
    end

    print(isInSoup)

    — isInSoup からスープの順番を表示する
    if isInSoup then
    print(“ご注文のスープの具材は”)
    for index, soupIngredient in ipairs(isInSoup) do
    print(soupIngredient)
    end
    print(“です。”)
    else
    print(“具材を入れないスープでよろしいでしょうか?”)
    end

コメントを残す