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() を使うことになります。
- menu という名前の辞書を作成します。キーを具材、値は追加するかどうかを示します。true が 追加する具材になり、false が追加しない具材になります。まずは、すべてfalseに設定しておき、動作テストを行います。
local menu = {
cabbage = false, -- キャベツ
beef = false, -- 牛肉
tomato = false, -- トマト
noodles = false, -- 麺
}
- menu の下に、空の配列を追加します。この配列には、お客さんが追加した具材が入ります。
-- お客様が追加したスープの具材
local isInSoup = {}
- pairs() を使用して、辞書内の要素を確認します。その具材が true の場合、それをスープのリストに追加します。
-- お客様が追加したスープの具材
local isInSoup = {}
-- スープにお客様の選択肢を追加
for menuChoice, value in pairs(menu) do
if value then
table.insert(isInSoup, menuChoice)
end
end
- 最後に顧客に注文を繰り返します。プログラムは、次のようにコーディングします。
- 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つも選んでいなかった場合のために 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 ~プレイヤーがシェフになるレストラン シミュレーターを作成しましょう! プレイヤーはウェイターからの注文に合わせて材料を組み合わせなければなりません。
- 3 ~ 5 つの異なる材料用にゲーム内小道具を作成します。
- このレッスンと同様の辞書を使用して、3 ~ 5 つのレシピを作成します。
- すべてのレシピを保持する配列を作成します。
- レシピをランダムに選択し、NPC を使ってプレイヤーに材料が何であるかを伝えます。
- 新しい辞書を作成して、プレイヤーが触れた小道具の材料に基づいてレシピを作成します。
- プレイヤーのレシピとNPCが選んだレシピを比較してください。
- タイマーなどの追加条件を追加して、難易度を高めます。
[ 5-4 辞書の概要 ]
[ 5-6 辞書から値を見つける ]
3 thoughts on “5-5 pairs と ipairs”
コメントを残す
コメントを投稿するにはログインしてください。
いつもお世話になっております。
また、タイムリーな お返事もありがとうございます。
さて、最後のコードの 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
ご指摘ありがとうございます。修正させていただきます。
if isInSoup then
は
if #isInSoup > 0 then
にしなくてはなりませんね。
ありがとうございました。
ちゃんと 動きました!