Estou prestes a iniciar um simples RPG de texto no navegador, com personagens que podem (passivamente) combater outras pessoas. Isso envolve uma lista de cerca de 10 habilidades, como força, destreza e assim por diante, com proficiências adicionais para armas diferentes.
Existe uma maneira melhor de projetar essa classe de personagem do que ter essas habilidades como atributo de classe? Parece fácil, mas estou relutante porque é desajeitado.
class Char(self):
int strength
int dexterity
int agility
...
int weaponless
int dagger
...
architecture
oop
Sven
fonte
fonte
Charactor
classe?Respostas:
Contanto que você mantenha seu sistema relativamente simples, isso deve funcionar. Mas quando você adiciona itens como modificadores de habilidades temporários, em breve você verá muitos códigos duplicados. Você também terá problemas com armas diferentes, usando diferentes habilidades. Como cada habilidade é uma variável diferente, você terá que escrever um código diferente para cada tipo de habilidade, que basicamente faz o mesmo (ou usa alguns truques feios de reflexão - sob a condição de que sua linguagem de programação os suporta).
Por esse motivo, recomendo que você armazene habilidades e proficiências em uma estrutura de dados associativa que mapeie constantes de habilidades em valores. Como fazer isso difere elegantemente da linguagem de programação para a linguagem de programação. Quando seu idioma suportar, as constantes devem estar em um
enum
.Para dar um exemplo de como isso funcionaria na prática, seu código para calcular o dano de ataque ficaria assim:
fonte
getSkill()
vai contra o princípio fundamental da programação orientada a objetos .Por que não usar matrizes associadas ?, isso oferece o benefício de ser facilmente estendido (usando PHP, por exemplo)
para coisas como armas, você provavelmente desejaria criar algumas classes base
Arma -> Arma corpo a corpo, Arma de longo alcance
e então crie suas armas a partir daí.
O resultado final que eu buscaria é uma classe parecida com esta
Você pode armazenar tudo em uma matriz se realmente quiser.
fonte
Vou tentar responder a essa pergunta da maneira mais OOP (ou pelo menos o que eu acho que seria). Pode ser um exagero, dependendo das evoluções que você vê sobre as estatísticas.
Você pode imaginar uma classe SkillSet (ou Stats ) (estou usando a sintaxe do tipo C para esta resposta):
Então o herói teria um campo intrínsecoStats do tipo SkillSet. Uma arma também pode ter uma habilidade modificadora.
Obviamente, este é um exemplo para você ter uma ideia. Você também pode considerar o uso do padrão de design Decorator, para que os modificadores nas estatísticas funcionem como "filtros" aplicados um após o outro…
fonte
A maneira mais OOP de fazer as coisas provavelmente seria fazer algo com herança. Sua classe base (ou super classe dependendo do idioma) seria pessoal, então talvez vilões e heróis herdem da classe base. Então seus heróis baseados em força e heróis baseados em vôo se ramificariam, pois seu modo de transporte é diferente, por exemplo. Isso tem o bônus adicional de que os jogadores de computador podem ter a mesma classe base que os jogadores humanos e, com sorte, isso simplificará sua vida.
A outra coisa sobre os atributos, e isso é menos específico do OOP, seria representar os atributos do seu personagem como uma lista, para que você não precise defini-los todos explicitamente no seu código. Então, talvez você tenha uma lista de armas e uma lista de atributos físicos. Faça algum tipo de classe base para esses atributos para que eles possam interagir, para que cada um seja definido em termos de dano, custo de energia etc. Para que, quando dois indivíduos se reúnam, fique relativamente claro como a interação ocorrerá. Você percorre a lista de atributos de cada personagem e calcula o dano que um causa ao outro com um grau de probabilidade em cada interação.
O uso de uma lista ajudará a evitar a reescrita de muito código, pois, para adicionar um caractere com um atributo que você ainda não tinha pensado, basta garantir que ele tenha uma interação que funcione com o sistema existente.
fonte
Eu recomendaria um gerenciador de tipos de estatísticas, preenchido a partir de um arquivo de dados (por exemplo, uso XML) e objetos Stat, com um tipo e um valor armazenados no caractere inserido como uma hashtable, com o ID exclusivo do tipo de estatística como chave.
Edit: Psudo code
fonte
StatType
aula é desnecessária, basta usar oname
daStatType
como uma chave. Como #Grimston fez. O mesmo comStats
.Vou tentar dar um exemplo de como você pode projetar seu arsenal e seu arsenal.
Nosso objetivo é desacoplar entidades, portanto, a arma deve ser uma interface.
Suponhamos que cada jogador possua apenas uma arma; podemos usá-la
Strategy pattern
para trocar de arma facilmente.Outro padrão útil seria o Padrão de Objeto Nulo, caso o jogador esteja desarmado.
Quanto ao arsenal, podemos usar vários equipamentos de defesa.
Para dissociar, criei uma interface para o defensor.
E a
Player
turma.Vamos adicionar um pouco de jogabilidade.
Voila!
fonte