Open menu
Just for Javascript

Exercice 1
  • Rappel : la fonction updateCaracs() étant dans la classe Perso, elle peut accéder à n'importe quel attribut de la classe grâce à this.nom_attribut.
  • Solution possible :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  updateCaracs() {
    this.vitaliy = this.level*50;
    this.armor = 0;
    this.strength = this.level*20;
    for(let i=0;i<this.slots.length;i++) {
      let slot = this.slots[i];
      for(let j=0;j<slot.items.length;j++) {
        let item = slot.items[j];
        // search for armor effects
        if (item.effect[0] == 'A') {
          let val = item.effect.substring(2,item.effect.length);
          if (item.effect[1] == '+') this.armor += eval(val);
          else if (item.effect[1] == '-') this.armor -= eval(val);
        }
        // search for vitality effects
        if (item.effect[0] == 'L') {
          let val = item.effect.substring(2,item.effect.length);
          if (item.effect[1] == '+') this.vitality += eval(val);
          else if (item.effect[1] == '-') this.vitality -= eval(val);
        }
        // search for strength effects
        if (item.effect[0] == 'S') {
          let val = item.effect.substring(2,item.effect.length);
          if (item.effect[1] == '+') this.strength += eval(val);
          else if (item.effect[1] == '-') this.strength -= eval(val);
        }
      }
    }
    if (this.life > this.vitality) this.life = this.vitality;
  }

 

Remarques :
  • On accède aux caractères d'un chaîne directement grâce aux [ ].
  • Quand on appelle substring(), on obtient une chaîne. Si on la concatène directement à une variable avec +=, on va faire de la concaténation de chaîne. Il faut donc forcer JS à considérer la sous-chaîne comme un nombre, par exemple grâce à eval().


Exercice 2

  • Solution possible :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 assign(itemId, to) {    
    let item = this.boughtItems[itemId];
    if (item == undefined) return false;
    let slot = this.slots.find(e => e.name == to);
    let slotLim = itemLimits.find(e => e.slot == to);
    // if to exists in player's slots and itemLimits
    if ((slot != undefined) && (slotLim != undefined)) {
      // check if limits/type is ok or not
      if (slot.items.length == slotLim.limit) {
        alert('limit for '+to+' alreay reached');
        return false;
      }
      let t = slotLim.types.find(e => e == item.type);
      if (t == undefined) {
        alert(to+' cannot be assigned with '+item.type);
        return false;
      }
      slot.items.push(item);
      this.boughtItems.splice(itemId,1);
      this.updateCaracs();
      return true;
    }
    return false;
  }

 

Remarques :
  • accéder en dehors d'un tableau renvoie undefined : pas besoin de tester l'indice.
  • la méthode find() de la classe Array permet de faire une recherche selon un critère évalué grâce à une fonction définie par le programmeur. Cette fonction renvoie true ou false selon que l'élément actuel correspond au critère. Si un élément du tbaleau correspond, find() renvoie cet élément. Sinon, elle renvoie undefined.
  • Comme dans le TP 1, on peut utiliser les fonctions fléchées pour définir le test de recherche. Par exemple, pour l'élément e actuellement parcouru, renvoie si l'attribut name est égal à to, s'écrit : e => e.name == to.
  • push() permet d'ajouter un élément à la fin d'un tableau et splice() d'en supprimer un.
  • ATTENTION ! quand on manipule un tableau d'objets, le fait de retirer un élément du tableau ne détruit pas l'objet. En fait, ce qui est mis dans le tableau n'est qu'une référence (ou pointeur) vers l'objet. Par exemple :
1
2
3
4
5
6
7
8
9
var obj1 = {type:'circ',coords:{x:1,y:2}}
var obj2 = {type:'rect',coords:{x:3,y:0}}
 
var tab = [ obj1, obj2 ]; // met 2 références dans tab
tab[0].coords.x = 8; // OK
obj1.coords.x = 8; // identique à la ligne précédente car tab[0] pointe vers obj1
tab.splice(0,1); // enlève la première référence dans tab => ne détruit pas obj1
console.log(tab[0].type); // affiche rect 
console.log(obj1.type); // affiche circ : obj1 existe encore

 


Téléchargement
  • Vous pouvez télécharger le fichier complet [ ici ]