![]() |
||||
|
Spreekuur in zalen 302 ... 309:
dinsdag 18, woensdag 19, donderdag 20,
dinsdag 25, woensdag 26, donderdag 27 november,
dinsdag 2, woensdag 3, donderdag 4 en vrijdag 5 december 2014, van circa
15:30 tot 17:00 uur.
Voor I&E-studenten (Den Haag)
is er een vragenmiddag in zaal Paleistuin/Malieveld op donderdag 4 december 2014, 14:00-17:00 uur.
Voor deze programmeeropgave gaan we het spel Mastermind
programmeren.
De ene speler (Klaas) neemt een code in gedachten die dan door de
andere (Henk) geraden moet worden, liefst in zo weinig mogelijk beurten.
De code bestaat uit een N-tal verschillende "kleuren" = getallen,
waarbij de kleuren uit de verzameling {1,2,...,K}
gekozen zijn. De volgorde van de kleuren is van belang.
Hierbij zijn N en K ≥ N maximaal 10 (een const int).
Henk doet steeds een gok; een gok bestaat uit een
N-tal verschillende getallen uit bovengenoemde verzameling.
Klaas moet dan vertellen hoeveel getallen er
op de juiste plaats staan ("zwart"), en hoeveel getallen er goed zijn,
maar zich op een verkeerde plaats bevinden ("wit").
Het is de bedoeling een klasse mastermind te maken, die onder meer memberfuncties heeft als drukaf en doeeengok. Uiteraard heeft deze klasse ook een constructor en een destructor. Verder moeten gedane vragen met behulp van een stapel ongedaan gemaakt kunnen worden, zie verderop.
De mogelijkheid bestaat om gebruik te maken van een aantal voorbeeldfiles, van waaruit de opgave stap voor stap kan worden gedaan. Liefhebbers mogen ook eigen files met andere functies maken, maar gesplitst moet er worden, en niet-gebruik van onderstaande files heeft in principe geen invloed op het cijfer. De files zijn (zie verderop voor gebruik met Code::Blocks):
We spelen het spel als volgt. Allereerst wordt bepaald of Henk mens of computer is; dit levert dus al twee varianten. Dan moeten N en K gekozen worden, beide maximaal 10. Tot slot zijn er voor de computer strategieën mogelijk; een mens speelt naar eigen inzicht, waarbij wel wordt gecontroleerd of alle getallen in een gok verschillen.
De te implementeren (en te kiezen) strategieën zijn:
Schrijf een constructor voor de klasse mastermind die een dubbelverbonden pointerstructuur aanlegt, waarbij ieder vakje, naast een array code als inhoud, tevens twee pointers naar voorganger en opvolger heeft. In deze lijst komen de toegestane codes.
[Als dit gedeelte ontbreekt, kost dat 1 punt:] Alle "gokken" moeten op een stapel worden bijgehouden, en gokken van de menselijke speler kunnen daarmee teruggenomen worden. Zodra de speler een gok doet, wordt de gehele oude toestand opgeslagen. Deze wordt, als de speler dat wil, weer hersteld. Liefhebbers: een copy constructor.
Het is de bedoeling om een zes/achttal files te produceren:
de eerste bevat main en het menutje,
de tweede (zeg mastermind.h) bevat de klasse-definitie voor mastermind,
en de derde (zeg mastermind.cc) bevat de functies uit die klasse.
Evenzo zijn er, indien van toepassing,
files stapel.h en stapel.cc.
En dan natuurlijk perm.h en perm.cc.
Stuur ook de makefile mee.
Code::Blocks-gebruikers: doe dit gedeelte liever op een Linux-machine.
Maar het kan wel: open een nieuw project via
"File -- New project -- Empty project", vul wat in,
en voeg de losse files toe via "Project -- Add files",
en daarna het project compileren op de gebruikelijke manier.
Of, op eigen risco, lees
over projecten.
Opmerkingen
Gebruik geschikte (member)functies.
Bij deze opgave mogen wederom bij
elke functie (zelfs main) tussen begin-{ en
eind-} hooguit circa 30 niet al te volle regels staan!
Elke functie dient van commentaar voorzien te zijn.
Let op goed parametergebruik: alle parameters, met uitzondering van membervariabelen, in de heading doorgeven, en de
variabele-declaraties zowel bij main als bij de
andere functies aan het begin.
De enige te gebruiken headerfiles zijn in principe
iostream, cstdlib en ctime
(voor de random-generator).
Zeer ruwe indicatie voor de lengte van de gezamenlijke C++-files: 500 regels.
Denk aan het infoblokje.
Uiterste inleverdatum: vrijdag 5(!) december 2014, 17:00 uur.
Manier van inleveren:
Overal duidelijk datum en namen van de (maximaal twee) makers vermelden,
in het bijzonder als commentaar in de eerste regels van de C++-code.
Het verslag (uiteraard weer in LaTeX,
zie de eerdere opgaven) moet het volgende bevatten: een zeer korte
beschrijving van het programma,
een beschrijving van punten waarop het programma faalt (indien van toepassing),
en een tabel met gewerkte uren, uitgesplitst per week en per persoon.
En een referentie betreffende Mastermind. En tekst en
grafiekjes (zie het bijbehorende werkcollege voor tips)
die laten zien hoe de verschillende strategieën zich verhouden,
bij variërende N en K.
Beantwoord ook de volgende vraag:
is het verstandig om altijd alleen toegestane codes te gokken?