多くのスクリプトはしばしば辞書や配列を通過する必要があります。しかし、時々、これらのデータ構造の始まりと終わりを知らないかもしれません。たとえば、プレイヤーの辞書が変更されているか、プレイヤーが異なるサイズのアレイインベントリを持っている可能性があります。
これらの状況では、pairs() と ipairs() を使用できます。これらは for ループを使用して、既知の開始と終了ポイントなしでそれぞれの要素を通過できます。
この記事では、それらを使用する方法をカバーし、料理ゲームでレストランの注文を追跡する実用的なスクリプトの例を持ちます。
辞書と pairs()
pairs() は 辞書 と一緒に使用されます。下の例を参照してください。
local myDictionary = {["Blue Player"] = "Ana",["Gold Player"] = "Binh",["Red Player"] = "Cate",}for key, value in pairs(myDictionary) doprint(key .. " is " .. value)end
pairs() は、辞書要素のキー、値、または両方を使用するために使用できます。以下の for ループでは、最初の変数がキーです。2番目の変数は値です。使用したい辞書は、pairs() に渡されます。
local inventory = {["Gold Bricks"] = 43,Carrots = 3,Torches = 2,}print("You have:")for itemName, itemValue in pairs(inventory) doprint(itemValue, itemName)end
実行すると、コードはフォロー中を印刷します:
You have:43 Gold Bricks3 Carrots2 Torches
配列と ipairs()
ipairs() は 配列 と一緒に使用されます。ipairs() の "i" は "index" を意味します。リーダーボードのような順序のついた値を処理するには、ipairs() と配列を for ループと組み合わせて使用します。以下は例です。
local players = {"Ali", "Ben", "Cammy"}for playerRank, playerName in ipairs(players) doprint("Winner #" .. playerRank .. " is " .. playerName)end
実行すると、コードはフォロー中を印刷します:
Winner #1 is AliWinner #2 is BenWinner #3 is Cammy
練習 - レストランスープシミュレータ
プレイヤーが可能なスープの材料のリストから選択できるレストランシミュレーターのためのスープを作ろう。材料はキーとして保存され、値は false で始まるので、プレイヤーは選択したものだけを取得します。
を使用して、選択されたものを見て、次に でリストの材料を印刷します。
新しい 辞書 を作成し、名前は menu で、キーが成分で、値が false の 3 - 5 のキー-バリューペアを追加します。
local menu = {cabbage = false,beef = false,tomato = false,noodles = false,}メニュー辞書の下に、後で顧客の選択で満たされる 空の配列 を追加します。
-- 顧客のスープlocal selectedIngredients = {}pairs() を使用して、辞書にある各成分が真または偽でマークされているかどうかをチェックします。真の場合、その成分をスープに追加します。
-- 顧客のスープlocal selectedIngredients = {}-- 顧客の選択をそのスープに追加するfor menuChoice, value in pairs(menu) doif value thentable.insert(selectedIngredients, menuChoice)endend顧客に注文を再び返す。スクリプトで以下をコード化する。
- selectedIngredients にメニューアイテムがあるかどうかをチェックします。如果存在する場合は、"You ordered soup with: " を印刷します。
- ipairs() を使用して、selectedIngredients 配列を通り抜けて、それぞれの材料を印刷します。
- 少なくとも 1つのメニューアイテムを真に変更してテストします。
-- 「選択した材料」からスープ注文を印刷if #selectedIngredients > 0 thenprint("You ordered soup with: ")for index, soupIngredient in ipairs(selectedIngredients) doprint(soupIngredient)endendメニューアイテムがあるかどうかをチェックする if 文で、顧客に材料が選択されていないかどうかを伝える他の条件を追加します。
if #selectedIngredients > 0 thenprint("You ordered soup with: ")for index, soupIngredient in ipairs(selectedIngredients) doprint(soupIngredient)endelseprint("Nothing was selected. Are you not hungry?")end
オプションのチャレンジ
以下は、ペアと ipairs を異なる方法で使用するときに生じるいくつかの課題です。これらのコードを構築できるかどうかを確認してください。 チャレンジ : 出力ウィンドウを使用せずに、アレイについての紹介 から NPC を作成して、顧客の注文を受ける待機者を作成する。 チャレンジ : プレイヤーが注文を出すことを許可 プレイヤーが、近接プロンプトなどの物理パーツに触れて、成分を選択できるようにする詳しくは、近接プロンプトを参照してください。 高度なチャレンジ : メイクミーソープシミュレータ プレイヤーがシェフとなって注文を受けるレストランシミュレータを作成する必要があります。プレイヤーは、ウェイターから与えられた注文に合わせて材料を組み合わせる必要があります。
- 3 - 5種類の異なる材料のゲーム内プロップを作成します。
- このレッスンの辞書と同じような辞書を使用して、3 - 5のレシピを作成します。
- すべてのレシピを保持する配列を作成します。
- ランダムにレシピを選択し、NPCを使用してプレイヤーに料理の材料が何であるかを伝えます。
- プレイヤーがタッチしたプロップ成分に基づいてレシピを作成する新しい辞書を作成する。
- プレイヤーのレシピと NPC が選んだレシピを比較します。
- タイマーなどの追加条件を追加して、チャレンジを増やします。