# Oefeningen

## Oefening 1: klasse `Pokemon` (h9-pokeattack)

### Leerdoelen

* herhalen aanmaken klassen
* herhalen aanmaken instantiemethoden
* herhalen aanmaken full properties

### Functionele analyse

We willen een bootleg Pokémon spel maken. We starten met een klasse om Pokémon voor te stellen.

#### Technische analyse

Schrijf een klasse `Pokemon` met volgende onderdelen:

* een full property `MaxHP`
  * deze stelt een getal voor dat altijd minstens 20 en maximum 1000 bedraagt
  * als je een lagere of hogere waarde probeert in te stellen, wordt de dichtstbijzijnde waarde ingesteld
* een full property `HP`
  * deze stelt een getal voor dat altijd groter dan of gelijk aan 0 is; verder kan de waarde ook nooit groter gemaakt worden dan `MaxHP`; elke poging om het getal kleiner dan 0 te maken, maakt het gelijk aan 0 en elke poging om boven `MaxHP` te gaan, maakt het gelijk aan `MaxHP`.
* een autoproperty `PokeSpecies` om aan te geven over welk soort Pokémon het gaat; maak hiervoor een enum `PokeSpecies` met waarden `Bulbasaur`, `Charmander`, `Squirtle`, `Pikachu`
* een autoproperty `PokeType` om aan te geven wat het element van de Pokémon is; maak hiervoor een enum `PokeTypes` met waarden `Grass`, `Fire`, `Water`, `Electric`
* een methode `Attack()`: deze zorgt ervoor dat de naam van het soort Pokémon in hoofdletters en in kleur wordt geprint. Je kan de methode `ToString()` van een enum gebruiken. De kleur die je gebruikt is als volgt:
  * groen voor type `Grass`
  * rood voor type `Fire`
  * blauw voor `Water`
  * geel voor `Electric`

Schrijf dan een statische `MakePokemon`-methode in de klasse `Pokemon` die één `Pokemon` van elke soort maakt (je mag de soort en het type invullen na het aanmaken van de objecten) en elk van deze `Pokemon` één keer hun methode `Attack` laat uitvoeren. Elke `Pokemon` start bovendien met 20 hit points als huidige waarde en als maximumwaarde.

#### Voorbeeldinteractie

```
BULBASAUR!
CHARMANDER!
SQUIRTLE!
PIKACHU!
```

(In groen, rood, blauw en geel.)

## Oefening 2 (h9-consciouspokemon)

### Leerdoelen

* arrays van objecten
* `null`

### Functionele analyse

In een gevecht begin je met je eerste Pokémon die nog bij bewustzijn is. Bewusteloze Pokémon kunnen immers niet vechten. Schrijf een statische methode om de eerste bewuste Pokémon te vinden.

### Technische analyse

Schrijf een **statische** methode `FirstConsciousPokemon` met één parameter: een array van `Pokemon`. Deze methode loopt met een `for`-lus door de array en geeft als antwoord de eerste `Pokemon` terug met minstens 1 HP. Je moet zorgen dat de methode aanvaard wordt door de compiler, ook als er geen enkele bewuste Pokémon in de rij is bijgehouden.

Schrijf ook een statische methode `TestConsciousPokemon()` die een array van dezelfde vier Pokémon als hierboven maakt, waarbij Bulbasaur en Charmander 0 HP hebben en Squirtle 2 HP. Toon wat gebeurt als de eerste wakkere Pokémon aanvaalt. Dit is de methode die je vanuit je keuzemenu zal oproepen.

#### Voorbeeldinteractie

```
SQUIRTLE!
```

## Oefening 3 (h9-consciouspokemon-improved)

### Leerdoelen

* arrays van objecten
* `null`

### Functionele analyse

Je moet ook het geval afhandelen waarbij al je Pokémon KO zijn.

### Technische analyse

Breid je methode `TestConsciousPokemon` uit zodat ze niet crasht wanneer al je Pokémon KO zijn. Doe dit in een nieuwe versie, `TestConsciousPokemonSafe`.

#### Voorbeeldinteractie

```
Al je Pokémon zijn KO! Haast je naar het Pokémon center.
```

## Oefening 4: value en reference (h9-pokevalueref)

### Leerdoelen

* call by value vs. call by reference

### Functionele analyse

Een beginnend programmeur bij Game Freak heeft volgende statische methode geschreven in je klasse:

```
public static void RestoreHP(int oldHP, int newHP) {
    oldHP = newHP;
}
```

Hij gaat ervan uit dat dit werkt:

```
public static void DemoRestoreHP() {
// aanmaken van array bewusteloze Pokemon van 4 soorten zoals eerder: zelf doen
for(int i = 0; i < pokemon.Length; i++) {
    Pokemon.RestoreHP(pokemon[i].HP,pokemon[i].MaxHP);
    }
}
for(int i = 0; i < pokemon.Length; i++) {
    Console.WriteLine(pokemon[i].HP)
    }
}
```

Maar dit klopt niet. Los zijn bug op.

### Technische analyse

Je moet `RestoreHP` anders schrijven en ook het gebruik ervan aanpassen. Je mag de parameters van `RestoreHP` volledig aanpassen en ook de eerste `for`-lus veranderen. De tweede `for`-lus en het aanmaken van de array van `Pokemon` moeten exact gebeuren zoals ze geschreven zijn.

Roep `DemoRestoreHP()` op uit je keuzemenu.

#### Voorbeeldinteractie

```
20
20
20
20
```

## Oefening 5: uitkomst gevecht (h9-fight)

### Leerdoelen

* gebruik van `Random`
* `null` guard
* call by reference

### Functionele analyse

Hoe wreed het ook is, Pokémon zijn bestemd om tegen elkaar te vechten. Schrijf een simulatie van een gevecht met een willekeurig element.

### Technische analyse

Schrijf eerst een enumeratie `FightOutcome` met drie mogelijkheden: `WIN`, `LOSS` en `UNDECIDED` ("onbeslist").

Schrijf dan een **statische** methode `FightOutcome` in de klasse `Pokemon`. Deze heeft drie parameters, twee `Pokemon`-objecten en één `Random`-object.

`FightOutcome()` werkt als volgt:

* Een van de twee Pokémon mag eerst aan de beurt; welke van de twee wordt willekeurig beslist met behulp van het `Random`-object.
* Wanneer een Pokémon aan de beurt is, voert hij zijn `Attack()` methode uit.
* Hierna verlaagt de HP van de andere Pokémon met een getal tussen 0 en 20.
* Hierna is de andere van de twee Pokémon aan de beurt, maar alleen als hij nog bij bewustzijn is.
* De match is voorbij wanneer één van de twee Pokémon 0 HP heeft bereikt. Dan wordt het resultaat teruggegeven:
  * `WIN` als de eerste Pokémon die je als parameter hebt meegegeven nog bij bewustzijn is.
  * `LOSS` als de tweede nog bij bewustzijn is.

Handel ook situaties af waarbij minstens één van de twee Pokémon `null` is of al KO is bij het begin van de match. Dan wint de andere vanzelf, tenzij ze allebei ontbreken of KO zijn. Dan is de uitkomst `UNDECIDED`.

Schrijf ten slotte een methode `DemoFightOutcome()` die twee Pokémon naar keuze aanmaakt, hen tegen elkaar laat vechten tot er een resultaat is en dat resultaat dan op het scherm toont.

Test je methode met alle combinaties:

* twee gezonde Pokémon
* één bewusteloos
* twee bewusteloos
* één `null`
* twee `null`
* één bewusteloos en één `null`

### Afronden

Ga na dat al je code van de eerste oefeningen nog werkt nadat je de laatste hebt afgerond en plaats alles op Bitbucket.
