En este ejercicio tendrás que aplicar los conceptos de programación orientada a objetos y herencia con JavaScript a nuestros amigos vikingos.
- Fork del repositorio
- Clonado a tu repositorio
- Asegurate de utilizar las herramientas de desarrollo de OOP y herencia
- Una vez completado el ejercicio ejecuta los siguientes comandos:
git add .
git commit -m "done"
git push origin master
- Desde tu navegador crea un Pull Request
Seguimos trabajando con tests. Para ello abre el fichero SpecRunner.html
!
Ejecuta los tests
Verás que no se ejecuta ninguno de los tests construidos. Abre el fichero tests/VikingSpec.js
y descomenta la función it()
de las líneas 10-12:
describe("constructor function", function () {
it("should receive 2 arguments (health & strength)", function () {
expect(Soldier.length).toEqual(2);
});
// it("should receive the health property as its 1st argument", function () {
// expect(soldier.health).toEqual(health);
// });
// it("should receive the strength property as its 2nd argument", function () {
// expect(soldier.strength).toEqual(strength);
// });
});
Ahora el test (should receive 2 arguments (health & strength)) está fallando!!
Escribe el código
Ahora tienes que escribir el código correcto en el fichero src/viking.js
para pasar el test. El código que encontrarás es el siguiente:
// Soldier
class Soldier {}
// Viking
class Viking {}
// Saxon
class Saxon {}
// War
class War {}
En este caso, el test dice que Soldier constructor function should receive 2 arguments (health & strength), así que tienes que escribir el código correcto que pase el test. Implementa la función constructora de la clase Soldier
que reciba dos parámetros:
// Soldier
class Soldier{
constructor(healthArg, strengthArg) {}
}
// Viking
class Viking {}
// Saxon
class Saxon {}
// War
class War {}
Ejecuta todos los tests
Ahora que ya has pasado el primer test, descomenta el siguiente, refresca la página y sigue codificando para pasar los tests.
Modifica la clase Soldier
y añade dos métodos attack()
y receiveDamage()
.
- debe recibir 2 argumentos (health & strength)
- debe recibir la propiedad
health
como 1er argumento - debe recibir la propiedad
strength
como 2nd argumento
- debe ser una función
- debe recibir 0 arguments
- debe devolver la propiedad
strength
delSoldier
- debe ser una función
- debe recibir 1 argumento (-damage-)
- debe substraer el daño recibido de la propiedad
health
- no debe retornar nada
Un Viking
es un Soldier
con una propiedad adicional, su nombre (name
). Además tiene implementado el método receiveDamage()
de manera distinta y tiene un nuevo método: battleCry()
.
Modifica el constructor de la clase Viking
para que herede de la clase Soldier
, reimplementa el método receiveDamage()
dentro del Viking
, y añade el nuevo método battleCry()
.
Viking
debe extender de la claseSoldier
- debe recibir 3 argumentos (name, health & strength)
- debe recibir la propiedad
name
como 1er argumento - debe recibir la propiedad
health
como 2nd argumento - debe recibir la propiedad
strength
como 3er argumento
(Se hereda de Soldier
, no necesita reimplementación.)
- debe ser una función
- debe recibir 0 arguments
- debe devolver la propiedad
strength
delViking
(Este método necesita ser reimplementado para Viking
porque la versión Viking
devuelve valores diferentes.)
- debe ser una función
- debe recibir 1 argumento (-damage-)
- debe substraer el daño recibido de la propiedad
health
- no debe retornar nada
- si el
Viking
todavía está vivo, debería devolver "NAME has received DAMAGE points of damage" - si el
Viking
muere, debe devolver "NAME has died in act of combat"
Puedes informarte sobre gritos de guerra, aquí.
- debe ser una función
- debe recibir 0 argumentos
- debe devolver "Odin Owns You All!"
Un Saxon
es una versión más débil de un Soldier
. Al contrario de un Viking
, el Saxon
no tiene nombre. Su método receiveDamage()
también es diferente de la versión de Soldier
.
Modifica el constructor de Saxon
, hazlo que extienda de Soldier
y reimplementa el método receiveDamage()
.
Saxon
debe extender deSoldier
- debe recibir 2 argumentos (health & strength)
- debe recibir la propiedad
health
como 1er argumento - debe recibir la propiedad
strength
como 2nd argumento
(Este método se hereda de Soldier
, no es necesario reimplementarlo)
- debe ser una función
- debe recibir 0 arguments
- debe devolver la propiedad
strength
delSoldier
- should be a function
- should receive 1 argument (the damage)
- should remove the received damage from the
health
property
(Este método necesita ser reimplementado porque la versión Saxon
necesita devolver valores diferentes.)
- debe ser una función
- debe recibir 1 argumento (-damage-)
- debe substraer el daño recibido de la propiedad
health
- si el Saxon está todavía vivo, debe devolver "A Saxon has received DAMAGE points of damage"
- si el Saxon muere, debe devolver "A Saxon has died in combat"
Ahora vamos al lío: la GUERRA. la clase War
debe servir para montar una batalla entre el ejército de Viking
y el ejército de Saxon
.
Modifica la clase War
y añade estos 5 métodos:
addViking()
addSaxon()
vikingAttack()
saxonAttack()
showStatus()
Cuando se cree War
, los ejércitos (armies) deben estar vacíos. Los soldados se añadirán a los ejercitos con posterioridad
- debe recibir 0 argumentos
- debe asignar un array vacío a la propiedad
vikingArmy
- debe asignar un array vacío a la propiedad
saxonArmy
Añade 1 Viking
al vikingArmy
. Si quieres un ejercito de 10 Viking
, necesitarás llamar al método 10 veces.
- debe ser una función
- debe recibir 1 argumento (un objeto
Viking
) - debe añadir el
Viking
recibido al ejército - no devuelve nada
Es la versión Saxon
de addViking()
.
- debe ser una función
- debe recibir 1 argumento (un objeto
Saxon
) - debe añadir el
Saxon
recibido al ejército - no devuelve nada
Se invoca el método receiveDamage()
del Saxon
(elegido al azar) con un daño igual a la strength
de un Viking
(también elegido al azar). Sólo debe realizar un ataque y el Saxon
no debe contraatacar.
- debe ser una función
- debe recibir 0 argumentos
- debe hacer que
receiveDamage()
deSaxon
sea igual astrength
de unViking
- debe eliminar los saxones muertos del ejército.
- debe retornar el resultado de llamar a
receiveDamage()
deSaxon
constrength
deViking
La version Saxon
de vikingAttack()
. Un Viking
recibe daño igual a strength
de un Saxon
.
- debe ser una función
- debe recibir 0 argumentos
- debe hacer que
receiveDamage()
deViking
sea igual astrength
de unSaxon
- debe eliminar los vikingos muertos del ejército.
- debe retornar el resultado de llamar a
receiveDamage()
deViking
constrength
deSaxon
Devuelve el estado actual de la guerra (War
) basado en el tamaño de los ejércitos.
- debe ser una función
- debe recibir 0 arguments
- Si el array de
Saxon
está vacío, devolverá "Vikings have won the war of the century!" - Si el array de
Viking
está vacío, devolverá "Saxons have fought for their lives and survive another day..." - Si hay al menos 1
Viking
y 1Saxon
, devolverá "Vikings and Saxons are still in the thick of battle."