Programmeermethoden
Werkcollege 11: Vierde opgave I

Het elfde werkcollege van het vak Programmeermethoden vindt plaats in de week van 20 tot en met 24 november 2023.

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. 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 23 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 24 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 (voor beide spelers) in, en bouw het betreffende bord.
  10. Schrijf een functie die een zet op (i,j) uitvoert, mits deze is toegestaan (dus als het vakje leeg is).
  11. Schrijf een Booleaanse functie die bepaalt of het spel is afgelopen.
  12. Maak de menselijke zet. Laat de gebruiker dus een vakje kiezen, via de coordinaten, totdat er een "leeg" vakje geselecteerd is.
  13. Schrijf een randomzet.
  14. Maak in hoofd.cc een while-loop die het spel speelt.
  15. Als het goed is, kun je nu een volledig random spel spelen.
  16. [moeilijk] Maak een begin met het aantal vervolgpartijen, met recursie.
  17. Als het goed is heb je hier (en straks bij de stapel) een functie nodig die een kopie van een bord maakt.
    [En dit zou rond 1 december klaar moeten zijn ...]
  18. [en nu nog moeilijker:] Doe het stapel-gebeuren. Passen op dit onderdeel kost een halve punt. Zie het begin van de sheets over datastructuren.
  19. 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.
  20. 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.