T: / Corrigés des challenges / Javascript
On révise les déclarations de variables et on réorganise le code pour notamment utiliser des objets.
Bienvenue dans ce nouveau corrigé remonté par une dev ! On innove un peu et on propose quelques pistes d’optimisation vis à vis du code fourni.
Avant le corrigé, je te propose un rappel des différentes déclarations de variables possibles en javascript.
Sommaire
Historiquement, Javascript permettait, grâce à var de créer une variable accessible de façon globale. C’est à dire accessible, dans le programme principal, dans une fonction, etc. La valeur pouvait être modifiée tout au long du programme.
Cette structure étant trop permissive, de nouvelles structure sont apparues avec ES6 : let et const.
Il est désormais recommandé d’utiliser let et const pour un code mieux structuré.
let permet de déclarer une variable accessible dans un bloc donné : fonction, boucle, etc. La valeur de la variable pourra être modifiée tout au long du programme.
const, comme let, a une portée dans un bloc donné mais sa valeur ne pourra pas être modifiée, elle sera constante. Attention, si const est utilisé pour stocker l’instance d’une classe, les propriétés de cette classe pourront tout de même être modifiées.
En général, pour avoir un code propre, il est recommandé d’utiliser const par défaut, et let lorsque tu sais qu’une variable pourra être réaffectée. L’utilisation de var est par contre déconseillée dans le code moderne.
Merci beaucoup à Céline de nous avoir fourni ce corrigé !
(pour comprendre à quoi fait référence game.gameData, eu peux te référer à la documentation javascript de résolution des challenges)
// sert à savoir quel est le super héros suivant
const dico = {
"ironman" : "spiderman",
"spiderman" : "captainamerica",
"captainamerica" : "thor",
"thor" : "ironman"
}
function resolve() {
// Copies des constantes pour pouvoir les modifier
let letIronman = game.gameData.ironman;
let letSpiderman = game.gameData.spiderman;
let letCaptainamerica = game.gameData.captainamerica;
let letThor = game.gameData.thor;
// initialisé à 1 car l'incrémentation du compteur de tours se fait à la fin de la boucle
let result = 1;
let next = "ironman";
// on calcule la puissance de départ des Avengers
let puissanceAvengers = (letIronman * 3 + 10) + (letSpiderman * 4 + 5) + (letCaptainamerica * 3 + 7) + (letThor * 4 + 20);
while (puissanceAvengers <= game.gameData.thanos) {
switch (next) {
case "ironman" : letIronman += 1;
break;
case "spiderman" : letSpiderman += 1;
break;
case "captainamerica" : letCaptainamerica += 1;
break;
case "thor" : letThor += 1;
break;
}
// on recalcule la puissance des Avengers maintenant que l'un d'entre eux a augmenté sa puissance
puissanceAvengers = (letIronman * 3 + 10) + (letSpiderman * 4 + 5) + (letCaptainamerica * 3 + 7) + (letThor * 4 + 20);
// donne le prochain Avenger qui va augmenter sa puissance
next = dico[next];
result+=1;
}
return result;
}
// Pour repondre au challenge
game.output({data: resolve()});
Ce code résout le challenge ! Bravo !
En observant ce code, on peut voir quelques éléments qui peuvent être optimisés :
const superHeros = {
ironman: { force: game.gameData.ironman, multiplicateur: 3, base: 10 },
spiderman: { force: game.gameData.spiderman, multiplicateur: 4, base: 5 },
captainamerica: { force: game.gameData.captainameria, multiplicateur: 3, base: 7 },
thor: { force: game.gameData.thor, multiplicateur: 4, base: 20 },
};
Un peu d’explications :
Créer des objets en javascript est une bonne façon d’organiser des données.
Le chainage avec le point « . » permettra d’atteindre n’importe quelle valeur. Par exemple pour atteindre « multiplicateur » :
superHeros.spiderman.multiplicateur
Pour calculer la puissance d’un avenger :
function calculerPuissance(force, multiplicateur, base) {
return force * multiplicateur + base;
}
Pour calculer la puissance de tous les avengers :
function calculerPuissanceAvengers(superHeros) {
let puissance = 0;
for (let nom in superHeros) {
const heros = superHeros[nom];
puissance += calculerPuissance(heros.force, heros.multiplicateur, heros.base);
}
return puissance;
}
Un peu d’explications :
Voici le programme principal, et les différents index qui permettent de passer d’un Avenger à l’autre :
const superHeros = {
ironman: { force: game.gameData.ironman, multiplicateur: 3, base: 10 },
spiderman: { force: game.gameData.spiderman, multiplicateur: 4, base: 5 },
captainamerica: { force: game.gameData.captainamerica, multiplicateur: 3, base: 7 },
thor: { force: game.gameData.thor, multiplicateur: 4, base: 20 },
};
function calculerPuissance(force, multiplicateur, base) {
return force * multiplicateur + base;
}
function calculerPuissanceAvengers(superHeros) {
let puissance = 0;
for (let nom in superHeros) {
const heros = superHeros[nom];
puissance += calculerPuissance(heros.force, heros.multiplicateur, heros.base);
}
return puissance;
}
const ordreAugmentation = ["ironman", "spiderman", "captainamerica", "thor"];
function resolve() {
let result = 1;
// Index pour parcourir le tablea ordreAugmentation
let indexAugmentation = 0;
while (calculerPuissanceAvengers(superHeros) <= game.gameData.thanos) {
const nomHeros = ordreAugmentation[indexAugmentation];
superHeros[nomHeros].force += 1;
// Incrémentation de l'index
// Le modulo permet de ne jamais dépasser le nombre d'éléments
indexAugmentation = (indexAugmentation + 1) % ordreAugmentation.length;
result += 1;
}
return result;
}
// Pour répondre au challenge
game.output({data: resolve()});
Un peu d’explications :
Ici au lieu d’avoir pour chaque avenger son suivant dans un tableau, on a les avengers dans un tableau et on se déplace de 1 en 1 dans l’index. Le modulo ramène à zéro si nécessaire.
Encore merci à Céline de nous avoir remonté ce corrigé !
N’hésite pas à nous soumettre le tien en passant par la page de contact 😉
Other content to discover