# Oefeningen H17

## Figures with interfaces

Gebruik je [Rechthoek-klasse uit de Figuren oefening](https://apwt.gitbook.io/ziescherp-oefeningen/oefeningen-h9-tot-en-met-h12/oefeningen-h9/a_practica#figures) die je eerder hebt aangemaakt. Maak een List aan waarin je een 10 rechthoek-objecten plaatsen, allen met een verschillende grootte. Zorg ervoor dat je nu je rechthoeken met de Sort()-methode kan sorteren op oppervlakte.

Toon de werking aan in een klein voorbeeld programma.

## Carbon Footprint (*Essential*)

Maak 4 klassen:

* `Huis`
* `Fabriek`
* `Auto`
* `Plant`

Maak een interface `ICarbonFootPrint` die

* 1 methode `BerekenFootprint` heeft die een int teruggeeft en geen parameters nodig heeft
* 1 methode `VerlaagFootprint` die niets teruggeeft en geen parameters nodig heeft

Breidt de volgende klassen met de interface uit:

* De carbon footprint van een `huis` is gebaseerd op het volume van het huis in kubieke meter maal 10.
* De carbon footprint van een `fabriek` is gebaseerd op het aantal werknemers maal 100.
* De carbon footprint van een `auto` is gebaseerd op het merk

Het verlagen van de footprint in iedere klasse verzin je zelf (door bijvoorbeeld bij het huis de factor 10 met 1 te verlagen).

Zorg ervoor dat van iedere klasse de footprint kan bevraagd worden (maak/verzin dus de nodige properties per klasse om dit te bereken). De klasse plant moet je niet aanpassen.

Plaats van iedere klasse 2 objecten in een gemeenschappelijke lijst en zorg ervoor dat:

* de footprint van alle objecten getoond wordt (planten worden overgeslagen)
* de gemiddelde footprint van alle objecten (ook planten worden meegeteld) berekend
* toont welk object de hoogte footprint heeft
* van alle objecten de footprint kan verlaagd worden

## Pokémon interfaces (*Essential*)

Shadow Pokémon zijn een speciaal ras Pokémon ([zie hier](https://bulbapedia.bulbagarden.net/wiki/Shadow_Pok%C3%A9mon)) en kunnen "purified" worden op verschillende manieren. Maak een interface `IShadow` die een methode `Purify` heeft. Verzin enkele Pokémon die Shadow Pokémon zijn, geef ze de interface, en verzin manieren hoe ze purified kunnen worden (bv door hun HP op -1 te zetten). Kan je door je lijst van Pokémon gaan enkel de Shadow Pokémon op het scherm tonen?

## PokéDex IList (PRO)

Maak een PokéDex die de interface `IEnumerable` implementeert zoals [hier uitgelegd](https://docs.microsoft.com/en-us/dotnet/api/system.collections.ienumerable?view=netcore-3.1). Hierdoor kan je je PokéDex klasse gebruiken als een `List`.

## Mapmaker afwerken

Vervolledig het all-in-project "[Map Maker](https://github.com/timdams/csharpbook_oefeningen/blob/master/A_DEEL2_AllInOne/1_MapMapker.md)". Inclusief interfaces en is/as .Kan je zelf extra zaken toevoegen zoals andere kamers, andere functionaliteit, etc.

## Game

{% hint style="info" %}
Maak eerst de [corona missie van dit hoofdstuk](https://github.com/timdams/csharpbook_oefeningen/blob/master/16_interfaces/coronamissie.md). Die opdracht is veel kleiner dan deze stevige brok.
{% endhint %}

**Zie onderaan pagina voor minimale klasse-hiërarchie en interfaces.**

Maak een spel dat als volgt werkt:

* De speler dient met zijn pion de overkant van het veld te bereiken.
* Het veld bestaat uit 20 bij 20 vakjes. Op ieder vakje kan maximum één mapelement staan:
  * De speler zelf
  * Een monster
* Een rots
* Een speler kan niet door rotsen of monsters wandelen.
* Een speler kan in zijn beurt telkens één vakje bewegen OF naar rechts schieten:
* Indien geschoten wordt dan zal het mapelement op het vakje rechts van de speler vernietigd worden (rots of monster)
* Monsters kunnen ook bewegen. In de beurt van de monsters beweegt ieder monster in een willekeurige richting indien er geen rotsen of spelers LINKS van het monster staan.
* Indien er WEL een rots of speler LINKS van het monster staat dan schiet het monster en vernietigd het de speler of rots.
* Enkel RockDestroyer monsters kunnen schieten. De setup van het spel bestaat uit volgende stappen:

1. Maak een 20 bij 20 array aan en plaats bepaalde hoeveelheid monsters en rotsen op de kaart, behalve op kolom 0.
2. Plaats de speler op de plek 0,10 in de array (midden van kolom 0)
3. Doorloop de volgende stappen tot er winnaar is

Iedere beurt van het spel bestaat uit volgende stappen:

1. Vraag speler om input (bewegen in 1 van de 4 richtingen OF schieten)
2. Voer actie van speler uit
3. Kijk of speler overkant van kaart heeft bereikt, zo ja: gewonnen!
4. Beweeg ieder monster op de kaart in een willekeurige richting
5. Beweeg iedere RockDestroyer OF laat RockDestroyer schieten

Stel de speler voor door een X, een rots door O , een monster door M een RockDestroyer door D.

{% hint style="info" %}
Je zal de meeste logica in je `Main` of een `Manager` klasse moeten plaatsen. De Speler klasse bijvoorbeeld kan niet beslissen at een monster moet doen, dat zou willen zeggen dat de speler als jet ware " in het monster" beslissingen kan maken, wat tegen het principe van OOP zou zijn.
{% endhint %}

**Extra’s:** Voorgaande beschrijving is een ‘minimale’ beschrijving. Voorzie extra functionaliteit naar believen zoals:

* Speler heeft levens
* Monsters hebben levens
* Andere soort monsters (bv slimmere)
* Meerdere levels met telkens andere/meer monsters bijvoorbeeld
* Meerdere spelers
* Verder schieten, of schieten in andere richtingen.

**Klasse-schema** ![Klasse-schema](https://4148059946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MG5D2YWFmrSNveq_UIB%2Fuploads%2Fgit-blob-a3bd3b0c0146cace6294f89189290f0937b8e26c%2Fpractgame.png?alt=media)

`Location` is van het type `Point` (compositie). `Point` is een zelfgemaakte mini klasse die er als volgt uit (minimaal uitziet):

```csharp
class Point
{
  public int X{get;set;}
  public int Y{get;set;}
}
```

En dus in je abstracte klasse MapElement zal iets krijgen in de trend van: `public Point Location {get;set;} = new Point();`

**Enkele screenshots**

![Interfaces](https://4148059946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MG5D2YWFmrSNveq_UIB%2Fuploads%2Fgit-blob-98d9e16714ea328dd2ee7b045d624791a191a075%2Fpractgame2.png?alt=media) ![Het spel in actie](https://4148059946-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MG5D2YWFmrSNveq_UIB%2Fuploads%2Fgit-blob-d08db27621cb665d8167a83f3540a11e7da6aa32%2Fpractgame3.png?alt=media)

## Hacker Simulator (*Final Essentials*, GPT)

*Tijd om in de digitale schaduwen te duiken. Je bouwt een systeem om verschillende soorten computersystemen te infiltreren. Elk systeem heeft zijn eigen zwaktes, maar dankzij een universele interface kan je hacker-tool ze allemaal aan.*

### Stap 1: De Interface

Maak een interface `IHackable`.

* Methode `bool TryHack(string password)`: Probeert in te breken. Geeft `true` terug bij succes.
* Property `SecurityLevel` (int): Hoe moeilijk het systeem te kraken is (1-100).
* Methode `ShowData()`: Toont de geheime data (indien gehackt) of "ACCESS DENIED".

### Stap 2: De Doelwitten

Maak 3 klassen die `IHackable` implementeren:

**1. BankServer**

* `SecurityLevel`: 90.
* `TryHack`: Succesvol als het wachtwoord "Money123" is OF als de parameter "BACKDOOR" is.
* `ShowData`: Toont "Transacties: Miljoenen gestolen!".

**2. SocialMediaAccount**

* `SecurityLevel`: 30.
* `TryHack`: Succesvol als het wachtwoord "123456" is (mensen zijn slecht in wachtwoorden).
* `ShowData`: Toont "DM geschiedenis: Genante selfies gevonden.".
* *Extra*: Houdt bij of het account al gehackt is (bool). Eenmaal gehackt, blijft `TryHack` altijd `true` teruggeven.

**3. SmartFridge** (IoT device)

* `SecurityLevel`: 5.
* `TryHack`: Altijd succesvol, ongeacht het wachtwoord (IoT devices zijn onveilig!).
* `ShowData`: Toont "Melk is op. Temperatuur: 4 graden.".

### Stap 3: De Brute Force Tool (Polymorfisme via Interface)

Maak een klasse `HackerTool`.

* Methode `RunBruteForce(List<IHackable> targets)`:
  * Loopt door de lijst van targets.
  * Probeert bij elk target een lijst van veelvoorkomende wachtwoorden ("123456", "password", "admin", "Money123").
  * Als `TryHack` landt:
    * Print "SYSTEM BREACHED: \[Target Type]"
    * Roept `ShowData()` aan.
    * Toont "Security Level was: \[Level]"
  * Als niets werkt, print "Failed to crack system."

### Main

Maak een lijst met verschillende `IHackable` objecten (een bank, paar accounts, en die onveilige koelkast). Laat je `HackerTool` los op de lijst en zie wat je buitmaakt.
