ฉันควรใช้ไฟล์ข้อความสำหรับบันทึกข้อมูลของฉันหรือไม่


22

คำถามของฉันคือฉันควรใช้ไฟล์ข้อความเพื่อบันทึกข้อมูลเกมของฉันหรือไม่ ฉันมีความกังวลพื้นฐานเกี่ยวกับการทำเช่นนี้:

  1. ไม่มีวิธีใดในการปกป้องข้อมูลดังนั้นผู้ใช้สามารถทำให้หมดทุกอย่างถ้าพวกเขาแตะมันและฉันไม่ต้องการให้เกิดขึ้น

  2. อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการจัดเก็บข้อมูลของฉัน (จะมีจำนวนมาก)

ฉันรู้วิธีแยก / เขียนไฟล์ข้อความอย่างมีประสิทธิภาพ แต่สำหรับการทำต้นแบบพวกเขายอดเยี่ยม ฉันแค่ต้องการมองไปสู่อนาคตสำหรับสิ่งที่ฉันควรจะคิดเกี่ยวกับการเปลี่ยนไปใช้เพื่อที่จะไม่เจาะฉันในหน้าใกล้สิ้นสุดการพัฒนา

หากฉันไม่ควรใช้ไฟล์ข้อความฉันควรใช้อะไรดี ฉันต้องการบางสิ่งบางอย่างที่รองรับ C ++


2
ไฟล์ซิป (ด้วยรหัสผ่าน) - มีห้องสมุดจำนวนมากที่จะช่วยให้คุณทำเช่นนี้และควรประหยัดพื้นที่ดิสก์
SeanC

2
การใช้รหัสลับอย่างง่ายเช่นen.wikipedia.org/wiki/ROT13น่าจะเพียงพอที่จะป้องกันไม่ให้ผู้ใช้โดยเฉลี่ยทำการแก้ไขไฟล์ คนอื่นอาจรู้ว่าพวกเขากำลังทำอะไรอยู่
Exilyth

1
มีวิธีของคุณเอง แต่ฉันต้องการให้เกมของฉันสามารถแก้ไขได้อย่างง่ายดาย
mmyers

คำตอบ:


28

สำหรับตอนนี้ตั้งแต่คุณเพิ่งเริ่มต้นไฟล์ข้อความอาจจะไม่เป็นไร คำถามของคุณมีข้อกังวลสองสามข้อที่ฉันจะกล่าวถึง

  1. การปกป้องข้อมูลนั้นไม่สำคัญเท่ากับที่คุณคิด หากเกมของคุณเป็นแบบผู้เล่นหลายคนคุณจะมีข้อมูลที่บันทึกไว้ที่ฝั่งเซิร์ฟเวอร์แล้ว หากเกมของคุณเป็นผู้เล่นเดี่ยวดังนั้นถ้าหากผู้เล่นดัดแปลงข้อมูล หากพวกเขาทำลายบางสิ่งมันเป็นความผิดของพวกเขาและพวกเขาสามารถติดตั้งใหม่ได้

  2. ประสิทธิภาพเป็นอย่างอื่นที่เรามักจะล้มเหลวในการวางแผนอย่างถูกต้อง คุณไม่ควรปรับให้เหมาะสมจนกว่าคุณจะวัดปัญหาประสิทธิภาพจริง ๆ ฉันเดาว่าคุณอาจจะมีปริมาณของข้อมูลที่ไม่ได้เป็นที่ไฟล์ข้อความขนาดใหญ่และที่กำลังจะเป็นเพียงแค่ปรับ

ดังที่กล่าวไว้ทางออกที่ดีที่สุดของคุณคือการสรุปข้อมูลการบันทึกและการโหลดตามปกติเท่าที่จะทำได้ ตัวอย่างเช่นคุณสามารถมีคลาสฐานพูดDataWriterและจากนั้นให้ใช้งานที่แตกต่างกันของวิธีการที่แตกต่างกัน ตัวอย่างพื้นฐานที่น่าสนใจ:

class DataWriter {
  virtual void save(GameState state) = 0;

  virtual ~DataWriter() { }
};

class TextFileDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to text file
  }
};

class DatabaseDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to database
  }
};

ในที่สุดเมื่อคุณทำโปรไฟล์เกมของคุณและตระหนักถึงปัญหาคอขวดของประสิทธิภาพการทำงานอยู่ในขั้นตอนการเขียนไฟล์คุณสามารถจัดเตรียมการดำเนินการอื่นของคลาสนั้น (ตัวอย่างเช่นการเขียนไปยังฐานข้อมูลแทน) โดยมีการเปลี่ยนแปลงเล็กน้อยในการเรียกรหัส


มันเป็นเกมที่เล่นคนเดียวและนั่นเป็นความคิดของฉันอย่างแน่นอนหากพวกเขาต้องการยุ่งกับข้อมูล ฉันไม่รู้บางอย่างเกี่ยวกับไฟล์ข้อความดูเหมือนไม่เป็นมืออาชีพและฉันคิดว่าถ้าฉันสามารถป้องกันไม่ให้ผู้ใช้พลาด นอกจากนี้คุณหมายถึงอะไรเมื่อคุณพูดว่า "ฐานข้อมูล"? ฉันได้ยินมาว่าโยนไปมาเยอะ แต่ฉันไม่รู้ว่าคำจำกัดความที่แน่นอนหรือไฟล์ประเภทใดที่เกี่ยวข้อง
Althezel

6
@Althezel สิ่งคือโดยไม่คำนึงถึงวิธีการบันทึกข้อมูลของคุณมีคนตัดสินใจพอที่จะแก้ไขมันจะสามารถ ในแง่ที่ว่าก็มักจะเสียเวลาในการพัฒนาของคุณมีค่าที่จะลองและใส่ความคุ้มครองในสถาน :)
pwny

@Althezel สำหรับฐานข้อมูลคิดว่ามันเป็นเอ็นจิ้นที่คุณส่งคำขอเพื่ออ่านหรือเขียนข้อมูล เอ็นจิ้นนั้นรับผิดชอบในการบันทึก / อ่านอย่างมีประสิทธิภาพโดยปกติจะอยู่ในรูปแบบเชิงสัมพันธ์ในตาราง ในกรณีที่คุณใช้งานฉันจะดู SQLite ( sqlite.org ) โดยทั่วไปคุณจะต้องใช้ไลบรารี C ++ เพื่อเชื่อมต่อกับฐานข้อมูล SQLite ท้องถิ่น (SQLite ใช้ไฟล์ในเครื่อง) และส่งการเรียกไลบรารีนั้นในไวยากรณ์ SQL เพื่อเข้าถึงข้อมูลของคุณ
pwny

2
มันเป็นโลกที่น่าเศร้าเมื่อนักพัฒนาต้องการล็อคผู้ใช้จากข้อมูลที่พวกเขาเก็บไว้ในคอมพิวเตอร์ของพวกเขา
ClassicThunder

2
มันรู้สึกไม่เป็นมืออาชีพจริงๆที่จะใช้ไฟล์ข้อความเพราะมีเพียงไม่กี่เกมที่เก็บสิ่งต่าง ๆ ในชื่อ "save-data.txt" - แต่ถ้าคุณเคยใช้เวลาดูไฟล์เกมที่บันทึกไว้ส่วนใหญ่คุณจะพบว่ามันไม่มีอะไรมากกว่าไฟล์ข้อความ ที่บางครั้งมีข้อมูลไบนารีเพิ่มเข้ามา ยกตัวอย่างเช่นทุกเกมในซีรีส์ Civilization and Total War ใช้ไฟล์. txt ที่แท้จริงสำหรับข้อมูลเกมที่หลากหลาย 'อัพเกรด' ที่พบบ่อยที่สุดสำหรับสิ่งนี้คือระบบฐานข้อมูลที่จัดเก็บข้อมูลในรูปแบบไฟล์แบนที่ยกเว้น blob ไบนารีบางตัวเป็นเพียงไฟล์ข้อความ
BrianH

3

คำว่าข้อมูลเกมอาจมีความหมายหลายอย่างเช่น

  • GameState
  • ไฟล์กำหนดค่า
  • แผนที่พื้นผิวเสียงสคริปต์ข้อมูลภาพเคลื่อนไหว ...
  • การ จำกัด
  • ข้อมูลโครงร่าง GUI
  • มากกว่าที่ฉันไม่ได้คิด

สำหรับแต่ละหมวดหมู่คุณสามารถใช้แนวทางอื่นได้

ตัวอย่างเช่นคุณสามารถใช้SQLiteสำหรับการโลคัลไลซ์เซชั่น, ไบนารีสำหรับแผนที่, พื้นผิว, เสียงและอื่น ๆ

สำหรับการกำหนดค่าคุณควรใช้ไฟล์ xml ที่เปลี่ยนแปลงได้ง่าย

เช่นเคยคำตอบที่ถูกต้องคือ "มันขึ้นอยู่กับ"

มีตัวแยกวิเคราะห์ xml จำนวนมากที่มีการเชื่อม c ++ และการผูก c ++ สำหรับ SQLite ก็มีอยู่เช่นกัน


อาจเป็นเรื่องทางศาสนา แต่ฉันอยากจะใช้รูปแบบไฟล์ INI สำหรับการกำหนดค่าแทนที่จะเป็น XML หลังรู้สึกเหมือน overkill สำหรับสถานการณ์นี้ และมีเครื่องอ่าน INI ในการเพิ่มไลบรารี
Artur Czajka

0

คุณสามารถบันทึกข้อมูลของคุณในรูปแบบไบนารีหยดและสตรีมข้อมูลกลับมาเมื่อคุณเข้าถึงไฟล์นั้น วิธีนี้จะช่วยแก้ปัญหาของคุณทั้งสอง เพียงตรวจสอบให้แน่ใจว่ารหัสการทำให้เป็นอนุกรมเหมือนกับการทำให้เป็นอนุกรม

การสตรีมในไบนารีบล็อบบนั้นค่อนข้างเร็วและยังป้องกันไม่ให้ผู้ใช้เห็นข้อมูลและเปลี่ยนมัน

คุณสามารถทำสิ่งเหล่านี้ให้สำเร็จด้วยการใช้ไลบรารี่มาตรฐาน


2
ในขณะที่หยดไบนารีเป็นเรื่องง่ายและรวดเร็ว (ทั้ง dev และโหลด / Run) ที่ใหญ่ที่สุดปัญหาฉันเคยมีหยดไบนารีเร็วที่สุดเท่าที่คุณจะเปลี่ยนอะไรเกี่ยวกับองค์กรโครงสร้างข้อมูล (ให้มากที่สุดเท่าเพิ่มเดียวfloatสมาชิกที่เดียว วัตถุ) savegames เก่ากลายเป็นโมฆะอย่างสมบูรณ์ นี่เป็นเรื่องยากที่จะจัดการในระหว่างการพัฒนา แต่ถ้าคุณทำตามนั้นโดยทั้งหมด
bobobobo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.