วิธีหรืออัลกอริทึมที่ใช้มากที่สุดสำหรับการบันทึกสถานะของเกม (โปรไฟล์), ไฟล์ข้อความฐานข้อมูลจะมีวิธีการเข้ารหัสและสิ่งที่เกี่ยวข้องได้อย่างไร
ฉันเห็น Caesar IV ใช้ mySQL
ข้อเสนอแนะใด ๆ
วิธีหรืออัลกอริทึมที่ใช้มากที่สุดสำหรับการบันทึกสถานะของเกม (โปรไฟล์), ไฟล์ข้อความฐานข้อมูลจะมีวิธีการเข้ารหัสและสิ่งที่เกี่ยวข้องได้อย่างไร
ฉันเห็น Caesar IV ใช้ mySQL
ข้อเสนอแนะใด ๆ
คำตอบ:
ฉันค่อนข้างแน่ใจว่ามันมักจะทำในรูปแบบที่เป็นกรรมสิทธิ์ (ไบนารี) เพียงแค่เขียนตัวแปรแต่ละตัวจากสิ่งที่สถานะเกมที่คุณใช้เป็นไฟล์หรืออ่านไฟล์นั้นกลับเข้าไปในอินสแตนซ์ของ struct ใน C ++ ตัวอย่างเช่นคุณสามารถปฏิบัติต่อวัตถุเช่นอาร์เรย์ของไบต์และเพียงแค่เขียน () ลงในไฟล์หรือ fread () จากไฟล์และโยนกลับเข้าไปในรูปแบบวัตถุ
หากคุณใช้ Java หรือภาษาอื่นคุณสามารถเลือกใช้serializationเพื่อให้งานง่ายขึ้น คำอธิบาย Java อยู่ที่ด้านล่างของคำตอบนี้ ภาษาอื่น ๆ (ระดับสูงกว่า C ++) มีไลบรารี่อนุกรมหรือฟังก์ชั่นในตัวเช่นกันซึ่งคุณควรเลือกใช้ ว่าไม่มีประสิทธิภาพประจำอนุกรมอาจจะไม่มีพื้นที่ว่างในฮาร์ดดิสก์ในปัจจุบันมีราคาถูกโดยเฉพาะอย่างยิ่งเมื่อรัฐเกมที่ไม่ควรจะมีขนาดใหญ่มากที่ทั้งหมดและจะป้องกันไม่ให้คุณจากการเขียนและการรักษากิจวัตรอนุกรมของคุณเอง
คุณควรอย่างยิ่งที่ไม่ได้ใช้ MySQL (แค่อ่านประโยคแรกของรีวิวนี้ ) หากคุณต้องการจริงๆฐานข้อมูลเชิงสัมพันธ์ด้วยเหตุผลบางอย่างใช้SQLite ; มันเป็นระบบฐานข้อมูลที่มีน้ำหนักเบาและมีอยู่ในไฟล์ฐานข้อมูลเดียว แต่สำหรับเกมส่วนใหญ่ฐานข้อมูลเชิงสัมพันธ์ไม่ใช่วิธีที่จะไปและ บริษัท ที่พยายามใช้พวกเขามักจะใช้มันเป็นตารางการค้นหาคีย์ - ค่าแทนที่จะเป็นฐานข้อมูลเชิงสัมพันธ์ที่แท้จริง
การเรียงลำดับของการเข้ารหัสไฟล์ดิสก์ภายในใด ๆ ที่เป็นเพียง obfuscation ; แฮ็กเกอร์ใด ๆ ก็จะดมกลิ่นข้อมูลทันทีหลังจากที่โปรแกรมของคุณถอดรหัส ฉันเป็นการส่วนตัวกับสิ่งนั้นโดยเฉพาะกับเกมที่มีผู้เล่นหนึ่งคน มุมมองของฉันคือเจ้าของเกม (ควรให้ความสำคัญกับลูกค้า) ควรได้รับอนุญาตให้แฮ็คที่เกมหากพวกเขาต้องการ ในบางกรณีมันสามารถสร้างความรู้สึกที่ดีขึ้นของชุมชนและ "mods" สามารถพัฒนาขึ้นสำหรับเกมของคุณซึ่งนำพาลูกค้ามาหาคุณ ตัวอย่างล่าสุดที่นึกถึงคือPortal ใน mod mod ที่เพิ่งเปิดตัว มันเผยแพร่ในเว็บไซต์ข่าวนักเล่นเกมทั่วอินเทอร์เน็ตและคุณสามารถเดิมพันมันทำให้ยอดขายของ Minecraft เพิ่มขึ้น
ถ้าด้วยเหตุผลบางอย่างที่คุณคลั่งไคล้มากพอที่จะใช้ Java สำหรับการพัฒนาเกมเช่นฉันนี่เป็นคำอธิบายสั้น ๆ เกี่ยวกับการทำให้เป็นอันดับใน Java:
เก็บข้อมูลสถานะเกมทั้งหมดของคุณไว้ในคลาสเดียวทำให้คลาสเป็นอนุกรมโดยการ
Serializable
ใช้งานใช้transient
คำสำคัญถ้าคุณผสมตัวแปรอินสแตนซ์พิเศษเข้ากับคลาส (ออบเจ็กต์ชั่วคราวไม่ต่อเนื่อง) และใช้ObjectOutputStream
เพื่อเขียนObjectInputStream
ไฟล์ . แค่นั้นแหละ.
[field: NonSerialized]
หากคุณกำลังเขียนรหัสของตัวเองพูดใน C ++ คุณสามารถใช้ไฟล์ไบนารี ไฟล์ไบนารีให้รูปแบบการเข้ารหัสผ่านการทำให้งงงวย แต่ดังที่บันทึกไว้ทั่ว internets นั่นเป็นรูปแบบความปลอดภัยที่อ่อนแอมาก
หรือคุณสามารถใช้RapidXMLเช่นถ้าคุณต้องการโซลูชันที่มนุษย์สามารถอ่านได้
หากคุณกำลังใช้งานเฟรมเวิร์กบางประเภทให้มองหาฟังก์ชั่นการสนับสนุนไฟล์ HTH
เกมส่วนใหญ่ที่ฉันเคยเห็นใช้รหัสที่เขียนด้วยมือเพื่ออ่าน / เขียนจากไฟล์ไบนารี บ่อยครั้งที่ฟอร์แมตดิสก์จะเป็นแบบจำลองที่แน่นอนของเค้าโครงหน่วยความจำของวัตถุดังนั้นการโหลดจึงเป็นเพียง:
มันเร็ว แต่เป็นเรื่องที่น่าเบื่อในการรักษาเฉพาะแพลตฟอร์มและไม่ยืดหยุ่น
เมื่อเร็ว ๆ นี้ฉันเคยเห็นเกมสองสามเกมใช้ SQLite คนที่ฉันพูดคุยดูเหมือนจะชอบ
มีการกล่าวถึงการทำให้เป็นอันดับในคำตอบอื่น ๆ และฉันยอมรับว่าเป็นทางออกที่สมเหตุสมผล วิธีหนึ่งที่ล้มเหลวแม้ว่าจะอยู่ในเวอร์ชัน
สมมติว่าคุณปล่อยเกมของคุณและผู้คนเล่นและสร้างเกมบันทึก จากนั้นในการแก้ไขภายหลังคุณต้องการแก้ไขข้อบกพร่องหรือเพิ่มคุณสมบัติบางอย่าง หากคุณใช้วิธีการซีเรียลไลซ์เซชั่นแบบไบนารี่อย่างง่ายและคุณเพิ่มสมาชิกในคลาสของคุณการทำให้เป็นอันดับของคุณอาจไม่เข้ากันได้กับเกมบันทึกเก่าเมื่อลูกค้าติดตั้งแพตช์ของคุณ
ดังนั้นวิธีใดก็ตามที่คุณใช้ตรวจสอบให้แน่ใจว่าคุณคิดถึงปัญหานี้ก่อนที่คุณจะวางจำหน่ายเกมครั้งแรก! ลูกค้าจะไม่พอใจหากพวกเขาต้องเริ่มต้นใหม่หลังจากใช้งานปะแก้
วิธีหนึ่งในการหลีกเลี่ยงปัญหานี้คือการให้แต่ละชนิดข้อมูลพื้นฐานใช้วิธีการบันทึก (รุ่น) และโหลด (รุ่น) วิธีการที่ชาญฉลาดพอที่จะรู้ว่าข้อมูลที่จะบันทึกและโหลดสำหรับแต่ละรุ่นของเกม ด้วยวิธีนี้คุณสามารถรองรับความเข้ากันได้แบบย้อนหลังของเกมบันทึกของคุณและล้มเหลวอย่างงดงามหากผู้ใช้พยายามโหลดเกมบันทึกจากเกมเวอร์ชั่นใหม่กว่าที่พวกเขากำลังเล่นอยู่
หากคุณสามารถใช้รูปแบบเดียวกับที่คุณใช้ในการจัดเก็บระดับของคุณมันเป็นโบนัส
ตัวอย่างเช่นเกมอย่างเช่น Peggle อาจมีเค้าโครงบอร์ดเริ่มต้นจำนวนลูกคะแนนปัจจุบัน (0 สำหรับบอร์ดเริ่มต้น) เป็นต้นจากนั้นเกมที่บันทึกไว้สามารถใช้รูปแบบเดียวกันได้ทุกประการ
หากคุณใช้รูปแบบเดียวกันเกมบันทึกและโหลดระดับสามารถแบ่งปันรหัสทำให้งานของคุณง่ายขึ้น!
สำหรับเกมที่มีไฟล์แผนที่ขนาดใหญ่จริง ๆ เกมบันทึกสามารถรวมไฟล์แผนที่ได้โดยการอ้างอิง ไฟล์ระดับเริ่มต้นอาจทำสิ่งเดียวกันแม้ว่าจะทำให้การกลับมาที่แผนที่นั้นง่ายขึ้นด้วยเหตุผลบางอย่างเรื่องราวมีตัวละครกลับมาที่เดิมยกเว้น NPC บางตัวตายและมีศพอยู่ทั้งหมด เกิน.