พจนานุกรมเป็นตารางที่เชื่อมโยงชื่อหรือ กุญแจ กับค่าที่ไม่ใช่ดัชนี
ตัวอย่าง:
ไวยากรณ์พจนานุกรม Luaulocal pet = {Name = "Bobbie",Type = "Dog",}
ใช้พจนานุกรมเมื่อคุณต้องการติดป้ายค่าต่าง ๆ ไม่ใช่แค่การทำรายการตามลำดับเหมือนกับอาร์เรย์ ฝึกใช้พจนานุกรมในบทแนะนำนี้โดยการจัดการค่าที่เกี่ยวข้องกับผู้เล่น
ไวยากรณ์พจนานุกรม
เหมือนกับอาร์เรย์ พจนานุกรมจะถูกกำหนดให้กับตัวแปรโดยใช้เครื่องหมายปีกกาปีกกา {} คู่กุญแจ-ค่า จะถูกจัดเก็บในบรรทัดแยกต่างหากตามด้วยลูกน้ำ กุญแจและค่าต่าง ๆ สามารถเป็นประเภทข้อมูลใดก็ได้ รวมถึงสตริง ตัวเลข และชื่อตัวแปร
local playerNames = {player1 = "Zap",player2 = "Kel",}print(playerNames["player1"])
เมื่อต้องการอ้างอิงส่วนต่าง ๆ หรือวัตถุที่สร้างขึ้นอื่น ๆ เป็นกุญแจให้ใช้เครื่องหมายวงเล็บ
local greenPart = workspace.GreenPartlocal redPart = workspace.RedPartlocal partList = {[greenPart] = true,[redPart] = false,}print(partList[redPart])
สร้างพจนานุกรม
การใช้งานทั่วไปของพจนานุกรมคือการจัดระเบียบข้อมูลของผู้เล่นหรือตัวละคร ขั้นตอนเหล่านี้สำรวจวิธีการเก็บและเข้าถึงข้อมูลของตัวละครศัตรูในทางทฤษฎี
ในสคริปต์ใหม่ สร้างพจนานุกรมชื่อ enemy.
local enemy = {}กุญแจแรกในพจนานุกรมจะติดตามชื่อของศัตรูด้วยตัวแปรชื่อ Name.
local enemy = {Name}กำหนดชื่อศัตรูให้กับกุญแจ ตามด้วยลูกน้ำ
local enemy = {Name = "Spike",}เพิ่มคู่กุญแจ-ค่าอันดับสองสำหรับจำนวนสุขภาพที่ศัตรูควรมี จำไว้ว่า กุญแจควรใช้ประเภทข้อมูลเดียวกันเสมอ แต่ค่าก็ไม่จำเป็นต้องเช่นกัน
local enemy = {Name = "Spike",Health = 1000,}
ใช้ค่าพจนานุกรม
มีสองวิธีในการเข้าถึงค่าพจนานุกรม:
- tableName["keyName"] (ที่สำคัญโปรดทราบเครื่องหมายคำพูด)
- tableName.keyName
local enemy = {Name = "Spike",Health = 1000,}print("ฝ่ายที่ชั่วร้าย " .. enemy["Name"] .. " กำลังเข้าใกล้!")print("ฝ่ายที่ชั่วร้าย " .. enemy.Name .. " กำลังเข้าใกล้!")
การใช้รูปแบบใดมักขึ้นอยู่กับวัตถุประสงค์ของตาราง สำหรับตารางที่ถือคอลเลกชันของค่า เช่น รายชื่อผู้เล่นในเซิร์ฟเวอร์ ผู้เขียนโค้ดมักจะใช้ tableName["keyName"] สำหรับพจนานุกรมที่ใช้ในการอธิบายวัตถุ ผู้เขียนโค้ดมีแนวโน้มที่จะใช้ tableName.keyName.
เปลี่ยนค่าพจนานุกรม
การเปลี่ยนค่าของกุญแจเป็นไปตามที่อื่น ๆ ใช้ตัวดำเนินการเทียบเท่ากับ =
ด้านล่างตาราง enemy ตั้งชื่อศัตรูให้เป็นอย่างอื่น
local enemy = {Name = "Spike",Health = 1000,}enemy.Name = "Rana"print("ชื่อศัตรูคือ " .. enemy.Name)ทดสอบการเล่นและตรวจสอบหน้าต่างผลลัพธ์
ตัวแปรที่มีอยู่ล่วงหน้าเป็นกุญแจ
พจนานุกรมสามารถโต้ตอบกับตัวแปรที่ประกาศไว้ในส่วนอื่น ๆ ของสคริปต์ ตัวอย่างโค้ดต่อไปนี้ใช้ตัวแปรในการเพิ่มชื่อผู้เล่นเป็นกุญแจเมื่อพวกเขาเข้าร่วมประสบการณ์ จากนั้นตั้งค่าคะแนนของพวกเขาเป็น 0
ใน ServerScriptService สร้างสคริปต์ใหม่ชื่อ PlayerPoints ในสคริปต์ รับบริการ Players และสร้างพจนานุกรมว่างชื่อ playerPoints.
local Players = game:GetService("Players")local playerPoints = {}เขียนฟังก์ชันท้องถิ่นสำหรับการตั้งค่าคะแนนของผู้เล่นพร้อมพารามิเตอร์สำหรับตัวแปรผู้เล่นใหม่ เชื่อมต่อฟังก์ชันกับเหตุการณ์ Players.PlayerAdded.
local playerPoints = {}local function setPoints(newPlayer)endPlayers.PlayerAdded:Connect(setPoints)ในฟังก์ชัน เพิ่มตัวแปรเพื่อรับชื่อของผู้เล่น ซึ่งเป็นคุณสมบัติในทุก ๆ วัตถุ Player และเพิ่มประโยคพิมพ์เพื่อตรวจสอบ
local function setPoints(newPlayer)local name = newPlayer.Nameprint("สวัสดี " .. name)endใส่ name ลงในพจนานุกรม playerPoints เป็นกุญแจ และตั้งค่าเป็น 0
local function setPoints(newPlayer)local name = newPlayer.Nameprint("สวัสดี " .. name)playerPoints[name] = 0endใช้ name เพื่อพิมพ์ชื่อผู้เล่นและ playerPoints[name] เพื่อพิมพ์ค่าของกุญแจที่ตรงกับตัวแปร
local function setPoints(newPlayer)local name = newPlayer.Nameprint("สวัสดี " .. name)playerPoints[name] = 0print(name .. " มีคะแนน " .. playerPoints[name] .. " คะแนน.")endเรียกใช้โปรเจกต์และสังเกตผลลัพธ์
สคริปต์ที่เสร็จสิ้น
local Players = game:GetService("Players")
local playerPoints = {
}
local function setPoints(newPlayer)
local name = newPlayer.Name
print("สวัสดี " .. name)
playerPoints[name] = 0
print(name .. " มีคะแนน " .. playerPoints[name] .. " คะแนน.")
end
Players.PlayerAdded:Connect(setPoints)
ความท้าทายเพิ่มเติม
ด้านล่างนี้คือความท้าทายบางประการที่ใช้กับการใช้พจนานุกรมในวิธีที่แตกต่างกัน ดูว่าคุณสามารถสร้างโค้ดสำหรับสิ่งเหล่านี้ได้หรือไม่
- สร้างชิ้นส่วนกับดักที่ทำความเสียหายต่อผู้เล่นเมื่อเวลาผ่านไป เมื่อผู้เล่นสัมผัสกับกับดัก ให้ทำความเสียหายให้พวกเขา รอ จากนั้นอนุญาตให้พวกเขาได้รับความเสียหายอีกครั้ง
- สร้างฟังก์ชันที่ตรวจสอบว่าผู้เล่นสองคนใดมีคะแนนมากที่สุดโดยการเข้าถึงพจนานุกรม
- สร้างรหัสลับ ซึ่งเป็นระบบการสลับสตริงหนึ่งไปอีกหนึ่งเพื่อสร้างรหัส "ลับ" ตัวอย่างเช่น ตัวอักษร "A" สามารถสลับกับ "G" หรือคำว่า "apple" สามารถสลับกับ "orange"
พจนานุกรมและ 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
สรุป
พจนานุกรมเป็นตารางที่ใช้คู่กุญแจ-ค่าแทนค่าที่ถูกจัดทำดัชนี พจนานุกรมและอาร์เรย์เริ่มต้นคล้ายกันโดยการกำหนดเครื่องหมายปีกกาปีกกาให้กับตัวแปร ให้แยกเอนทรีด้วยลูกน้ำ
กุญแจทั้งหมดภายในพจนานุกรมควรใช้ประเภทข้อมูลเดียวกัน แต่ค่าสามารถผสมประเภทข้อมูลได้โดยไม่มีปัญหา
วิธีการเข้าถึงพจนานุกรมสามารถบอกถึงวัตถุประสงค์ของมัน พจนานุกรมของคุณสมบัติของศัตรูจะถูกเข้าถึงด้วยตัวดำเนินการจุด ในขณะที่รายการชื่อจะใช้ tableName[keyName]
เมื่อใช้เครื่องหมายวงเล็บ ต้องระมัดระวัง ชื่อกุญแจที่สร้างขึ้นภายในตารางจะต้องถือว่าเป็นสตริง: tableName["keyName"] อย่างไรก็ตามเมื่ออ้างถึงวัตถุเช่นชิ้นส่วน เครื่องหมายคำพูดไม่จำเป็น: tableName[keyName]
สคริปต์หลาย ๆ ตัวต้องทำงานผ่านพจนานุกรมหรืออาร์เรย์ แต่คุณอาจไม่รู้จุดเริ่มต้นและจุดสิ้นสุดของโครงสร้างข้อมูลเหล่านี้เสมอไป ตัวอย่างเช่น พจนานุกรมของผู้เล่นอาจมีการเปลี่ยนแปลง หรือผู้เล่นอาจมีอาร์เรย์ของสินค้าคงคลังที่มีขนาดต่างกัน
ในสถานการณ์เหล่านี้ คุณสามารถใช้ pairs() และ ipairs() ในลูป for เพื่อผ่านแต่ละองค์ประกอบโดยไม่ต้องรู้จุดเริ่มต้นและจุดสิ้นสุด คุณยังสามารถใช้การวนซ้ำทั่วไปด้วยคำว่า in เพื่อวนไปรอบ ๆ องค์ประกอบโดยไม่จำเป็นต้องใช้ pairs() หรือ ipairs()