Met behulp van de getalfuncties die jullie geschreven hebben, gaan jullie nu de getalspellen schrijven. Er zijn drie getalspellen en iedere duogroep neemt één spel voor zijn rekening. Bij elk getalspel hoort een getalfunctie. Het is niet toegestaan om het getalspel te schrijven dat hoort bij de getalfunctie die je hebt geschreven. Je moet dus gebruik maken van een getalfunctie die door iemand anders is geschreven.
Boswandeling bevat de volgende drie getalspellen.
Bij het schrijven van de getalspellen, moet je willekeurige getallen genereren. Gebruik hiervoor de onderstaande functie. Zet de functie in een apart bestand met de naam Willekeurig.cpp zodat niet iedereen de functie apart hoeft op te nemen in zijn bronbestand. Schrijf ook een geschikt headerbestand met de naam Willekeurig.h.
#include <ctime> #include <cstdlib> /** * Genereert een willekeurig getal tussen 0 en maximum. * * @param maximum het maximale getal dat gegenereert wordt * * @return een willekeurig getal tussen 0 en maximum */ int WillekeurigGetal(int maximum) { static bool eersteKeer = true; // is dit de eerste keer dat deze functie wordt // aangeroepen? if (eersteKeer) { // ja, initialiseer getalgenerator srand((unsigned) time(0)); eersteKeer = false; } // genereer willekeurig getal return (int) ((double(rand()) / RAND_MAX) * (maximum + 1)); }
Iedere duogroep levert twee bestanden: een bronbestand en een headerbestand. Als alle bestanden af zijn, moeten jullie gezamenlijk één headerbestand maken voor alle drie de functies. Noem het bestand Getalspellen.h.
Maak een bestand Main.cpp aan met daarin de code die hieronder staat. Deze code stelt je in staat om de spellen te testen. Je mag onderstaande code niet wijzigen.
#include <iostream> #include "Console.h" #include "Getalspellen.h" using namespace std; /** * Het programma start hier * * @return altijd 0 */ int main() { char myKeuze; do { ClearScreen(); // vraag welk spel gestart moet worden cout << "Welk spel wil je starten?\n"; cout << "1. Kluis\n"; cout << "2. Eekhoorn\n"; cout << "3. Postduif\n"; cout << "(Iedere andere toets stopt het "; cout << "programma.)\n"; // lees toets myKeuze = GetKey(); if (myKeuze == '1') { // start Kluis Kluis(); } if (myKeuze == '2') { // start Eekhoorn Eekhoorn(); } if (myKeuze == '3') { // start Postduif Postduif(); } } while ((myKeuze > '0') && (myKeuze < '4')); return 0; }
Als alle bestanden klaar zijn, zet je ze in één zipbestand en dat zipbestand zet je in Leo. Neem ook de bestanden van de getalfuncties op in het zipbestand.
Bij het spel Kluis moet de speler een kluis openen door de combinatie te raden. De combinatie bestaat uit vijf cijfer van 0 t/m 9 en wordt door de computer willekeurig bepaald. Bij elke poging bepaalt het spel of de cijfers uit het geraden getal hoger of lager zijn dan de juiste getallen. Hiervoor maak je gebruik van de functie VergelijkGetallen. Als de speler na vijf keer raden de combinatie niet heeft geraden, kiest de computer een nieuwe combinatie en moet de speler opnieuw beginnen. De speler moet op elk moment kunnen besluiten om het spel niet verder te spelen.
Je bent vrij om te bepalen hoe het spel Kluis precies op het scherm verschijnt en hoe je invoer van de gebruiker vraagt. Je moet er wel voor zorgen dat de speler geen ongeldige invoer kan geven. Dus de speler mag bijvoorbeeld geen combinatie van zes cijfers proberen. Je kunt gebruik maken van de Console API om het scherm te tekenen en om invoer van de gebruiker te lezen.
Schrijf een functie Kluis met daarin de code voor het spel. Deze functie wordt straks aangeroepen als het spel gestart moet worden. De functie moet true teruggeven als de speler het spel gewonnen heeft en anders false. Het prototype van de functie Kluis is:
bool Kluis();
Uiteindelijk moet je twee bestanden opleveren.
Je mag bij het programmeren van het spel ondersteunende functies schrijven. Zet deze functies in Kluis.cpp. Je hoeft ze niet op te nemen in het headerbestand omdat ze van buitenaf niet aangeroepen hoeven worden. Houd je bij het programmeren aan de algemene stijlregels (zie website).
Zet de twee bestanden in één zipbestand voordat je ze in Leo zet.
Tijdens het spel Eekhoorn helpt de speler een eekhoorn om een aantal noten eerlijk te verdelen over vier eekhoorngezinnen. Elk gezin moet een gelijke hoeveelheid aan voedingswaarde krijgen, zodat alle gezinnen de winter door kunnen komen. Er zijn vier soorten noten: hazelnoten, beukennoten, walnoten en kastanjes. Elke soort noot heeft zijn eigen voedingswaarde. Je kunt de voedingswaarde van een verzameling noten opvragen met behulp van de functie Voedingswaarde. De speler moet op elk moment kunnen besluiten om het spel niet verder te spelen.
Het aantal noten dat de eekhoorn te verdelen heeft, moet willekeurig zijn, maar je moet wel zeker zijn dat er een oplossing is. Ga daarom als volgt te werk.
Onderstaande code geeft een voorbeeld van hoe je bovenstaande regels kunt programmeren. Je mag de code letterlijk overnemen of hem aanpassen aan je eigen broncode, als je er maar voor zorgt dat het spel Eekhoorn oplosbaar is.
// declareer variabelen int Hazelnoten, Beukennoten, Walnoten, Kastanjes; // bepaal willekeurige aantallen noten Walnoten = WillekeurigGetal(2) + 1; Hazelnoten = WillekeurigGetal(3); Beukennoten = WillekeurigGetal(3); Kastanjes = WillekeurigGetal(3); // maak oplossing mogelijk Hazelnoten = (Hazelnoten * 4) + (Kastanjes * 3) + (Walnoten * 5) + (Beukennoten * 2); Beukennoten = (Beukennoten * 3) + (Walnoten * 2) + (Kastanjes * 3); Kastanjes += (Walnoten * 2);
Je bent vrij om te bepalen hoe de speler in het spel Eekhoorn de noten in vieren verdeelt. Je moet er wel voor zorgen dat de speler geen ongeldige invoer kan geven. Dus de speler mag bijvoorbeeld niet meer noten verdelen dan er zijn. Je kunt gebruik maken van de Console API om het scherm te tekenen en om invoer van de gebruiker te lezen.
Schrijf een functie Eekhoorn met daarin de code voor het spel. Deze functie wordt straks aangeroepen als het spel gestart moet worden. De functie moet true teruggeven als de speler het spel gewonnen heeft en anders false. Het prototype van de functie Eekhoorn is:
bool Eekhoorn();
Uiteindelijk moet je twee bestanden opleveren:
Je mag bij het programmeren van het spel ondersteunende functies schrijven. Zet deze functies in Kluis.cpp. Je hoeft ze niet op te nemen in het headerbestand omdat ze van buitenaf niet aangeroepen hoeven worden. Houd je bij het programmeren aan de algemene stijlregels (zie website).
Zet de twee bestanden in één zipbestand voordat je ze in Leo zet.
Bij het spel Postduif krijgt de speler te maken met een postduif die de weg kwijt is. De postduif weet precies hoe ver hij in elke windrichting is gegaan, maar hij weet niet meer hoe hij terug moet komen. De speler moet de postduif vertellen wat de kortste weg naar huis is. Gebruik de functie Terugreis om te bepalen of het antwoord van de speler juist is. De speler moet op elk moment kunnen besluiten om het spel niet verder te spelen.
De heenreis van de postduif wordt willekeurig bepaald door voor elke windrichting (noord, oost, zuid en west) een willekeurig getal te genereren van 0 tot en met 30. Dat getal geeft de afstand aan die de postduif in de betreffende windrichting heeft afgelegd.
Je bent vrij om te bepalen hoe de speler tijdens het spel Postduif de terugreis opgeeft, maar als de postduif naar het zuiden moet, dan kan hij niet ook naar het noorden moeten en andersom. Anders kan de gekozen route nooit de kortste zijn. Hetzelfde geldt voor oost en west. De invoer van de gebruiker moet wel geldig zijn. Je kunt gebruik maken van de Console API om het scherm te tekenen en om invoer van de gebruiker te lezen.
Schrijf een functie Postduif met daarin de code voor het spel. Deze functie wordt straks aangeroepen als het spel gestart moet worden. De functie moet true teruggeven als de speler het spel gewonnen heeft en anders false. Het prototype van de functie Postduif is:
bool Postduif();
Uiteindelijk moet je twee bestanden opleveren.
Je mag bij het programmeren van het spel ondersteunende functies schrijven. Zet deze functies in Postduif.cpp. Je hoeft ze niet op te nemen in het headerbestand omdat ze van buitenaf niet aangeroepen hoeven worden. Houd je bij het programmeren aan de algemene stijlregels (zie website).
Zet de twee bestanden in één zipbestand voordat je ze in Leo zet.