Carregando dados para um RPG

8

Estou criando um RPG de texto pequeno como uma maneira de praticar python e estou tendo uma pergunta sobre como carregar dados. O jogo é um jogo do oeste selvagem, embora isso não seja muito relevante, e eu preciso armazenar listas de armas e suas propriedades, bem como listas de personagens, cenários etc. Eu tenho uma boa idéia de como representar esses dados como classes, mas não sou tão claro sobre como armazenar e carregar os dados.

Minha principal pergunta gira em torno do relacionamento entre dados e classes. Eu li algumas postagens aqui no SE e muitas delas estão relacionadas ao armazenamento, por isso tenho boas informações lá.

Quando devo carregar esses dados? Por exemplo, o jogador escolhe várias armas quando o jogo começa. Devo carregar todas as armas e instanciar todos os objetos de armas nesse ponto? A classe de armas deve ter a capacidade de mostrar armas do banco de dados sem instancia-las?

Obrigado por qualquer ajuda.

timfreilly
fonte

Respostas:

7

Como você diz um RPG de texto "pequeno", meu conselho seria apenas pré-carregar tudo. Se não estamos falando de uma quantidade enorme de conteúdo, não deve fazer muita diferença no tempo de inicialização e mantém as coisas, como aconselha Bjorn, simples.

Uma coisa que me ocorre, lendo sua pergunta, é que você pode considerar a diferença entre uma arma e um tipo de arma . Minha preferência é sempre ter uma distinção clara entre os dois e ter os dois modelados em código para que eu possa fazer perguntas sobre o tipo de arma sem necessariamente ter que ter uma instância à mão. (Uma maneira de fazer isso é fazer com que o tipo de arma seja a classe, com métodos de classe que permitem que você interaja com ela, e a arma seja uma instância dessa classe. Na verdade, eu não prefiro essa abordagem porque é impossível ou incrivelmente bagunçado para uma arma mudar de tipo. Obviamente isso não será relevante para todos os jogos.)

caos
fonte
Como você os diferenciaria no código? Eu realmente encontrei esse problema.
Timfreilly 5/05
11
A maneira que eu entendo é que os tipos de armas são objetos gerenciados através do padrão "conjunto de definições intermediadas" de que falo nesta pergunta do SO: stackoverflow.com/questions/401720/… , e cada objeto de arma sabe de que tipo é um código de identificação. Então você pode fazer o que obj->setWeaponType(WEAPON_TYPE_SHOTGUN)quer que seja, e a arma se configura adequadamente. As métricas de desempenho de armas podem usar os valores do tipo como linha de base, mas permitem que o resultado final seja modificado pela instância. Esse tipo de coisas.
caos
É algo para se pensar, obrigado pelo link. O que você faria em uma situação em que queria exibir uma lista dos tipos de armas disponíveis? Esse tipo de solicitação passa pela versão do broker / tipo?
timfreilly
11
@timfreilly: Depende do contexto. Se for algo parecido com uma loja, eu normalmente teria o local abastecido com instâncias reais de armas e mostraria suas descrições ao jogador. Se for algo como uma visão geral do desenvolvedor ou uma interface de ajuda, eu pediria ao daemon do broker o conjunto completo de definições de tipos de armas e exibia informações sobre elas.
caos
4

Carregue tudo no início. Não complique seu programa dividindo dados entre a memória e o disco, a menos que seja necessário (por exemplo, quando houver muito para armazenar na memória de uma só vez).

O importante é entender a distinção entre dados que representam instâncias de um item e dados que representam o tipo de um item. Geralmente, várias instâncias da primeira compartilham uma instância comum da segunda.

Kylotan
fonte
Eu poderia usar algumas informações adicionais lá. Como você codifica essa diferença?
timfreilly
11
@timfreilly: Eu tenho uma hierarquia de classes de amostra para um sistema de itens como o Kylotan descreve em gamedev.stackexchange.com/questions/4516/… ; isso geralmente é chamado de padrão de peso de mosca.
Como Joe diz, o padrão Flyweight é uma maneira de apresentar isso, compartilhando implicitamente esse 'tipo' de dados entre as instâncias. Pessoalmente, prefiro representá-los explicitamente, por exemplo. com uma classe MonsterInstance e uma classe MonsterType. Cada instância do MonsterInstance tem uma referência à sua instância MonsterType relevante.
Kylotan
(Eu faria o que Kylotan diz, bem, eu ainda diria que foi um objeto flyweight.)
0

Eu não estou muito familiarizado com python. O conselho geral que eu daria é simplificar. Você disse que já tem uma idéia de como representar os dados. Se você tiver algumas classes para os dados que deseja armazenar, poderá armazená-las em uma lista. Essa lista pode ser serializada para o disco onSave e desserializada onLoad. Para uma primeira implementação e se os dados não forem tão grandes, eu carregaria tudo no início do jogo e os salvaria em alguns momentos.

Bjorn
fonte
0

Você poderia usar SQLite . Usando o SQLite, você pode criar bancos de dados na memória e no disco rígido e não precisa de um DBMS gigante como o MySQL instalado.

grizwako
fonte