Estoy a punto de comenzar un simple juego de rol de texto del navegador, con personajes que pueden (pasivamente) luchar contra otras personas. Esto implica una lista de aproximadamente 10 habilidades como fuerza, destreza, etc., con habilidades adicionales para diferentes armas.
¿Hay una mejor manera de diseñar esta clase de personaje que simplemente tener esas habilidades como atributo de clase? Parece fácil, pero soy reacio porque es torpeza.
class Char(self):
int strength
int dexterity
int agility
...
int weaponless
int dagger
...
architecture
oop
Sven
fuente
fuente
Charactor
clase.Respuestas:
Mientras mantenga su sistema relativamente simple, esto debería funcionar. Pero cuando agrega cosas como modificadores de habilidades temporales, pronto verá una gran cantidad de código duplicado. También te encontrarás con problemas con diferentes armas usando diferentes habilidades. Debido a que cada habilidad es una variable diferente, tendrás que escribir un código diferente para cada tipo de habilidad que básicamente hace lo mismo (o usar algunos trucos de reflexión feos, bajo la condición de que tu lenguaje de programación los admita).
Por esa razón, le recomendaría que almacene tanto las habilidades como las competencias en una estructura de datos asociativa que asigne constantes de habilidades a valores. Cómo hacerlo difiere elegantemente del lenguaje de programación al lenguaje de programación. Cuando su idioma lo admite, las constantes deben estar en un
enum
.Para darle un ejemplo de cómo funcionaría esto en la práctica, su código para calcular el daño de ataque se vería así:
fuente
getSkill()
va en contra del principio fundamental de la programación orientada a objetos .¿Por qué no usar matrices asociadas ?, esto brinda el beneficio de ser fácilmente extendido (usando PHP, por ejemplo)
para cosas como las armas, probablemente quieras crear algunas clases base
Arma -> MeleeWeapon, RangedWeapon
y luego crea tus armas desde allí.
El resultado final al que apuntaría es una clase como esta
Podrías almacenar todo en una matriz si realmente quisieras también.
fuente
Trataré de responder a esta pregunta de la manera más orientada a los usuarios (o al menos lo que creo que sería) Puede ser completamente exagerado, dependiendo de las evoluciones que veas sobre las estadísticas.
Podrías imaginar una clase SkillSet (o Stats ) (estoy usando una sintaxis tipo C para esta respuesta):
Entonces el héroe tendría un campo intrínsecoStats del tipo SkillSet. Un arma también podría tener una habilidad modificadora.
Por supuesto, este es un ejemplo para darle una idea. También puede considerar usar el patrón de diseño Decorador, para que los modificadores en las estadísticas funcionen como "filtros" que se aplican uno tras otro ...
fuente
La forma más eficaz de hacer las cosas probablemente sería hacer algo con herencia. Tu clase base (o superclase dependiendo del idioma) sería una persona, entonces quizás los villanos y héroes hereden de la clase base. Entonces, tus héroes basados en la fuerza y los héroes basados en el vuelo se ramificarían, ya que su modo de transporte es diferente, por ejemplo. Esto tiene la ventaja adicional de que los jugadores de tu computadora pueden tener la misma clase base que los jugadores humanos y, con suerte, simplificará tu vida.
La otra cosa con respecto a los atributos, y esto es menos específico de OOP, sería representar los atributos de tu personaje como una lista para que no tengas que tenerlos definidos explícitamente en tu código. Entonces, tal vez tendrías una lista de armas y una lista de atributos físicos. Haga algún tipo de clase base para estos atributos para que puedan interactuar, de modo que cada uno se defina en términos de daño, costo de energía, etc., de modo que cuando dos personas se unan, sea relativamente claro cómo se llevará a cabo la interacción. Recorrería la lista de atributos de cada personaje y calcularía el daño que uno hace al otro con un grado de probabilidad en cada interacción.
El uso de una lista lo ayudará a evitar reescribir una gran cantidad de código, ya que para agregar un carácter con un atributo que aún no había pensado, solo debe asegurarse de que tenga una interacción que funcione con su sistema existente.
fuente
Recomiendo un administrador de tipos de estadísticas, poblado de un archivo de datos (por ejemplo, uso XML) y objetos de estadísticas, con un tipo y un valor almacenados en el carácter insatnce como una tabla hash, con la identificación única del tipo de estadísticas como clave.
Editar: Psudocódigo
fuente
StatType
clase es innecesaria, solo use laname
deStatType
como clave. Como #Grimston hizo. Lo mismo conStats
.Trataré de darle un ejemplo de cómo puede diseñar su arsenal y su arsenal.
Nuestro objetivo es desacoplar entidades, por lo tanto, el arma debe ser una interfaz.
Supongamos que cada jugador solo puede poseer un arma, podemos usarla
Strategy pattern
para cambiar las armas fácilmente.Otro patrón útil sería el Patrón de objeto nulo en caso de que el jugador esté desarmado.
En cuanto a la armería, podemos usar múltiples equipos de defensa.
Para desacoplar, creé una interfaz para el defensor.
Y la
Player
claseAgreguemos algo de juego.
Voila!
fuente