ฉันกำลังพิจารณาที่จะนำระบบพรสวรรค์ไปใช้กับ RPG ออนไลน์ซึ่งคล้ายกับที่เห็นใน World of Warcraft ซึ่งการได้รับทักษะจะปลดล็อค "ระดับ" ถัดไปที่อยู่ใต้ต้นไม้
ไม่มีใครรู้วิธีที่ดีที่สุดในการใช้โครงสร้างนี้ในฐานข้อมูล / รหัส?
ฉันกำลังพิจารณาที่จะนำระบบพรสวรรค์ไปใช้กับ RPG ออนไลน์ซึ่งคล้ายกับที่เห็นใน World of Warcraft ซึ่งการได้รับทักษะจะปลดล็อค "ระดับ" ถัดไปที่อยู่ใต้ต้นไม้
ไม่มีใครรู้วิธีที่ดีที่สุดในการใช้โครงสร้างนี้ในฐานข้อมูล / รหัส?
คำตอบ:
ใช้โครงสร้างเช่นนี้เพื่อเป็นตัวแทนของต้นไม้ในฐานข้อมูล:
#Talent
id parent description
1 0 Tackle
2 1 Kick
3 1 Punch
4 3 Fire Punch
และอีกตารางเพื่อแสดงความสามารถที่ได้รับต่อผู้ใช้
#UserTalent
id user talent
1 4 1
2 4 3
3 4 4
คุณสามารถตรวจสอบความสามารถในการพึ่งพาความสามารถทางโปรแกรมโดยการสอบถามตารางความสามารถที่สมบูรณ์ คุณสามารถทำเช่นนั้นกับ SQL ได้ แต่จะต้องเลือกย่อยซ้ำหรือแบบสอบถามจำนวนมาก ทำได้ดีกว่าในรหัสของคุณ
หากมีการขึ้นต่อกันหลายอย่างเช่นFire Punch
ขึ้นกับPunch
และImmolation
ใช้สองตารางเพื่อแสดงกราฟการพึ่งพา:
#Talent
id description
1 Tackle
2 Kick
3 Punch
4 Fire Punch
5 Immolation
#Depedency
id parent child
1 0 1
2 0 5
3 1 2
4 1 3
5 3 4
6 5 4
ฉันอยากจะแนะนำให้ใช้ต้นไม้ที่แต่ละโหนดแสดงถึงพรสวรรค์ / ทักษะที่เฉพาะเจาะจง ขึ้นอยู่กับว่าผู้เล่นได้รับพรสวรรค์หรือไม่พรสวรรค์ของเด็กจะได้รับ ตัวอย่างเช่นโครงสร้างข้อมูลต่อไปนี้
class Talent {
std::vector<Talent*> children;
bool earned;
};
ในการพิจารณาว่าผู้เล่นคนใดมีความสามารถคุณจะนำพรสวรรค์ที่มีอยู่แล้วเดินลงไปที่กราฟจนกว่าคุณจะไปถึงโหนดพรสวรรค์ที่ได้รับนั้นเป็นเท็จ สิ่งนี้จะเปิดเผยว่าพรสวรรค์ใดบ้างที่มีให้ได้รับ: ความสามารถแรกในแต่ละสาขาลดลงจากความสามารถพิเศษที่ได้รับนั้นเป็นเท็จ
ptr_vector
อาจดีกว่านี้
ในเกมของฉันฉันทำแบบนี้:
ฐานข้อมูล:
Reference_talent : มี ID, ชื่อ, เอฟเฟกต์และอื่น ๆ ที่ไม่ซ้ำกัน
พรสวรรค์ : id, playerid <- มีความสามารถทั้งหมดที่ผู้เล่นได้ "เรียนรู้"
Ingame: (บนเซิร์ฟเวอร์)
ฉันโหลด Reference_talents ทั้งหมดในแผนที่ 'คงที่' (อ่านอย่างเดียว) std :: map เพื่อให้ฉันสามารถเข้าถึงได้อย่างง่ายดายโดยใช้ ID ของพวกเขา
เมื่อลูกค้าตรวจสอบผู้เล่นฉันจะได้รับความสามารถทั้งหมดจากฐานข้อมูลและแบ่งปันพวกเขาใน std :: vector เพื่อที่เมื่อฉันต้องการคำนวณลักษณะอื่น ๆ ฉันมีพวกเขาใน RAM ฉันยังส่งพรสวรรค์ไปยังลูกค้าด้วย
นั่นคือเกี่ยวกับมัน (ยกเว้นบันทึกความสามารถใหม่ของหลักสูตรซึ่งเป็นเพียง 'INSERT' ในตาราง 'พรสวรรค์' + ข้อความถึงลูกค้า)
คุณอธิบายว่ามันเป็นความสัมพันธ์ระหว่างตัวปลดล็อคและปลดล็อคคล้ายกับในบทช่วยสอนนี้นี้ ฉันขอแนะนำให้เรียนรู้เพิ่มเติมเกี่ยวกับพีชคณิตเชิงสัมพันธ์และฐานข้อมูล พวกเขาเป็นวิธีที่ดีในการสร้างแบบจำลองข้อมูล หากคุณเรียนรู้วิธีสอบถามข้อมูลจากฐานข้อมูลคุณสามารถสร้างแบบจำลองข้อมูลได้ค่อนข้างง่าย
ฉันไม่รู้ว่าคุณรู้เรื่องแบบจำลองความสัมพันธ์มากแค่ไหน บทช่วยสอนนั้นจะช่วยคุณได้
ฉันคิดว่า WoW ทำงานเหมือนในความเป็นจริง (ehm)
มันคือความสัมพันธ์ N: N ซึ่งหมายถึงคุณต้องการ "คนกลาง" ความสัมพันธ์ใหม่ระหว่างสองความสามารถ:
(talent who unlocks id, talent who is unlocked)
วิธีนี้คุณสามารถมีพรสวรรค์ปลดล็อค B, C และ D ((A, B), (A, C), (A, D)) และพรสวรรค์ Y ปลดล็อคโดย X, Z และ W ((X, Y), ( Z, Y), (W, Y)) ในภาษาที่จำเป็น / ขั้นตอน / เชิงวัตถุคุณจะทำมันเป็นรายการ / อาร์เรย์ของคู่เช่น:
var unlocks_unlocked = [[A, B],[A,C],[A,D],[X,Y],[Z,Y],[W,Y]];
ดังนั้นสำหรับตัวอย่าง "โลกแห่งความจริง" คุณสามารถมี:
... ["running fast", "jumping superhigh"], ["antigravity's child", "jumping superhigh"]
และหมายความว่าคุณจะได้รับ "การกระโดดสูงสูง" หลังจากที่คุณมีความสามารถ "วิ่งเร็ว" และ "ลูกแรงต้านแรงโน้มถ่วง"
ฉันไม่ได้เล่น Diablo เมื่อเร็ว ๆ นี้ แต่อาจเป็นไปได้ว่ามันมีเพียง:
มันคือ 1: ความสัมพันธ์ N:
You put "is unlocked by this talent's id" variable into talent's structure
ชอบ:
var Talent[8] = { "name": "superpower", "unlocked by": "being Clark Kent"};
UserTalent
ตารางของคุณไม่จำเป็นต้องมีคอลัมน์ autokeyuser
และtalent
สามารถเป็นสองคอลัมน์เท่านั้นและคีย์ผสม: จะไม่มีการซ้ำซ้อนและคุณจะไม่ค้นหาid
เลย