Devo usar arquivos de texto para salvar meus dados?

22

Minha pergunta é se devo ou não usar arquivos de texto para salvar os dados do meu jogo. Tenho algumas preocupações básicas em fazer isso:

  1. Não há realmente nenhuma maneira de proteger os dados e, assim, o usuário pode estragar tudo se o tocar e eu não quero que isso aconteça.

  2. Provavelmente não é a maneira mais eficiente de armazenar meus dados (haverá muitos deles)

Eu sei como analisar / gravar arquivos de texto de forma eficaz, porém, para a criação de protótipos eles foram fantásticos. Eu só quero olhar para o futuro para o que eu deveria estar pensando em mudar para, para que não me dê um soco na cara perto do final do desenvolvimento.

Se não devo usar arquivos de texto, o que devo usar? Eu preciso de algo compatível com C ++.

Althezel
fonte
2
Zip arquivos (com senha) - há muitas bibliotecas disponíveis que lhe permitirá fazer isso, e ele deve economizar espaço em disco
SeanC
2
A aplicação de uma cifra simples como en.wikipedia.org/wiki/ROT13 deve ser suficiente para impedir que o usuário comum edite os arquivos. Todo mundo provavelmente sabe o que está fazendo de qualquer maneira.
Exilyth 22/07/2013
1
Faça do seu jeito, mas eu gosto que meus jogos sejam facilmente modificáveis.
mmyers

Respostas:

28

Por enquanto, desde que você está apenas começando, os arquivos de texto provavelmente estão OK. Há algumas preocupações em sua pergunta que abordarei.

  1. Proteger os dados não é tão crucial quanto você provavelmente pensa. Se o seu jogo for multiplayer, você terá os dados salvos no servidor de qualquer maneira. Se o seu jogo for para um jogador, e se os jogadores modificarem os dados? Se eles quebrarem algo, é realmente culpa deles e eles poderão reinstalar.

  2. O desempenho também é outra coisa que geralmente não conseguimos planejar adequadamente. Você realmente não deve otimizar até medir um problema de desempenho. Meu palpite é que você provavelmente vai ter uma quantidade de dados que não é que arquivos de texto grandes e que vão ficar bem.

Dito isso, sua melhor aposta é abstrair suas rotinas de salvamento e carregamento de dados da melhor maneira possível. Por exemplo, você pode ter uma classe base, digamos DataWriter, e depois fornecer diferentes implementações de seus diferentes métodos. Um exemplo muito básico seria semelhante a:

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

Quando você cria um perfil do seu jogo e percebe que o gargalo de desempenho está na rotina de gravação de arquivos, é possível fornecer outra implementação dessa classe (por exemplo, para gravar em um banco de dados) com alterações mínimas no código de chamada.

pwny
fonte
É um jogo para um jogador, e esses eram meus pensamentos exatamente se eles queriam mexer com os dados. Eu não sei, algo sobre arquivos de texto parecia pouco profissional, e imaginei que se eu pudesse impedir o usuário de estragar tudo, provavelmente deveria. Além disso, o que você quer dizer quando diz "Banco de dados"? Ouço muito isso, mas não faço idéia da definição exata ou do tipo de arquivo que isso implica.
Althezel
6
@ Althezel O problema é que, independentemente de como você salva seus dados, alguém determinado o suficiente para modificá-los poderá. Nesse sentido, é geralmente um desperdício de seu tempo de desenvolvimento precioso para tentar colocar proteções no lugar :)
pwny
@ Althezel Quanto aos bancos de dados, pense nele como uma espécie de mecanismo para o qual você passa solicitações para ler ou gravar dados. Esse mecanismo é responsável por salvá-lo / lê-lo de maneira eficiente, geralmente em formato relacional em tabelas. No seu caso de uso, eu daria uma olhada no SQLite ( sqlite.org ). Basicamente, você usaria uma biblioteca C ++ para se conectar a um banco de dados SQLite local (o SQLite usa arquivos locais) e passaria as chamadas dessa biblioteca na sintaxe SQL para acessar seus dados.
Pwny
2
É um mundo triste quando os desenvolvedores querem poder bloquear os usuários das informações armazenadas em seus computadores.
precisa
2
Realmente, parece pouco profissional usar arquivos de texto, porque poucos jogos armazenam coisas como "save-data.txt" - mas se você já passou algum tempo olhando para a maioria dos arquivos de jogos salvos, verá que eles geralmente não passam de arquivos de texto que às vezes têm dados binários adicionados a eles. Todo jogo da série Civilization e Total War, por exemplo, usa arquivos .txt reais para uma ampla variedade de dados do jogo. A 'atualização' mais comum para isso é um sistema de banco de dados que acaba armazenando os dados como um arquivo simples que - exceto alguns blobs binários - é apenas um arquivo de texto.
BrianH
3

A palavra Dados do jogo pode significar muitas coisas, por exemplo

  • Gamestate
  • Arquivos de configuração
  • Mapas, texturas, sons, scripts, dados de animação, ...
  • Localização
  • Dados de layout da GUI
  • mais eu não pensei em

Para cada categoria, você pode adotar outra abordagem.

Por exemplo, você pode usar o SQLite para localização, binário para mapas, texturas, sons e assim por diante.

Para itens de configuração, você deve usar arquivos xml fáceis de alterar.

Como sempre, a resposta correta é "depende".

Existem muitos analisadores xml com uma ligação c ++ e uma ligação c ++ para SQLite também existe.

Quonux
fonte
Pode ser uma coisa religiosa, mas eu prefiro usar o formato de arquivo INI para configurações em vez de XML. O último parece um exagero para esse cenário. E há um leitor INI nas bibliotecas de reforço.
Artur Czajka
0

Você pode salvar seus dados como um blob binário e transmitir os dados novamente quando acessar o arquivo. Isso resolveria seus dois problemas. Apenas verifique se o código de serialização é exatamente o mesmo que a desserialização.

O fluxo no blob binário é relativamente rápido e também impede que o usuário veja os dados e os altere.

Você pode conseguir tudo isso usando os fluxos de biblioteca padrão.

SuperSquareBoy
fonte
2
Embora o blob binário seja rápido e fácil (tanto para o desenvolvedor quanto para carregar / executar), o maior problema que tive com o blob binário é assim que você altera alguma coisa sobre a organização da estrutura de dados (até adicionar um único floatmembro a um único objeto), os antigos jogos de saves se tornam completamente inválidos. É difícil lidar com isso durante o desenvolvimento, mas se você estiver disposto a fazê-lo, certamente.
24913 bobobobo