- Let op Elke klasse in een eigen bestand. Een klasse in
Program.csof één bestand met al je klassen kost 3 punten. - Let op Instantievariabelen zijn altijd
privateen beginnen met een kleine letter, watpublicis begint met een hoofdletter (boeteblad). Een objectmethode krijgt geenstatic. - Groene kronkels met
CS8618onder eenstring-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) engeluk(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.
eersteheeft drie keer gegeten,tweedemerkt daar niets van. - Omdat
hongerprivate is, kanMainde honger enkel viaEetenSpeelveranderen. 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.
Rapportis de klasse,mijnPuntenenvriendPuntenzijn twee objecten. Elk object onthoudt zijn eigenPercentage.PrintGraadkrijgt geen parameter: het object kent zijn percentage al via de property.- De klasse staat in een eigen bestand en
PrintGraadheeft geenstatic.
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(): returntypeintVerschil(): returntypeintProduct(): returntypeintQuotient(): returntypedouble
Werking:
Som,Verschil,Product: Voeren de standaard wiskundige bewerking uit (+,-,*) en geven het resultaat terug.Quotient: DeeltGetal1doorGetal2.- 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.0terug. - 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
keukendoet, verandert niets aangang. - Een
setdie 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.WriteLinevan 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 alsdouble.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.
GeefOverzichtroeptBerekenGemiddeldeop in plaats van de berekening te herhalen. Zo staat de formule op één plek.- De enum staat buiten de klasse, zodat je in
MaingewoonKlassen.TI1kan 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. Beginwaarde25.Prijs(double): Prijs in euro. Beginwaarde10.
Controle (in de set van de properties): Is de nieuwe waarde (value) niet geldig, dan doe je niets: de oude waarde blijft staan.
- Prijs en Diameter: Moeten groter zijn dan 0.
- Toppings: Mag niet leeg zijn. Dat controleer je met
string.IsNullOrWhiteSpace(value): die methode geefttrueals de tekst leeg is of enkel spaties bevat, en ook als er nog helemaal geen tekst in de variabele zit. Je roept ze op metstring.ervoor, net zoalsint.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
setzonderelselaat bij een foute waarde gewoon de oude waarde staan. De tweede reeks toekenningen in de testcode verandert dus niets. propfullgevolgd 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
Mainvond de compiler niet. - Lees ook de waarschuwingen.
CS1717wees de lijn met de fout inDiameteraan, terwijl het programma gewoon startte. - Tussen
Toppings = value;entoppings = 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
getrekent 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: geenset. - 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 instantievariabelebalans, een gewonegeten een privateset. Desetweigert een negatieve waarde.
- Methoden: ook binnen de klasse ga je via de property
Balans, niet rechtstreeks naarbalans. Zo geldt de controle in desetoveral.StortGeld(int bedrag): teltbedragbij 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 (eenint).- Een bedrag van 0 of minder: toon “Ongeldig bedrag.” en geef 0 terug.
- Is
bedraggroter 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
bedragen geefbedragterug.
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 metprivate set, beginwaardeGeldig. - 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.
HaalGeldAfgeeft terug hoeveel er echt afgehaald werd. Daardoor werktlotte.StortGeld(tim.HaalGeldAf(300));: eerst wordt het geld bij Tim afgehaald, en precies dat bedrag gaat naar Lotte.BalansenStaathebben een privateset:Mainkan ze lezen, maar enkel de methoden van de rekening kunnen ze veranderen.- Omdat ook
StortGeldenHaalGeldAfviaBalansgaan, kan zelfs een fout in je eigen methoden de balans niet negatief maken. Zie Read-only property met private set.
MiniRPG (Final Essentials)
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.
- Enum
HeldType: definieer deze buiten je klasse.- Opties:
Krijger,Magier,Boogschutter. In je code schrijf jeMagierzonder trema.
- Opties:
- 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).
- Properties:
Deel 2: De Actie
Voeg nu gedrag toe aan je held.
- Methoden:
VerkrijgErvaring(int punten)(void):- Tel
puntenop bijXP. - Level Up Logica: Elke 100 XP stijgt de held een level.
- Zolang
XP >= 100:- Verminder XP met 100.
- Verhoog
Levelmet 1. - Verhoog
Levenspuntenmet 10 (omdat MaxHP ook stijgt). - Toon: “Level Up! [Naam] is nu level [Level]!”
- Tel
ValAan()(int):- Genereert schade gebaseerd op het
Levelen een basiswaarde. - Formule:
10 + Level. (Simpel gehouden voor nu). - Return dit getal.
- Genereert schade gebaseerd op het
IncasseerSchade(int schade)(void):- Trek
schadeaf vanLevenspunten. - Dat
Levenspuntenniet onder 0 zakt, regelt de property al. - Als
Levenspunten0 bereikt: Toon “[Naam] is verslagen…”.
- Trek
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: Doet10 + (Level * 2)schade (fysiek sterk).Magier: Doet5 + (Level * 3)schade (begint zwak, wordt heel sterk).Boogschutter: Doet8 + (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.