Programmeermethoden
Werkcollege 11: Vierde opgave I

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

Het eigenlijke werkcollege

Werk aan de vierde programmeeropgave! Enkele tips:
  1. Het pointerpracticum gedaan van het vorige werkcollege? (Een video van enige tijd terug geeft eventueel nog wat extra uitleg.) En alle video's nog eens 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. Doe dit meteen vanaf het eerste begin!
    In Code::Blocks gaat dat iets anders, maar de file-splitsing is precies hetzelfde. Eventueel: video (5 minuten) over projecten in Code::Blocks. Of lees deze wiki-pagina.
  4. Tijdens het college van 21 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 22 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 mens/computer 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. Schrijf een functie die een zet op (i,j) uitvoert, mits deze is toegestaan (dus als het vakje nog onbekend is).
  13. Schrijf een Booleaanse functie die bepaalt of het spel is afgelopen.
  14. Maak de menselijke zet. Laat de gebruiker dus een vakje kiezen, via de coordinaten, totdat er een nieuw vakje geselecteerd is.
  15. Schrijf een randomzet.
  16. Maak in hoofd.cc een while-loop die het spel speelt.
  17. Laat het stoppen als de speler op een kop koffie stuit, of alle vrije vakjes zijn opgevraagd. Test steeds op kleine borden.
  18. Laat de speler ook een vakje markeren.
  19. Open recursief de buren van een vakje met 0 buurkoffies.
  20. Zorg ervoor dat de eerste zet nooit op een kop koffie terecht komt.
  21. Als het goed is, kun je nu een volledig random spel spelen.
    [En dit zou rond 29 november klaar moeten zijn ...]
  22. Als het goed is heb je bij de stapel een functie nodig die een kopie van een bord maakt.
  23. [en nu nog moeilijker:] Doe het stapel-gebeuren. Passen op dit onderdeel kost een halve punt. Zie het begin van de sheets over datastructuren.
  24. En destructoren? Ruim dus echt netjes alles op! Tip: maak een "gewone" functie die het bord verwijdert. Test eventueel met (Linux) valgrind of dat gelukt is.
  25. 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 van de computer tegen zichzelf. Als het goed is, is het eenvoudig in het programma een for-loop te gebruiken om dit te doen.
    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 gnuplot> 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.