Review cours Terminale NSI — POO, SQL, Sécurité, Soc, Calculabilité, Réseau
This commit is contained in:
@@ -398,14 +398,107 @@ Modifiez la classe `Pokemon` pour qu'un Pokémon possède une liste de capacité
|
||||
|
||||
---
|
||||
|
||||
## Partie 5 : Héritage — Spécialiser les Pokémon
|
||||
|
||||
> **Prérequis** : avoir vu le cours sur l'héritage.
|
||||
|
||||
Jusqu'ici, tous les Pokémon utilisent la même méthode `attaquer`. Mais en vrai, un Pokémon Feu n'attaque pas comme un Pokémon Eau. Plutôt que de gérer ça avec un dictionnaire de faiblesses dans `attaquer`, on peut utiliser l'**héritage** pour créer des sous-classes spécialisées.
|
||||
|
||||
---
|
||||
|
||||
### Exercice 8 : Sous-classes par type
|
||||
|
||||
Créez trois sous-classes qui héritent de `Pokemon` :
|
||||
|
||||
- `PokemonFeu` : inflige ×2 dégâts aux Pokémon Plante
|
||||
- `PokemonEau` : inflige ×2 dégâts aux Pokémon Feu
|
||||
- `PokemonPlante` : inflige ×2 dégâts aux Pokémon Eau
|
||||
|
||||
Chaque sous-classe doit :
|
||||
1. Hériter de `Pokemon` via `class PokemonFeu(Pokemon):`
|
||||
2. Appeler `super().__init__(...)` dans son constructeur en fixant `type_pokemon` automatiquement
|
||||
3. Surcharger la méthode `attaquer` pour appliquer le bonus de dégâts
|
||||
|
||||
```python
|
||||
class PokemonFeu(Pokemon):
|
||||
def __init__(self, nom, niveau=1, pv_max=100, attaque=10):
|
||||
super().__init__(nom, "Feu", niveau, pv_max, attaque)
|
||||
|
||||
def attaquer(self, cible):
|
||||
"""
|
||||
Attaque avec ×2 dégâts si la cible est de type Plante.
|
||||
"""
|
||||
# À compléter
|
||||
pass
|
||||
|
||||
|
||||
class PokemonEau(Pokemon):
|
||||
def __init__(self, nom, niveau=1, pv_max=100, attaque=10):
|
||||
super().__init__(nom, "Eau", niveau, pv_max, attaque)
|
||||
|
||||
def attaquer(self, cible):
|
||||
"""
|
||||
Attaque avec ×2 dégâts si la cible est de type Feu.
|
||||
"""
|
||||
# À compléter
|
||||
pass
|
||||
|
||||
|
||||
class PokemonPlante(Pokemon):
|
||||
def __init__(self, nom, niveau=1, pv_max=100, attaque=10):
|
||||
super().__init__(nom, "Plante", niveau, pv_max, attaque)
|
||||
|
||||
def attaquer(self, cible):
|
||||
"""
|
||||
Attaque avec ×2 dégâts si la cible est de type Eau.
|
||||
"""
|
||||
# À compléter
|
||||
pass
|
||||
```
|
||||
|
||||
**Tests :**
|
||||
```python
|
||||
>>> salameche = PokemonFeu("Salamèche", niveau=15, pv_max=70, attaque=12)
|
||||
>>> bulbizarre = PokemonPlante("Bulbizarre", niveau=15, pv_max=75, attaque=10)
|
||||
>>> salameche.attaquer(bulbizarre)
|
||||
C'est super efficace !
|
||||
Salamèche attaque Bulbizarre et inflige 24 dégâts !
|
||||
>>> bulbizarre.attaquer(salameche)
|
||||
Bulbizarre attaque Salamèche et inflige 10 dégâts !
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Exercice 9 : isinstance() en pratique
|
||||
|
||||
1. Vérifiez que `salameche` est à la fois une instance de `PokemonFeu` **et** de `Pokemon`. Expliquez pourquoi.
|
||||
2. Écrivez une fonction `compter_par_type(equipe)` qui prend une liste de Pokémon et renvoie un dictionnaire `{type: nombre}`.
|
||||
|
||||
```python
|
||||
>>> equipe = [PokemonFeu("Dracaufeu"), PokemonEau("Tortank"), PokemonFeu("Sulfura"), PokemonPlante("Florizarre")]
|
||||
>>> compter_par_type(equipe)
|
||||
{'Feu': 2, 'Eau': 1, 'Plante': 1}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Exercice 10 : Refactoring
|
||||
|
||||
Relisez le dictionnaire `FAIBLESSES` de l'exercice 3. Maintenant que vous avez des sous-classes, ce dictionnaire est-il encore utile ? Quelle approche est plus lisible selon vous ? Discutez.
|
||||
|
||||
---
|
||||
|
||||
## Résumé des classes
|
||||
|
||||
| Classe | Attributs | Méthodes principales |
|
||||
|--------|-----------|----------------------|
|
||||
| `Pokemon` | nom, type, niveau, pv, attaque | attaquer(), subir_degats(), est_ko() |
|
||||
| `Dresseur` | nom, equipe | ajouter_pokemon(), tous_ko() |
|
||||
| `Combat` | dresseur1, dresseur2, tour | lancer_combat() |
|
||||
| `CentrePokemon` | ville | soigner_equipe() |
|
||||
| Classe | Hérite de | Attributs supplémentaires | Méthodes modifiées |
|
||||
|--------|-----------|---------------------------|--------------------|
|
||||
| `Pokemon` | — | nom, type, niveau, pv, attaque | attaquer(), subir_degats(), est_ko() |
|
||||
| `PokemonFeu` | `Pokemon` | — | attaquer() |
|
||||
| `PokemonEau` | `Pokemon` | — | attaquer() |
|
||||
| `PokemonPlante` | `Pokemon` | — | attaquer() |
|
||||
| `Dresseur` | — | nom, equipe | ajouter_pokemon(), tous_ko() |
|
||||
| `Combat` | — | dresseur1, dresseur2, tour | lancer_combat() |
|
||||
| `CentrePokemon` | — | ville | soigner_equipe() |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user