Programmeermethoden
Werkcollege 11: Vierde opgave I

Het elfde werkcollege van het vak Programmeermethoden vindt plaats in de week van 22 tot en met 26 november 2021.

Het eigenlijke werkcollege

Werk aan de vierde programmeeropgave! Enkele tips:
  1. Het pointerpracticum gedaan van het vorige werkcollege? (Een video van vorig jaar geeft eventueel nog wat extra uitleg.) En alle video's gekeken?
  2. Hergebruik (stukken van) het menu van de derde programmeeropgave, in het bijzonder functies als leesOptie en leesGetal.
  3. Splits in meerdere files, en produceer een makefile, zoals uitgelegd op sheet 4. Zie ook de opgave, en gebruik de files die daar genoemd worden. In Code::Blocks gaat dat iets anders, maar de file-splitsing is precies hetzelfde. Doe dit meteen vanaf het eerste begin!
    Eventueel: video (5 minuten) over projecten in Code::Blocks. Of lees deze wiki-pagina.
  4. Tijdens het college van 25 november wordt er ook gewerkt aan de klasse-definities. Welke klassen maak je, wat zijn hun member-variabelen en -functies?
  5. Bouw eerst een dubbelverbonden pointerlijst van de juiste lengte (de breedte van het bord): de bovenste rij van het bord. Gebruik de 2-de en 6-de pointer!
    Het is handig om deze functie zo te maken dat hij/zij de pointer naar zo'n lijst teruggeeft (*).
    Denk aan een constructor voor het bordvakje. Wat doet die met de 8 buurpointers? Wat moet er allemaal in dat vakje worden opgeslagen?
  6. Afdrukken? Maak snel een afdruk-functie die het hele speelveld netjes afdrukt.
  7. Bouw met één aanroep van (*) de bovenste rij van het bord. Plak er "hoogte-1" rijen onder aan vast: maak steeds zo'n rij met (*) en "rits" met de verticale (0 en 4) en diagonale (1, 3, 5 en 7) pointers. Onthoud de hele tijd een pointer naar de onderste rij van het bord, en uiteraard een pointer, de ingang van het bord, naar de bovenste rij. Let op alle pointer-verbindingen.
  8. Maak eventueel een memberfunctie die een pointer naar veld (i,j) teruggeeft.
    [Dit zou rond 26 november klaar moeten zijn ... en misschien wel wat meer ...]
  9. Maak nu het spel. Doe nog niet meteen alles. Lees in ieder geval hoogte, breedte en percentage in, en bouw het betreffende bord.
  10. Vul met ongeveer het juiste percentage kopjes koffie; gebruik rand(). Laat de afdrukfunctie vooralsnog alles zien, ook waar de kopjes koffie staan.
  11. Reken in alle vakjes het juiste aantal buurkoffies uit.
  12. Maak de menselijke zet. Laat de gebruiker dus een vakje kiezen, via de coordinaten, totdat er een niet eerder geopend vakje geselecteerd is.
  13. Maak in hoofd.cc een while-loop die het spel (voorlopig eeuwig) speelt.
  14. Laat het stoppen als de speler op een kop koffie stuit, of alle vrije vakjes zijn opgevraagd. Test steeds op kleine borden.
  15. Laat de speler ook een vakje markeren.
  16. Open recursief de buren van een vakje met 0 buurkoffies.
  17. Schrijf een randomzet, en geef die als optie aan de menselijke speler.
  18. Zorg ervoor dat de eerste zet nooit op een kop koffie terecht komt.
  19. Maak een volledige randomspeler.
  20. Maak een begin met de stapel.
    [En dit zou rond 3 december klaar moeten zijn ...]
  21. [en nu nog moeilijker:] Doe het stapel-gebeuren. Passen op dit onderdeel kost een punt. Zie het begin van de sheets over datastructuren.
  22. Als het goed is heb je hier een functie nodig die een kopie van een bord maakt.
  23. En destructoren? Ruim dus echt netjes alles op! Test eventueel met (Linux) valgrind of dat gelukt is.
  24. Gomoku Hoe gaat het "experiment" voor de grafiek in het verslag? Wat moet in die grafiek? Kijk bijvoorbeeld hoe lang een winnend/verliezend random spelletje duurt, bij verschillende bord-groottes. Speel daartoe een flink aantal spelletjes.
    Hoe maak je een mooi grafiekje? Stel je hebt een file stats.txt, zoiets als:
    1  7
    2  12
    3  14
    ...
    Gebruik nu gnuplot, en wel als volgt. Geef eerst het commando gnuplot, en dan (waarbij gnuplot> de prompt binnen gnuplot is):
        gnuplot> plot "stats.txt" with lines
    Er is een pdf-exportfunctie.
    En dan dat plaatje in je LaTeX-file binnenhalen.
    Je kunt gnuplot onder Windows eenvoudig installeren van hier (download versie 5.2.8, bijvoorbeeld). Binnen gnuplot moet je misschien het "loadpath" goed zetten, met zoiets als gunplot> set loadpath "C:\\JeMap\\" om de files die je wilt plotten te kunnen vinden. In Ubuntu is het ook eenvoudig te installeren. Op internet staat alles en meer over gnuplot, bijvoorbeeld daar (Wayback machine).
    Er mag ook een ander plot-programma gebruikt worden.

Huiswerk

De antwoorden op de opgaven worden tevens via WWW verspreid. Als er vragen over de opgaven zijn, laat het weten.