Haruskah saya menggunakan file teks untuk menyimpan data saya?

22

Pertanyaan saya adalah apakah saya harus menggunakan file teks atau tidak untuk menyimpan data permainan saya. Saya memiliki beberapa keprihatinan mendasar untuk melakukan ini:

  1. Benar-benar tidak ada cara untuk melindungi data, dan dengan demikian, pengguna dapat mengacaukan semuanya jika mereka menyentuhnya dan saya tidak ingin itu terjadi.

  2. Ini mungkin bukan cara paling efisien untuk menyimpan data saya (Akan ada banyak hal)

Saya tahu bagaimana mem-parsing / menulis ke file teks secara efektif, jadi untuk membuat prototip mereka sangat luar biasa. Saya hanya ingin melihat ke masa depan untuk apa yang saya harus pikirkan tentang beralih ke sehingga tidak meninju wajah saya di dekat akhir pengembangan.

Jika saya tidak boleh menggunakan file teks, apa yang harus saya gunakan? Saya membutuhkan sesuatu yang kompatibel dengan C ++.

Althezel
sumber
2
File zip (dengan kata sandi) - ada banyak perpustakaan yang tersedia yang memungkinkan Anda melakukan hal ini, dan itu akan menghemat ruang disk
SeanC
2
Menerapkan cipher sederhana seperti en.wikipedia.org/wiki/ROT13 harus cukup untuk mencegah pengguna rata-rata mengedit file. Semua orang mungkin tahu apa yang mereka lakukan.
Exilyth
1
Terserah Anda sendiri, tapi saya suka game saya mudah dimodifikasi.
mmyers

Jawaban:

28

Untuk saat ini, karena Anda baru memulai, file teks mungkin baik-baik saja. Ada beberapa masalah dalam pertanyaan Anda yang akan saya bahas.

  1. Melindungi data tidak sepenting yang mungkin Anda pikirkan. Jika game Anda multipemain, Anda akan menyimpan data di sisi server. Jika game Anda adalah pemain tunggal, lalu bagaimana jika para pemain memodifikasi data? Jika mereka memecahkan sesuatu itu benar-benar kesalahan mereka dan mereka dapat menginstal ulang.

  2. Kinerja juga merupakan hal lain yang sering gagal kami rencanakan dengan baik. Anda seharusnya tidak benar-benar mengoptimalkan sampai Anda benar-benar mengukur masalah kinerja. Dugaan saya adalah bahwa Anda mungkin akan memiliki jumlah data yang tidak terlalu besar dan file teks akan baik-baik saja.

Yang sedang berkata, taruhan terbaik Anda adalah abstrak penyimpanan dan pemuatan data Anda sebaik mungkin. Misalnya, Anda dapat memiliki kelas dasar, katakanlah DataWriter, dan kemudian berikan implementasi yang berbeda dari metode yang berbeda. Contoh yang sangat mendasar akan terlihat seperti:

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
  }
};

Ketika Anda akhirnya membuat profil game Anda dan menyadari bahwa bottleneck kinerja ada dalam rutinitas penulisan file, Anda dapat memberikan implementasi lain dari kelas itu (misalnya untuk menulis ke database) dengan sedikit perubahan pada kode panggilan.

pwny
sumber
Ini adalah permainan pemain tunggal, dan itu adalah pikiranku persis jika mereka ingin mengacaukan data. Saya tidak tahu, sesuatu tentang file teks sepertinya tidak profesional, dan saya pikir jika saya bisa menjaga agar pengguna tidak mengacaukannya, mungkin saya harus melakukannya. Juga, apa yang Anda maksud ketika Anda mengatakan "Database"? Saya mendengar bahwa banyak dilemparkan tapi saya tidak tahu definisi yang tepat atau apa jenis file yang diperlukan.
Althezel
6
@Alezez ​​Masalahnya adalah, terlepas dari bagaimana Anda menyimpan data Anda, seseorang yang cukup bertekad untuk memodifikasinya akan dapat melakukannya. Dalam hal itu, biasanya buang waktu pengembangan berharga Anda untuk mencoba dan menempatkan perlindungan :)
pwny
@Alezezel Untuk databasenya, anggap sebagai semacam mesin yang Anda gunakan untuk mengirim permintaan membaca atau menulis data. Mesin itu bertanggung jawab untuk menyimpan / membacanya dengan cara yang efisien, biasanya dalam bentuk relasional dalam tabel. Dalam kasus penggunaan Anda, saya akan melihat SQLite ( sqlite.org ). Pada dasarnya Anda akan menggunakan pustaka C ++ untuk terhubung ke database SQLite lokal (SQLite menggunakan file lokal) dan meneruskan panggilan pustaka itu dalam sintaks SQL untuk mengakses data Anda.
pwny
2
Ini adalah dunia yang menyedihkan ketika pengembang ingin dapat mengunci pengguna dari informasi yang mereka simpan di komputer mereka.
ClassicThunder
2
Benar-benar hanya terasa tidak profesional untuk menggunakan file teks karena sangat sedikit game menyimpan sesuatu sebagai "save-data.txt" - tetapi jika Anda pernah menghabiskan waktu mencari ke dalam sebagian besar file game yang disimpan, Anda akan menemukan bahwa mereka sering tidak lebih dari file teks yang terkadang memiliki data biner yang ditambahkan padanya. Setiap game seri Civilization and Total War, misalnya, menggunakan file .txt aktual untuk berbagai macam data game. 'Peningkatan' yang paling umum untuk ini adalah sistem basis data yang akhirnya menyimpan data sebagai file datar yang - kecuali untuk beberapa gumpalan biner - hanyalah sebuah file teks.
BrianH
3

Kata Data Game dapat berarti banyak hal, misalnya

  • Gamestate
  • File konfigurasi
  • Peta, tekstur, suara, skrip, data animasi, ...
  • Lokalisasi
  • Data tata letak GUI
  • lebih saya tidak memikirkan

Untuk setiap kategori Anda dapat mengambil pendekatan lain.

Misalnya Anda bisa menggunakan SQLite untuk pelokalan, biner untuk Maps, tekstur, suara, dan sebagainya.

Untuk hal konfigurasi, Anda harus menggunakan file xml yang mudah diubah.

Seperti biasa, jawaban yang benar adalah "itu tergantung".

Ada banyak parser xml dengan c ++ binding dan c ++ binding untuk SQLite juga ada.

Quonux
sumber
Ini mungkin hal yang religius tetapi saya lebih suka menggunakan format file INI untuk konfigurasi daripada XML. Yang terakhir terasa seperti berlebihan untuk skenario ini. Dan ada pembaca INI di meningkatkan perpustakaan.
Artur Czajka
0

Anda bisa menyimpan data Anda sebagai gumpalan biner dan mengalirkan kembali data saat Anda mengakses file itu. Ini akan menyelesaikan kedua masalah Anda. Pastikan saja bahwa kode serialisasi sama persis dengan de-serialisasi.

Streaming di gumpalan biner relatif cepat dan juga mencegah pengguna melihat data dan mengubahnya.

Anda dapat mencapai semua ini dengan menggunakan aliran perpustakaan standar.

SuperSquareBoy
sumber
2
Sementara gumpalan biner cepat dan mudah (baik untuk dev dan untuk memuat / menjalankan) masalah terbesar yang saya miliki dengan gumpalan biner adalah segera setelah Anda mengubah apa pun tentang organisasi struktur data (sebanyak menambahkan satu floatanggota ke satu objek), savegames lama menjadi benar-benar tidak valid. Ini sulit dihadapi selama pengembangan, tetapi jika Anda sanggup melakukannya, maka tentu saja.
bobobobo