Oefeningen H11
Meetlat constructor (Essential)
Vul de Meetlat
klasse uit het vorige hoofdstuk aan met een constructor. De constructor laat toe om de lengte in meter als parameter mee te geven. De LengteInMeter
write-only property vervang je door een private instantievariabele double lengteInMeter
.
lengteInMeter
stel je nu in via de parameter die je in de constructor meekrijgt.
Persoonsregistratie (Essential) (GPT)
Deze oefening werd gemaakt (en aangepast nadien) met behulp van volgende GPT en heeft daarom de tag (GPT) achter de titel staan.
Implementeer een systeem voor persoonsregistratie dat gebruik maakt van constructors en object initializer syntax om personen op verschillende manieren te initialiseren.
Ontwerp een klasse Persoon
met de volgende eigenschappen: Voornaam
, Achternaam
, Geboortejaar
, en Email
. Alle eigenschappen zijn autoproperties.
Implementeer een overloaded constructor waarmee je
Voornaam
Achternaam
kan instellen.Voeg een methode toe
ToonInformatie()
die de informatie van de persoon netjes afdrukt als volgt: "{Voornaam} {Achternaam} geboren in {Geboortejaar} heeft emailadres: {Email}".
Maak een object van Persoon aan en initialiseer de rest van de eigenschappen ( GeboorteJaar
en Email
) met object initializer syntax. Test de ToonInformatie()
methode voor beide objecten om te verifiëren dat alle gegevens correct zijn geïnitialiseerd.
Bibliotheek constructor en static (Essential)
Pas de Bibliotheek klasse aan uit hoofdstuk 9 zodat deze een default constructor heeft. In de default constructor zorg je ervoor dat de Uitgeleend
property standaard de huidige tijd krijgt van het moment waarop het object werd aangemaakt.
Voeg ook een overloaded constructor mee die een DateTime
object als parameter aanvaardt. Deze parameter zal toegewezen worden aan Uitgeleend
. Werp een Exception op indien je een datum in de toekomst meegeeft.
Een
static
methodeVeranderAlgemeneUitleenTermijn
, die 1int
als parameter aanvaardt.De methode zorgt ervoor dat het aantal dagen dat je boek mag uitlenen veranderd wordt naar de meegeven parameter. Tip: dit zal vereisen dat je een static instantievariabele hebt die je vervolgens in jeInleverDatum
getter gebruikt.
Digitale kluis (Essential)
Basiskluis
Maak een klasse DigitaleKluis
die we gaan gebruiken om een kluis voor te stellen.
De klasse heeft volgende elementen:
Een fullproperty
Code
met private set. De get van deze property zal altijd -666 teruggeven, tenzijCanShowcode
optrue
staat, in dit geval zal de effectieve code worden terug gegeven die in de bijhorende instantievariabelecode
staat.Een overloaded constructor die als parameter een geheel getal toelaat. Dit getal zal worden toegewezen aan
Code
en is dus de toegangscodeEen autoproperty
CanShowCode
type bool, om aan te geven of de code van buitenuit kan gezien worden.Een read-only property
CodeLevel
van typeint
. Deze property zal het level van de code teruggeven (ongeacht CanShowCode). Het level is eenvoudigweg de effectieve code gedeeld door 1000 als geheel getal (dus indien de code 500 is zal 0 worden teruggegeven, indien de code 2000 is wordt 2 teruggegeven, etc.)Een private variabele
aantalPogingen
om bij te houden hoe vaak de gebruiker geprobeerd heeft de code te vinden.Een methode
TryCode
die een geheel getal als parameter aanvaardt. De methode geeft eentrue
terug indien de code correct was, andersfalse
. Deze methode kan gebruikt worden om extern een code te testen , indien deze overeenkomt met de bewaarde code dan zal gemeld worden dat de code geldig is en wordt ook getoond hoeveel keer de gebruiker geprobeerd heeftDeze code is geldig. Aantalpogingen = 5
. Indien de gebruiker -666 meegaf dan verschijnt erCHEATER
op het scherm. Indien de gebruiker een foute code meegaf dan meldt de methode dat dit een foute code was ("geen geldige code"
) en wordt het aantal pogingen met 1 verhoogd. Deze methode kan maar 10 keer aangeroepen worden (ongeacht of de juiste code werd meegegeven of niet).Indien dusaantalPogingen
10 of meer is zal er op het scherm verschijnenJe hebt je 10 pogingen opgebruikt.Sorry.
.
Maak enkele Digitale Kluis objecten aan in je main
en test of je bovenstaande klasse correct is geïmplementeerd.
Kluizen kraken
Voeg aan de klasse een static
methode BruteForce
toe waar je een kluis-object aan kan geven. De methode zal een aantal random codes brute forcen (met een loop die 10 verschillende getallen test) door telkens de TryCode
methode van de meegegeven kluis aan te roepen. Wanneer toevallig de juiste code werd gevonden zal het aantal pogingen getoond worden.
Beeld je in dat Bruteforce een student is. Ik maak een kluis-object aan en vertel aan die student niet welke code ik heb gekozen. Vervolgens geef ik hem mijn object en zeg hem "Je krijgt 10 pogingen om met TryCode de kluiscode te raden. Succes!"
Toelichting
De BruteForce
methode is static
en heeft dus geen informatie over de interne staat van een Kluis-object. Vind je dit verwarrend? Maak deze methode dan aan in je hoofdprogramma (Program.cs): public static void BruteForce(DigitaleKluis testKluis)
en zorg ervoor dat ze daar werkt. De methode zal dus 10 keer TryCode aanroepen op de testKluis
, telkens met een andere getal. Enkel wanneer TryCode true
teruggeeft weet je dat je de juiste code hebt gevonden (merk op dat de kans erg klein is dat in 10 beurten dit zal gevonden worden).
In je main moet dit dus werken:
Vervolgens verplaats je de methode naar je klasse DigitaleKluis
en pas je de aanroep ervan aan in je Main:
Je hebt de oefening nu opgelost :)
Pokémon deel 2 (Essential)
Constructors
Pas de kennis van constructors toe op je Pokémon-project uit het vorige hoofdstuk. Zorg ervoor dat je Pokémon op 3 manieren kunt aanmaken als volgt:
Via een default constructor: alle base stats worden daarbij op 10 standaard ingesteld via de constructor
Via een overloaded constructor die de gebruiker toelaat om de 6 base stats als parameters mee te geven (bv
new Pokemon(45,42,50,65,34,67)
)Via object initializer syntax waarbij je eender welke base stat etc. kunt instellen (bv
new Pokemon(){HP_Base=40, Name="Pikachu"};
)
Het is ook logischer dat je van de base_stats een full property met private setter maakt, daar we die waarden nooit nog mogen aanpassen nadat de constructor werd aangeroepen.
Static methoden
Verhuis de methoden (
GeneratorPokemon
enBattle
) die je maakte in deel 3 van de Pokémon-opdracht in vorige hoofdstuk naar de klassePokemon
zelf en test of deze nog steeds werkt. (Is dit een logischere plek?)Voeg enkele static properties met private set toe om bij te houden:
Hoe vaak een Pokémon z'n level werd verhoogd (dus telkens bij aanroep van
VerhoogLevel
)Hoe veel Battles er al zijn geweest (verhoogt telkens
Battle
wordt uitgevoerd)Hoe vaak een battle resulteerde in gelijkstand (verhoogd bij gelijkstand in
Battle
)Hoe veel random Pokémon werden aangemaakt (verhoogt telkens
GeneratorPokemon
wordt aangeroepen)
Maak een static methode
Info
die deze properties als een soort samenvatting naar het scherm stuurtMaak een static property
NoLevelingAllowed
aan van het type bool. Deze kan van buiten de klasse aangepast worden. Indien deze bool optrue
staat kunnen Pokémon hun level niet verhoogd worden. Wanneer in dit gevalVerhoogLevel
wordt aangeroepen zal er een foutboodschap op het scherm komen.
Toon in je hoofdprogramma aan dat je kunt werken met deze static methoden en properties.
Student Kevin Van Rooy maakte volgende applicatie waarbij bovenstaande opgave als initiële inspiratie diende:
Natures (PRO)
In generatie 3 werd het concept Natures geïntroduceerd. Afhankelijk van deze eigenschap zullen bepaalde full stats van een Pokémon met 10% verhoogd of verlaagd worden.
Een Pokémon krijgt bij de constructie steeds 1 van de 25 onderstaande natures willekeurig toegewezen en zal vervolgens bij impact hebben op 2 full stats.
Gebruik je kennis van Enum
, constructors en properties om dit concept in je Pokemon klasse te implementeren.
Nature | Verhoogt met 10% | Verlaagt met 10 |
Adamant | Attack | Sp. Atk |
Bashful | Sp. Atk | Sp. Atk |
Bold | Defense | Attack |
Brave | Attack | Speed |
Calm | Sp. Def | Attack |
Careful | Sp. Def | Sp. Atk |
Docile | Defense | Defense |
Gentle | Sp. Def | Defense |
Hardy | Attack | Attack |
Hasty | Speed | Defense |
Impish | Defense | Sp. Atk |
Jolly | Speed | Sp. Atk |
Lax | Defense | Sp. Def |
Lonely | Attack | Defense |
Mild | Sp. Atk | Defense |
Modest | Sp. Atk | Attack |
Naive | Speed | Sp. Def |
Naughty | Attack | Sp. Def |
Quiet | Sp. Atk | Speed |
Quirky | Sp. Def | Sp. Def |
Rash | Sp. Atk | Sp. Def |
Relaxed | Defense | Speed |
Sassy | Sp. Def | Speed |
Serious | Speed | Speed |
Timid | Speed | Attack |
Het is aangeraden dat je met een extra methode werkt die een waarde 0,10 of -10 zal teruggeven. Deze methode kan je dan gebruiken in de get van je full stat properties zodat deze code zo compact mogelijk blijft.
Volgende artikel lijst de natures op en beschrijft hoe ze werken
(meer indepth informatie in dit artikel)
Sport simulator
Haal je Sportspeler
klasse van van het vorige hoofdstuk boven en voeg volgende statische methode er aan toe (vervang het soort speler door de naam van jouw klasse. Mijn klasse noemde Waterpolospeler
)
Schrijf een methode genaamd:
static void SimuleerSpeler(Waterpolospeler testspeler)
(vervang dus Waterpolospeler door de klasse die je zelf hebt gemaakt)
De SimuleerSpeler-methode zal beide methoden van je klasse telkens 3x aanroepen m.b.v. een for-loop in de methode (dus in mijn geval 3x GooiBal en 3xWatertrappen)
Test je methode door 2 objecten aan te maken en telkens mee te geven als parameter.
Maak een tweede methode
static void SimuleerWedstrijd(Waterpolospeler speler1, Waterpolospeler speler2)
Bij aanroep van de methode verschijnt er op het scherm wie van beide speler zou winnen als ze zouden spelen. Gebruik een random uitkomst om te bepalen over speler 1 of 2 wint. Toon op het scherm "Speler 1 wint." Gevolg door de aanroep van iedere methode van die speler.
Maak een derde methode
static Waterpolospeler BesteSpeler(Waterpolospeler speler1, Waterpolospeler speler2)
Deze methode gaat ook random bepalen welke speler de beste is. Vervolgens geef je deze speler terug als resultaat. In de main roep je vervolgens iedere methode van dit object aan.
Last updated