├── .gitignore ├── src └── Fighter.js ├── index.js ├── instructions.png ├── README.md └── README.FR.md /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | /node_modules/ 3 | -------------------------------------------------------------------------------- /src/Fighter.js: -------------------------------------------------------------------------------- 1 | /* Fighter class definition */ 2 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // First Labour : Heracles vs Nemean Lion 2 | // use your Figher class here 3 | -------------------------------------------------------------------------------- /instructions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WildCodeSchool/js-poo-heracles-labour-1/HEAD/instructions.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # The labours of Heracles - First of the labours: the Nemean lion 2 | 3 | Prerequisite: clone this _repository_. 4 | 5 | ## Groundwork 6 | 7 | Heracles must defeat the fierce Nemean lion, known for its impenetrable skin, making it very difficult to hurt. Before starting their quest, every hero should prepare a little: 8 | 9 | In the empty _src/Fighter.js_ file, create: 10 | 11 | - a constant `MAX_LIFE = 100`: fighters have 100 max life points 12 | 13 | - a `Fighter` class with the properties: 14 | - name: name of the fighter. 15 | - strength: will be used to calculate the damage points during an attack. 16 | - dexterity: will be used to calculate the defense points that will limit the damage received. 17 | - life: initialized to MAX_LIFE, so they all start with 100 life points. 18 | 19 | There would potentially be plenty of other things to add, but that's a good start! 20 | 21 | Then, in the supplied _index.js_ file, create two instances of the Fighter class, for: 22 | 23 | - 🧔 Heracles, strength 20, dexterity 6 24 | 25 | - 🦁 Nemean Lion, strength 11, dexterity 13 26 | 27 | To have a nice look even if you're working in the console, you can add an icon in the name string (https://emojipedia.org/). 28 | You can also have fun varying the values, but the ones provided will give you relatively balanced fights. 29 | 30 | > 💡**HINT**: a _constructor_ will be needed in your class to initialize these properties with different values for Heracles and the Lion. 31 | 32 | > 💡**HINT**: don't forget to _require_ your _Fighter.js_ file if you want to be able to use it from your _index.js_ file. 33 | 34 | After both objects have been instantiated, display the name and life 💙 (you should start at 100) of each of the two fighters to make sure everything is working fine. For now, you'll be using JS only in CLI mode. 35 | To do so, just type: `node index.js` in your terminal. 36 | 37 | ## FIGHT ! 38 | 39 | Heracles warmed up a bit, tightened his muscles, crushed some rocks with his bare hands. He's ready to do battle! 40 | 41 | In Fighter class, create a `fight ()` method that will allow you to attack the enemy. To determine who you are going to attack, the `fight ()` method will take another Fighter object as a parameter! In the body of your method, you will first calculate the number of damage points of the attacker: 42 | 43 | - The fighter will hit with more or less success each time, the number of points of damage that the ** attacker ** does will therefore be a random number between 1 and the strength of the fighter (use `Math.random ()` ([Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random), and if needed some advices from [this article](https://dev.to/rocambille/how-to-roll-a-dice-in-javascript-51j0)) 44 | 45 | - But the attacked can defend and dodge! You will therefore mitigate the damage by subtracting the damage from the dexterity of the **attacked** (without **never going below zero**) 46 | 47 | - Once the damage is calculated, decrease the number of life points of the **attacked** by the value thus obtained. Be careful, the life of a fighter **cannot fall below zero**, also remember to check that 48 | 49 | In summary : 50 | 51 | ``` 52 | defender's new life points = defender's current life points - (attacker's damage - defender's dexterity) 53 | ``` 54 | 55 | knowing that `(attacker's damage - defender's dexterity)` must not be negative. 56 | 57 | There you go, your class is ready, you just have to use it! 58 | 59 | ## 🗡️ There can be only one 60 | 61 | Heracles enters the cave, the lion is there, his red eyes pointed towards the intruder. The fight is imminent: 62 | 63 | 1. In the _index.js_ file, create a loop for performing a fight to the death! As long as one of the two enemies has a health > 0, the combat therefore continues. 64 | 65 | 2. In each "round" 🕛, Heracles attacks the lion, then the lion attacks Heracles. You have to display the round number, who attacks who, and the remaining life points. 66 | 67 | 3. When one of the two is defeated, you must then display the winner 🏆 and the loser 💀. The screenshot below gives you a summary of what to expect. 68 | 69 | ![instructions](instructions.png) 70 | 71 | 🎁 BONUS: create a new `isAlive ()` method to help you optimize the code. 72 | 73 | ## Conclusion 74 | 75 | Once you're done, feel free to tweak the code and add new features. 76 | You will be given a "clean" code at the start of the next workshop. 77 | -------------------------------------------------------------------------------- /README.FR.md: -------------------------------------------------------------------------------- 1 | # Les travaux d'Hercule - premier travail : le lion de Némée 2 | 3 | Prérequis : cloner ce _dépôt_. 4 | 5 | ## Les bases 6 | 7 | Héraclès doit vaincre le féroce Lion de Némée, connu pour sa peau impénétrable, ce qui le rend très difficile à blesser. Avant de commencer sa quête, notre héros devrait se préparer un peu : 8 | 9 | Dans le fichier vide _src/Fighter.js_ crée : 10 | 11 | - une constante `MAX_LIFE = 100`: les combattants possèdent 100 points de vie max. 12 | 13 | - une classe `Fighter` avec les propriétés : 14 | - name: le nom du combattant. 15 | - strength: sera utilisé pour calculer les points de dommage durant l'attaque. 16 | - dexterity: sera utilisé pour calculer les points de défense qui limiteront les dommages reçus durant l'attaque. 17 | - life: initialisés à MAX_LIFE, les combattants commenceront avec 100 points de vie. 18 | 19 | Il y aura potentiellement plein d'autres fonctionnalités à ajouter, mais c'est un bon début ! 20 | 21 | Donc, dans le fichier _index.js_ fourni, créer deux instances de la classe Figther, pour : 22 | 23 | - 🧔 Heracles, strength 20, dexterity 6 24 | 25 | - 🦁 Nemean Lion, strength 11, dexterity 13 26 | 27 | Pour donner un meilleur look même si vous travaillez dans la console, vous pouvez ajouter une icône dans la chaîne de caractères (= string) (https://emojipedia.org/). 28 | Vous pouvez aussi vous amuser à changer les valeurs des variables, mais celles fournies donneront un combat équilibré. 29 | 30 | > 💡**ASTUCE**: un _constructor_ sera requis dans votre classe pour initialiser ces propriétés avec différentes valeurs pour Héraclès et le Lion. 31 | 32 | > 💡**ASTUCE**: n'oubliez pas de _require_ le fichier _Fighter.js_ si vous voulez pouvoir l'utiliser dans votre fichier _index.js_. 33 | 34 | Après que les deux aient été instanciés, affichez le nom et la vie 💙 (vous devriez commencer à 100) pour chacun des combattants afin de vous assurer que tout fonctionne. Pour l'instant, vous utiliserez JS seulement en mode CLI. 35 | Pour cela, tapez simplement : `node index.js` dans votre terminal. 36 | 37 | ## COMBATTEZ ! 38 | 39 | Héraclès s’échauffe un peu, resserre ses muscles, écrase quelques rochers à mains nues. Il est prêt à se battre ! 40 | 41 | Dans la classe Fighter, créez une méthode `fight()` qui vous permet d'attaquer l'ennemi. Pour déterminer qui vous attaquez, la méthode `fight()` prend un objet _Fighter_ comme paramètre ! Dans le corps de la méthode, vous calculerez en premier les points de dommage de l'attaquant : 42 | 43 | - Le combattant frappera avec plus ou moins de succès, la quantité de dommage infligé par l' **attaquant** sera aléatoire entre 1 et sa _strength_ (Utilise `Math.random()`([Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random) Pour d'autres conseils, voir [article] (https://dev.to/rocambille/how-to-roll-a-dice-in-javascript-51j0)). 44 | 45 | - Mais le défenseur peut se défendre ou esquiver ! Pour cela, mitigez les dommages en leur soustrayant la _dexterity_ du **défenseur** (sans jamais **descendre en dessous de zéro**). 46 | 47 | - une fois les dommages calculés, réduisez le nombre de points de vie du **défenseur** par la valeur précédemment obtenue. Faites attention : les points de vie du défenseur **ne peuvent tomber en dessous de zéro**, rappelez vous bien de ça. 48 | 49 | En résumé : 50 | 51 | **nouveaux points de vies du défenseur = points de vie actuels du défenseur - (dommages de l'attaquant - dextérité du défenseur)** 52 | 53 | En sachant que `(attacker's dommage - defender's dexterity)` ne peut pas être négatif. 54 | 55 | C'est parti, votre classe est prête, vous n'avez plus qu'à vous en servir ! 56 | 57 | ## 🗡️ Il n'en restera qu'un 58 | 59 | Héraclès entre dans la grotte, le Lion est là, ses yeux rouges pointés sur vous. Le combat est imminent : 60 | 61 | 1. Dans le fichier index.js créer une boucle exécutant un combat à mort ! Tant qu'un des combattants possède des points de vie > 0, le combat continue. 62 | 63 | 2. Pour chaque "round" 🕛 Héraclès attaque le Lion, puis le Lion l'attaque en retour. Tu dois afficher le numéro du round, qui attaque qui et les points de vie restants. 64 | 65 | 3. Quand l'un des deux est défait, tu dois donc afficher le vainqueur 🏆 et le perdant 💀. La capture d'écran en dessous vous donne un aperçu de nos attentes. 66 | 67 | ![instructions](instructions.png) 68 | 69 | 🎁 BONUS : créer une méthode `isAlive()` pour optimiser ton code. 70 | 71 | ## Conclusion 72 | 73 | Une fois terminé, vous êtes libre de modifier le code et de rajouter de nouvelles fonctionnalités. Nous vous donnerons un code propre pour le début du prochain atelier. 74 | --------------------------------------------------------------------------------