• Let op Elke klasse in een eigen bestand. Een klasse in Program.cs of één bestand met al je klassen kost 3 punten.
  • Let op Instantievariabelen zijn altijd private en beginnen met een kleine letter, wat public is begint met een hoofdletter (boeteblad). Een objectmethode krijgt geen static.
  • Groene kronkels met CS8618 onder een string-property mag je laten staan (uitleg).

Tamagotchi (Essential)

Een tamagotchi is een virtueel huisdiertje: je moet het eten geven en ermee spelen, anders wordt het ongelukkig. Je maakt er een klasse van, nog zonder properties: alles loopt via methoden, zoals de klasse Mens in het begin van het hoofdstuk.

Maak een klasse Tamagotchi in een eigen bestand Tamagotchi.cs:

  • Drie private instantievariabelen met een beginwaarde: naam ("Tama"), honger (5) en geluk (5). Honger en geluk liggen altijd tussen 0 en 10.
  • GeefNaam(string nieuweNaam): geeft de tamagotchi een andere naam.
  • Eet(): de honger zakt met 3, maar nooit onder 0.
  • Speel(): het geluk stijgt met 2 en de honger met 1, allebei nooit boven 10.
  • ToonToestand(): toont de naam, de honger en het geluk, zoals in het voorbeeld.

Test je klasse met deze Main:

Tamagotchi eerste = new Tamagotchi();
Tamagotchi tweede = new Tamagotchi();
tweede.GeefNaam("Pixel");

eerste.Eet();
eerste.Eet();
eerste.Eet();
tweede.Speel();
tweede.Speel();

eerste.ToonToestand();
tweede.ToonToestand();
Tama: honger 0/10, geluk 5/10
Pixel: honger 7/10, geluk 9/10

Probeer daarna in Main eens eerste.honger = -50;. Wat zegt de compiler, en waarom is dat net goed?

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

  • Elk object heeft zijn eigen instantievariabelen. eerste heeft drie keer gegeten, tweede merkt daar niets van.
  • Omdat honger private is, kan Main de honger enkel via Eet en Speel veranderen. Die methoden zorgen dat de waarde altijd tussen 0 en 10 blijft: het object beschermt zichzelf.
  • De methoden staan zonder static: ze werken telkens op het object waarop je ze oproept.
  • Zie Instantievariabelen.

RapportModule (Essential)

Doel: Ontwerp een klasse die een graad berekent op basis van een behaald percentage.

Specificaties:

  • Klassenaam: Rapport
  • Properties:
    • Percentage (type: int): Het behaalde punt, als auto-property.
  • Methoden:
    • PrintGraad() (type: void): Toont de graad in de console.

Werking: De methode PrintGraad controleert de waarde van Percentage en toont de bijbehorende tekst:

Percentage Output Tekst
Minder dan 50 “Niet geslaagd”
50 t.e.m. 68 “Voldoende”
69 t.e.m. 75 “Onderscheiding”
76 t.e.m. 85 “Grote onderscheiding”
Meer dan 85 “Grootste onderscheiding”

Testcode. Zet deze code in je Main. Je klasse werkt als je exact deze uitvoer krijgt.

Rapport mijnPunten = new Rapport();
mijnPunten.Percentage = 65;
Rapport vriendPunten = new Rapport();
vriendPunten.Percentage = 89;

mijnPunten.PrintGraad();
vriendPunten.PrintGraad();

int[] grenzen = { 49, 50, 68, 69, 75, 76, 85, 86 };
Rapport test = new Rapport();
for (int i = 0; i < grenzen.Length; i++)
{
    test.Percentage = grenzen[i];
    Console.Write($"{grenzen[i]}: ");
    test.PrintGraad();
}
Voldoende
Grootste onderscheiding
49: Niet geslaagd
50: Voldoende
68: Voldoende
69: Onderscheiding
75: Onderscheiding
76: Grote onderscheiding
85: Grote onderscheiding
86: Grootste onderscheiding

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

  • Rapport is de klasse, mijnPunten en vriendPunten zijn twee objecten. Elk object onthoudt zijn eigen Percentage.
  • PrintGraad krijgt geen parameter: het object kent zijn percentage al via de property.
  • De klasse staat in een eigen bestand en PrintGraad heeft geen static.

Nummers

Doel: Maak een rekenmachine-klasse die bewerkingen uitvoert op twee getallen.

Specificaties:

  • Klassenaam: NummerBerekenaar
  • Properties:
    • Getal1 (type: int): Het eerste getal.
    • Getal2 (type: int): Het tweede getal.
  • Methoden:
    • Som(): returntype int
    • Verschil(): returntype int
    • Product(): returntype int
    • Quotient(): returntype double

Werking:

  • Som, Verschil, Product: Voeren de standaard wiskundige bewerking uit (+, -, *) en geven het resultaat terug.
  • Quotient: Deelt Getal1 door Getal2.
    • Let op: Delen door nul mag niet.
    • Als Getal2 gelijk is aan 0: Toon foutboodschap “Kan niet delen door 0” in de console EN geef 0.0 terug.
    • Anders: Geef het resultaat van de deling terug.

Testcode. Zet deze code in je Main. Je klasse werkt als je exact deze uitvoer krijgt.

NummerBerekenaar paar1 = new NummerBerekenaar();
paar1.Getal1 = 12;
paar1.Getal2 = 34;
Console.WriteLine($"Som = {paar1.Som()}");
Console.WriteLine($"Verschil = {paar1.Verschil()}");
Console.WriteLine($"Product = {paar1.Product()}");
Console.WriteLine($"Quotient = {paar1.Quotient():F2}");

NummerBerekenaar paar2 = new NummerBerekenaar();
paar2.Getal1 = 5;
paar2.Getal2 = 0;
Console.WriteLine($"Quotient = {paar2.Quotient():F2}");
Som = 46
Verschil = -22
Product = 408
Quotient = 0,35
Kan niet delen door 0
Quotient = 0,00

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

Voorspel de uitvoer: twee lampen (Essential)

Een slimme lamp op je kot heeft een helderheid van 0 (uit) tot 100. Maak een project Lampen en zet deze klasse in Lamp.cs:

internal class Lamp
{
    private int helderheid = 50;

    public int Helderheid
    {
        get
        {
            return helderheid;
        }
        set
        {
            if (value >= 0 && value <= 100)
            {
                helderheid = value;
            }
        }
    }

    public void Dim()
    {
        Helderheid = Helderheid - 10;
    }
}

Deel 1. Lees eerst deze Main en schrijf op papier wat ze toont. Voer ze pas daarna uit.

Lamp keuken = new Lamp();
Lamp gang = new Lamp();

keuken.Helderheid = 80;
gang.Helderheid = 150;

keuken.Dim();
keuken.Dim();
gang.Dim();

Console.WriteLine($"Keuken: {keuken.Helderheid}");
Console.WriteLine($"Gang: {gang.Helderheid}");
Console.WriteLine(keuken);

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

Deel 2. Wat toont dit stuk?

Lamp nachtlamp = new Lamp();
for (int i = 0; i < 6; i++)
{
    nachtlamp.Dim();
}
Console.WriteLine($"Nachtlamp: {nachtlamp.Helderheid}");

En wat toont het als Dim er zo uitziet?

public void Dim()
{
    helderheid = helderheid - 10;
}

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

  • Elk object heeft zijn eigen helderheid. Wat je met keuken doet, verandert niets aan gang.
  • Een set die een waarde weigert, laat de oude waarde staan.
  • Ga ook binnen de klasse via de property, anders omzeil je je eigen controle. Zie Read-only property met private set.
  • Console.WriteLine van een object toont de naam van zijn klasse.

Studentklasse (Essential)

Doel: Sla gegevens van een student op en bereken het gemiddelde.

Specificaties:

  • Klassenaam: Student
  • Enum: Klassen (definieer deze buiten de klasse, mogelijke waarden: TI1, TI2, TI3)
  • Properties (allemaal auto-properties):
    • Naam (string)
    • Leeftijd (int)
    • Klas (Klassen - gebruik de enum hierboven)
    • PuntenCommunicatie (int)
    • PuntenProgrammingPrinciples (int)
    • PuntenWebTech (int)
  • Methoden:
    • BerekenGemiddelde(): Geeft het gemiddelde van de 3 puntenvakken terug als double.
    • GeefOverzicht(): Toont een rapport in de console, met het gemiddelde op twee cijfers na de komma (zie testcode).

Testcode. Zet deze code in je Main. Je klasse werkt als je exact deze uitvoer krijgt. Lijn uit met \t.

Student student1 = new Student();
student1.Klas = Klassen.TI1;
student1.Naam = "Joske Vermeulen";
student1.Leeftijd = 21;
student1.PuntenCommunicatie = 12;
student1.PuntenProgrammingPrinciples = 15;
student1.PuntenWebTech = 13;

student1.GeefOverzicht();
Joske Vermeulen, 21 jaar
Klas: TI1

Cijferrapport:
**********
Communicatie:           12
Programming Principles: 15
Web Technology:         13
Gemiddelde:             13,33

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

  • GeefOverzicht roept BerekenGemiddelde op in plaats van de berekening te herhalen. Zo staat de formule op één plek.
  • De enum staat buiten de klasse, zodat je in Main gewoon Klassen.TI1 kan schrijven.

PizzaTime

Doel: Maak een klasse Pizza die waarden controleert voordat ze worden opgeslagen.

Specificaties:

  • Klassenaam: Pizza
  • Properties (full properties met controle, elk met een private instantievariabele):
    • Toppings (string): Beschrijving van de toppings. Beginwaarde "tomatensaus".
    • Diameter (int): Doorsnede in cm. Beginwaarde 25.
    • Prijs (double): Prijs in euro. Beginwaarde 10.

Controle (in de set van de properties): Is de nieuwe waarde (value) niet geldig, dan doe je niets: de oude waarde blijft staan.

  1. Prijs en Diameter: Moeten groter zijn dan 0.
  2. Toppings: Mag niet leeg zijn. Dat controleer je met string.IsNullOrWhiteSpace(value): die methode geeft true als de tekst leeg is of enkel spaties bevat, en ook als er nog helemaal geen tekst in de variabele zit. Je roept ze op met string. ervoor, net zoals int.Parse.

Testcode. Zet deze code in je Main. Je klasse werkt als je exact deze uitvoer krijgt.

Pizza margherita = new Pizza();
margherita.Toppings = "tomaat en mozzarella";
margherita.Diameter = 30;
margherita.Prijs = 12.5;

margherita.Toppings = "   ";
margherita.Diameter = -5;
margherita.Prijs = 0;
Console.WriteLine($"{margherita.Toppings}, {margherita.Diameter} cm, {margherita.Prijs} euro");

Pizza huispizza = new Pizza();
huispizza.Toppings = "";
Console.WriteLine($"{huispizza.Toppings}, {huispizza.Diameter} cm, {huispizza.Prijs} euro");
tomaat en mozzarella, 30 cm, 12,5 euro
tomatensaus, 25 cm, 10 euro

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

  • Een set zonder else laat bij een foute waarde gewoon de oude waarde staan. De tweede reeks toekenningen in de testcode verandert dus niets.
  • propfull gevolgd door twee keer Tab schrijft het skelet van een full property voor je.

Stevens pizza (Essential)

Stagiair Steven moest voor de pizzeria om de hoek een klasse Pizza maken: toppings, een diameter en een prijs, en er mocht geen onzin in een pizza terechtkomen. Hij vroeg het aan een A.I. en plakte het resultaat in zijn project. In Pizza.cs:

internal class Pizza
{
    private string toppings = "tomatensaus";
    private int diameter = 25;
    public double prijs;

    public string Toppings
    {
        get
        {
            return toppings;
        }
        set
        {
            if (!string.IsNullOrWhiteSpace(value))
            {
                Toppings = value;
            }
        }
    }

    public int Diameter
    {
        get
        {
            return diameter;
        }
        set
        {
            if (value > 0)
            {
                diameter = diameter;
            }
        }
    }

    public static void ToonInfo()
    {
        Console.WriteLine($"Pizza met {Toppings}, {Diameter} cm, {prijs} euro");
    }
}

En in Main:

Pizza margherita;
margherita.Toppings = "tomaat en mozzarella";
margherita.Diameter = 30;

Console.WriteLine("Wat kost de margherita?");
double prijs = Convert.ToDouble(Console.ReadLine());
if (prijs > 0)
{
    margherita.prijs = prijs;
}

margherita.ToonInfo();

Deel 1. Neem de code over in een nieuw project: de klasse in een apart bestand, de rest in Main. Het project compileert niet. De compiler geeft vijf fouten en één waarschuwing. Laat de waarschuwing even liggen: de vijf fouten hebben samen maar twee oorzaken. Welke, en hoe los je ze op?

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

Deel 2. Nu compileert het, met nog altijd die ene waarschuwing. Voer het uit. Het programma crasht nog voor het de prijs vraagt. Zoek de oorzaak en los ze op. Daarna loopt het wel, maar met 12 als prijs toont het Pizza met tomaat en mozzarella, 25 cm, 12 euro, terwijl Steven de diameter op 30 zette. Zoek ook die fout. De waarschuwing helpt je.

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

Deel 3. Het programma doet nu wat Steven wou, zonder fouten of waarschuwingen. Een collega gebruikt de klasse voor een tweede pizza:

Pizza hawaii = new Pizza();
hawaii.Toppings = "ham en ananas";
hawaii.prijs = -4;
hawaii.ToonInfo();

Ook dat compileert, en het toont Pizza met ham en ananas, 25 cm, -4 euro. Welke twee keuzes in Stevens code maken dat mogelijk? Herschrijf de klasse en Main zodat geen enkele pizza een prijs van 0 of minder kan krijgen, ook niet in de code van de collega.

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

  • Van de zes fouten gaven er twee een compileerfout en één een waarschuwing. De stack overflow, de publieke instantievariabele en de controle in Main vond de compiler niet.
  • Lees ook de waarschuwingen. CS1717 wees de lijn met de fout in Diameter aan, terwijl het programma gewoon startte.
  • Tussen Toppings = value; en toppings = value; zit één hoofdletter: het eerste schrijft naar de property, het tweede naar de instantievariabele.
  • Zie De new operator, Object methoden (over static), Full property: set gedeelte en Full property met toegangscontrole.

Meetlat: past die kast in je kot? (Essential)

Je hebt een kot gevonden en zoekt een kast. De mooiste staat op een Amerikaanse webshop, en die geeft alles in voet. Jij hebt enkel een meetlat in meter. Tijd voor een klasse die omrekent.

Specificaties:

  • Klassenaam: Meetlat
  • Property (invoer):
    • BeginLengte (type: double): write-only property waarmee je de lengte in meter instelt.
    • Sla die waarde op in een private instantievariabele lengte.
  • Properties (uitvoer, read-only): ze geven de lengte terug, omgerekend naar de gevraagde eenheid. Er wordt niets extra opgeslagen: de get rekent telkens.
Property Type Formule
LengteInM double lengte
LengteInCm double lengte * 100
LengteInKm double lengte / 1000
LengteInVoet double lengte * 3.2808

Testcode. Zet deze code in je Main. Je klasse werkt als je exact deze uitvoer krijgt.

Meetlat muur = new Meetlat();
muur.BeginLengte = 2.4;
Console.WriteLine($"Je muur is {muur.LengteInM} m hoog, of {muur.LengteInCm} cm.");
Console.WriteLine($"In voet is dat {muur.LengteInVoet:F2}.");
if (muur.LengteInVoet > 7)
{
    Console.WriteLine("Een kast van 7 voet past.");
}

Meetlat fietstocht = new Meetlat();
fietstocht.BeginLengte = 1850;
Console.WriteLine($"Van je kot naar de campus is {fietstocht.LengteInKm} km.");
Je muur is 2,4 m hoog, of 240 cm.
In voet is dat 7,87.
Een kast van 7 voet past.
Van je kot naar de campus is 1,85 km.

Voeg daarna eens Console.WriteLine(muur.BeginLengte); en muur.LengteInCm = 300; toe aan Main. Wat zegt de compiler?

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

  • Write-only: geen get. Read-only: geen set.
  • De vier omrekeningen bewaren niets. Geef je de meetlat een nieuwe lengte, dan kloppen ze meteen allemaal.
  • Zie Property variaties.

Figuren

Doel: Twee klassen, elk met hun eigen properties en dezelfde soort controle.

Specificaties:

Klasse Property of methode Type Werking
Rechthoek Lengte int Full property. Is value kleiner dan 1, dan verandert er niets.
Breedte int Full property. Is value kleiner dan 1, dan verandert er niets.
ToonOppervlakte() void Berekent lengte maal breedte en toont het resultaat.
Driehoek Basis int Full property. Is value kleiner dan 1, dan verandert er niets.
Hoogte int Full property. Is value kleiner dan 1, dan verandert er niets.
ToonOppervlakte() void Berekent basis maal hoogte gedeeld door 2 en toont het resultaat. Dat mag een kommagetal zijn.

Een nieuwe figuur is 1 bij 1: geef de instantievariabelen die beginwaarde.

Rechthoek en Driehoek zijn twee aparte klassen, elk in een eigen bestand. Ze hebben niets met elkaar te maken, behalve dat ze toevallig gelijkaardige properties en methoden hebben.

Testcode. Zet deze code in je Main. Je klassen werken als je exact deze uitvoer krijgt.

Rechthoek tafel = new Rechthoek();
tafel.Lengte = 5;
tafel.Breedte = 6;
tafel.ToonOppervlakte();
tafel.Breedte = -3;
tafel.ToonOppervlakte();

Driehoek vlag = new Driehoek();
vlag.Basis = 5;
vlag.Hoogte = 7;
vlag.ToonOppervlakte();

Driehoek klein = new Driehoek();
klein.ToonOppervlakte();
Oppervlakte rechthoek: 30
Oppervlakte rechthoek: 30
Oppervlakte driehoek: 17,5
Oppervlakte driehoek: 0,5

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

BankManager (Essential)

Deel 1: Basisrekening

  • Klassenaam: Rekening
  • Properties:
    • NaamKlant (string): auto-property.
    • RekeningNummer (string): auto-property.
    • Balans (int): het saldo. Een full property met een private instantievariabele balans, een gewone get en een private set. De set weigert een negatieve waarde.
  • Methoden: ook binnen de klasse ga je via de property Balans, niet rechtstreeks naar balans. Zo geldt de controle in de set overal.
    • StortGeld(int bedrag): telt bedrag bij de balans. Een bedrag van 0 of minder wordt geweigerd met de melding “Ongeldig bedrag.”.
    • HaalGeldAf(int bedrag): geeft terug hoeveel geld er effectief afgehaald werd (een int).
      • Een bedrag van 0 of minder: toon “Ongeldig bedrag.” en geef 0 terug.
      • Is bedrag groter dan de balans: haal enkel af wat er nog op staat, toon “Rekening leeg nu” en geef dat bedrag terug.
      • Anders: verminder de balans met bedrag en geef bedrag terug.
    • ToonInfo(): toont naam, rekeningnummer en balans, zoals in de testcode.

Testcode deel 1. Zet deze code in je Main. Je klasse werkt als je exact deze uitvoer krijgt.

Rekening tim = new Rekening();
tim.NaamKlant = "Tim";
tim.RekeningNummer = "BE01 1000";
tim.StortGeld(1000);

Rekening lotte = new Rekening();
lotte.NaamKlant = "Lotte";
lotte.RekeningNummer = "BE02 2000";
lotte.StortGeld(50);

lotte.StortGeld(tim.HaalGeldAf(300));
tim.ToonInfo();
lotte.ToonInfo();

tim.StortGeld(-500);
lotte.StortGeld(tim.HaalGeldAf(900));
tim.ToonInfo();
lotte.ToonInfo();
Tim (BE01 1000): 700 euro
Lotte (BE02 2000): 350 euro
Ongeldig bedrag.
Rekening leeg nu
Tim (BE01 1000): 0 euro
Lotte (BE02 2000): 1050 euro

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

Deel 2: Rekeningstaat

Voeg functionaliteit toe om een rekening te blokkeren.

  • Enum: RekeningStaat (waarden: Geldig, Geblokkeerd).
  • Property: Staat (RekeningStaat): auto-property met private set, beginwaarde Geldig.
  • Methode: VeranderStaat(): wisselt de staat om (Geldig wordt Geblokkeerd, en omgekeerd).
  • ToonInfo() toont nu ook de staat.

Pas de methoden van deel 1 aan met deze regels:

Actie Als de staat Geldig is Als de staat Geblokkeerd is
StortGeld Zoals in deel 1. Toon “Gaat niet. Rekening geblokkeerd.”
HaalGeldAf Zoals in deel 1. Staat de balans daarna op 0, dan wordt de rekening automatisch geblokkeerd. Toon “Gaat niet. Rekening geblokkeerd.” en geef 0 terug.

Testcode deel 2.

Rekening tim = new Rekening();
tim.NaamKlant = "Tim";
tim.RekeningNummer = "BE01 1000";
tim.StortGeld(300);

Rekening lotte = new Rekening();
lotte.NaamKlant = "Lotte";
lotte.RekeningNummer = "BE02 2000";
lotte.StortGeld(50);

lotte.StortGeld(tim.HaalGeldAf(300));
tim.ToonInfo();
lotte.ToonInfo();

tim.StortGeld(100);
tim.HaalGeldAf(50);

tim.VeranderStaat();
tim.StortGeld(100);
tim.ToonInfo();
Tim (BE01 1000): 0 euro, Geblokkeerd
Lotte (BE02 2000): 350 euro, Geldig
Gaat niet. Rekening geblokkeerd.
Gaat niet. Rekening geblokkeerd.
Tim (BE01 1000): 100 euro, Geldig

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.

  • HaalGeldAf geeft terug hoeveel er echt afgehaald werd. Daardoor werkt lotte.StortGeld(tim.HaalGeldAf(300));: eerst wordt het geld bij Tim afgehaald, en precies dat bedrag gaat naar Lotte.
  • Balans en Staat hebben een private set: Main kan ze lezen, maar enkel de methoden van de rekening kunnen ze veranderen.
  • Omdat ook StortGeld en HaalGeldAf via Balans gaan, kan zelfs een fout in je eigen methoden de balans niet negatief maken. Zie Read-only property met private set.

MiniRPG (Final Essentials)

Tip

Een Final Essentials oefening is een opgave waarin alle leerstof van de voorbije oefeningen aan bod komt.

Doel: Bouw een mini-RPG systeem waarin je een held aanmaakt, traint en laat vechten.

Deel 1: De Setup

Maak eerst de nodige basisstructuur aan.

  1. Enum HeldType: definieer deze buiten je klasse.
    • Opties: Krijger, Magier, Boogschutter. In je code schrijf je Magier zonder trema.
  2. Klasse Held:
    • Properties:
      • Naam (string): Mag niet leeg zijn (string.IsNullOrWhiteSpace, zie PizzaTime). Is de naam leeg, dan wordt het “Naamloze Held”. Dat is ook de beginwaarde.
      • Type (HeldType): Het type van de held.
      • Level (int): Private set. Begint altijd op 1.
      • XP (int): Experience Points. Private set. Begint op 0.
      • Levenspunten (int): Huidige HP. Mag niet onder 0 gaan: een negatieve waarde wordt 0.
      • MaxLevenspunten (int): Read-only property die volgende formule gebruikt: 100 + (Level * 10). (Bij level 1 is dit dus 110).

Deel 2: De Actie

Voeg nu gedrag toe aan je held.

  1. Methoden:
    • VerkrijgErvaring(int punten) (void):
      • Tel punten op bij XP.
      • Level Up Logica: Elke 100 XP stijgt de held een level.
      • Zolang XP >= 100:
        • Verminder XP met 100.
        • Verhoog Level met 1.
        • Verhoog Levenspunten met 10 (omdat MaxHP ook stijgt).
        • Toon: “Level Up! [Naam] is nu level [Level]!”
    • ValAan() (int):
      • Genereert schade gebaseerd op het Level en een basiswaarde.
      • Formule: 10 + Level. (Simpel gehouden voor nu).
      • Return dit getal.
    • IncasseerSchade(int schade) (void):
      • Trek schade af van Levenspunten.
      • Dat Levenspunten niet onder 0 zakt, regelt de property al.
      • Als Levenspunten 0 bereikt: Toon “[Naam] is verslagen…”.
    • GeefStats() (string):
      • Geeft een samenvatting terug, bv:
      • “[Naam] (Level [Level] [Type]) - HP: [Levenspunten]/[MaxLevenspunten] - XP: [XP]”

Voorbeeldgebruik in Main:

Held conan = new Held();
conan.Naam = "Conan";
conan.Type = HeldType.Krijger;
conan.Levenspunten = conan.MaxLevenspunten;

Console.WriteLine(conan.GeefStats());

// Conan traint
conan.VerkrijgErvaring(150);

Console.WriteLine(conan.GeefStats());

// Conan vecht
int schade = conan.ValAan();
Console.WriteLine($"Conan doet {schade} schade.");

// Conan wordt geraakt
conan.IncasseerSchade(50);
Console.WriteLine(conan.GeefStats());
Conan (Level 1 Krijger) - HP: 110/110 - XP: 0
Level Up! Conan is nu level 2!
Conan (Level 2 Krijger) - HP: 120/120 - XP: 50
Conan doet 12 schade.
Conan (Level 2 Krijger) - HP: 70/120 - XP: 50

Extra Uitdaging (Optioneel): Maak de ValAan methode slimmer gebaseerd op HeldType.

  • Krijger: Doet 10 + (Level * 2) schade (fysiek sterk).
  • Magier: Doet 5 + (Level * 3) schade (begint zwak, wordt heel sterk).
  • Boogschutter: Doet 8 + (Level * 2) schade.

Met deze versie doet Conan in het voorbeeld 14 schade in plaats van 12.

Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel gebruikt, dan verschijnt de oplossing hier vanzelf.