Sistema de personajes de juego
Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 109 de 110.
Desafío
Fácil¡Vamos a construir un Sistema de Personajes de Juego que reúna todos los conceptos de POO que has dominado! Crearás diferentes clases de personajes con habilidades, estadísticas y mecánicas de combate únicas, modelando cómo podrían funcionar los personajes en un juego real.
Tu sistema estará organizado en seis archivos:
character.dart: Crea una clase abstractaCharacterque sirva como base para todos los tipos de personajes. Cada personaje tiene unname(String), un_healthprivado (int),attackPower(int) ydefense(int). Incluye un getter para la salud y estos métodos:takeDamage(int damage)- reduce la salud endamage - defense(mínimo 1 de daño recibido, la salud no puede bajar de 0). Imprimename takes X damage! Health: Ybool isAlive()- devuelve true si la salud es mayor que 0- Un método abstracto
String attack()que las subclases implementan para su estilo de ataque único
toString()para devolvername [Class] - HP: health, ATK: attackPower, DEF: defensedonde Class proviene deruntimeType.abilities.dart: Crea dos mixins que proporcionen habilidades especiales:CanHeal- proporciona un métodoheal(int amount). Dado que los mixins no pueden acceder directamente a campos privados, este mixin debe definir un método abstractovoid restoreHealth(int amount)que la clase del personaje implemente. El métodoheal()llama arestoreHealth(amount)e imprimename heals for amount HP!CanCastSpells- proporcionaint mana(por defecto 100) y un métodocastSpell(String spellName, int manaCost)que reduce el maná si es suficiente, imprimename casts spellName!y devuelve true. Si el maná es insuficiente, imprimeNot enough mana!y devuelve false.
warrior.dart: Crea una claseWarriorque extienda deCharacter. Los guerreros son tanques con alta defensa. Inicializa con 150 de salud, 20 de poder de ataque y 15 de defensa. Implementaattack()para devolvername swings a mighty sword!mage.dart: Crea una claseMageque extienda deCharactery use los mixinsCanCastSpellsyCanHeal. Los magos son frágiles pero poderosos. Inicializa con 80 de salud, 35 de poder de ataque y 5 de defensa. Implementaattack()para devolvername hurls a fireball!. ImplementarestoreHealth(int amount)para aumentar la salud (con un tope de 80).archer.dart: Crea una claseArcherque extienda deCharacter. Los arqueros son luchadores equilibrados. Inicializa con 100 de salud, 25 de poder de ataque y 10 de defensa. Implementaattack()para devolvername fires a precise arrow!main.dart: Demuestra tu sistema de personajes creando uno de cada tipo de personaje: un Guerrero llamadoThorin, un Mago llamadoGandalfy un Arquero llamadoLegolas. Imprime cada personaje usandotoString(). Luego simula una secuencia de batalla:- Imprime el mensaje de ataque de Thorin
- Gandalf recibe 30 de daño
- Gandalf lanza
Healing Light(cuesta 25 de maná) - Gandalf se cura 20 HP
- Imprime el mensaje de ataque de Gandalf
- Thorin recibe 40 de daño
- Imprime el mensaje de ataque de Legolas
- Imprime si cada personaje está vivo en el formato:
name alive: true/false
Salida esperada:
Thorin [Warrior] - HP: 150, ATK: 20, DEF: 15
Gandalf [Mage] - HP: 80, ATK: 35, DEF: 5
Legolas [Archer] - HP: 100, ATK: 25, DEF: 10
Thorin swings a mighty sword!
Gandalf takes 25 damage! Health: 55
Gandalf casts Healing Light!
Gandalf heals for 20 HP!
Gandalf hurls a fireball!
Thorin takes 25 damage! Health: 125
Legolas fires a precise arrow!
Thorin alive: true
Gandalf alive: true
Legolas alive: truePruébalo tú mismo
import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';
void main() {
// TODO: Crear un Warrior llamado "Thorin"
// TODO: Crear un Mage llamado "Gandalf"
// TODO: Crear un Archer llamado "Legolas"
// TODO: Imprimir cada personaje usando toString()
// TODO: Simular la secuencia de batalla:
// 1. Imprimir el mensaje de ataque de Thorin
// 2. Gandalf recibe 30 de daño
// 3. Gandalf lanza "Healing Light" (cuesta 25 de mana)
// 4. Gandalf se cura 20 HP
// 5. Imprimir el mensaje de ataque de Gandalf
// 6. Thorin recibe 40 de daño
// 7. Imprimir el mensaje de ataque de Legolas
// 8. Imprimir si cada personaje está vivo: "name alive: true/false"
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy17Desafíos finales
Plataforma de E-LearningSistema bancarioSistema de personajes de juegoServicio de alquiler de vehículos3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository