많은 스크립트는 종종 사전이나 배열을 탐색해야 합니다. 그러나 때때로 이러한 데이터 구조의 시작과 끝을 모를 수 있습니다. 예를 들어, 플레이어 사전이 변경되거나 플레이어가 크기가 다양한 배열 인벤토리를 가질 수 있습니다.
이러한 상황에서는 pairs()와 ipairs()를 사용할 수 있습니다. 이러한 함수는 시작 및 끝 포인트를 알지 못한 상태에서 각 요소를 탐색하기 위해 for 루프와 함께 사용할 수 있습니다.
이 기사에서는 이들을 사용하는 방법과 요리 게임에서 레스토랑 주문을 추적하는 실제 스크립트 예제를 다룰 것입니다.
사전과 pairs()
pairs()는 사전과 함께 사용됩니다. 아래 예제를 확인하세요.
local myDictionary = {["Blue Player"] = "Ana",["Gold Player"] = "Binh",["Red Player"] = "Cate",}for key, value in pairs(myDictionary) doprint(key .. "은 " .. value .. "입니다.")end
pairs()는 사전 요소의 키, 값 또는 둘 다를 사용하여 작업하는 데 사용할 수 있습니다. 아래의 for 루프에서 첫 번째 변수는 키입니다. 두 번째 변수는 값입니다. 작업하려는 사전이 pairs()에 전달됩니다.
local inventory = {["Gold Bricks"] = 43,Carrots = 3,Torches = 2,}print("당신은 가지고 있는 것:");for itemName, itemValue in pairs(inventory) doprint(itemValue, itemName)end
코드를 실행하면 다음과 같은 출력이 생성됩니다:
당신은 가지고 있는 것:43 Gold Bricks3 Carrots2 Torches
배열과 ipairs()
ipairs()는 배열과 함께 사용됩니다. ipairs()의 "i"는 "인덱스"를 의미합니다. ipairs()와 배열을 for 루프와 결합하여 리더보드와 같은 정렬된 값을 작업할 수 있습니다. 아래 예제를 확인하세요.
local players = {"Ali", "Ben", "Cammy"}for playerRank, playerName in ipairs(players) doprint("우승자 #" .. playerRank .. "은 " .. playerName .. "입니다.")end
코드를 실행하면 다음과 같은 출력이 생성됩니다:
우승자 #1은 Ali입니다.우승자 #2는 Ben입니다.우승자 #3은 Cammy입니다.
연습 - 레스토랑 수프 시뮬레이터
플레이어가 가능한 수프 재료 목록에서 선택하는 레스토랑 시뮬레이터를 위해 수프를 만들어 봅시다. 재료는 키로 저장되고, 값은 플레이어가 선택한 것을 받을 수 있도록 처음에는 false로 설정됩니다.
pairs()를 사용하여 어떤 것이 선택되었는지 확인한 다음 ipairs()를 사용하여 재료 목록을 인쇄합니다.
사전을 만들고 menu라는 이름을 붙입니다. 키는 재료이고 값은 false인 3 - 5 개의 키-값 쌍을 추가합니다.
local menu = {cabbage = false,beef = false,tomato = false,noodles = false,}메뉴 사전 아래에 고객의 선택으로 나중에 채워질 빈 배열을 추가합니다.
-- 고객의 수프local selectedIngredients = {}pairs()를 사용하여 사전의 각 재료가 true 또는 false로 표시되어 있는지 확인합니다. true인 경우 재료를 수프에 추가합니다.
-- 고객의 수프local selectedIngredients = {}-- 고객의 선택을 수프에 추가합니다for menuChoice, value in pairs(menu) doif value thentable.insert(selectedIngredients, menuChoice)endend고객에게 주문 내용을 반복해서 확인합니다. 스크립트에 다음을 코드로 작성합니다.
- selectedIngredients에 메뉴 항목이 있는지 확인합니다. 그렇다면 인쇄합니다: "당신은 다음과 같은 수프를 주문했습니다: ".
- ipairs()를 사용하여 selectedIngredients 배열을 탐색하고 각 재료를 인쇄합니다.
- 최소한 하나의 메뉴 항목을 true로 변경하여 테스트합니다.
-- "selectedIngredients"에서 수프 주문 인쇄if #selectedIngredients > 0 thenprint("당신은 다음과 같은 수프를 주문했습니다: ")for index, soupIngredient in ipairs(selectedIngredients) doprint(soupIngredient)endend메뉴 항목이 있는지 확인하는 if 문에 고객에게 재료가 선택되지 않았음을 알려주는 else 조건을 추가합니다.
if #selectedIngredients > 0 thenprint("당신은 다음과 같은 수프를 주문했습니다: ")for index, soupIngredient in ipairs(selectedIngredients) doprint(soupIngredient)endelseprint("선택된 것이 없습니다. 배가 고프지 않나요?")end
선택적 도전 과제
아래는 pairs와 ipairs를 다양한 방식으로 사용하는 도전 과제입니다. 이러한 도전 과제를 코드로 구현해 보세요.
도전 과제: 웨이터 NPC 만들기 출력 창을 사용하는 대신, 배열 소개에서 NPC를 사용하여 고객의 주문을 받는 웨이터를 만드세요.
도전 과제: 플레이어가 주문하기 플레이어가 근접 프롬프트와 같은 물리적인 부분을 터치하여 재료를 선택할 수 있도록 합니다. 자세한 내용은 근접 프롬프트를 참조하세요.
고급 도전 과제: 나를 위한 수프 시뮬레이터 만들기 플레이어가 요리사가 되는 레스토랑 시뮬레이터를 만드세요! 플레이어는 웨이터가 제공한 주문에 맞게 재료를 조합해야 합니다.
- 3 - 5개의 서로 다른 재료에 대한 게임 내 소품을 만듭니다.
- 이 수업에서의 사전과 유사한 3 - 5개의 레시피를 만듭니다.
- 모든 레시피를 담고 있는 배열을 만듭니다.
- 무작위로 레시피를 선택하고 NPC를 사용하여 플레이어에게 재료가 무엇인지 알려줍니다.
- 플레이어가 터치한 소품 재료를 기반으로 레시피를 만들기 위한 새 사전을 만듭니다.
- 플레이어의 레시피와 NPC가 선택한 레시피를 비교합니다.
- 타이머와 같은 추가 조건을 추가하여 도전을 증가시킵니다.