Wat ik wilde doen is het spelletje Yahtzee implementeren. Ik heb hiervoor al drie classes aangemaakt:
1) de klasse Speler
Dit is een dubbel gelinkte lijst. De waarden van 1,2,3,4,5,6,tripple,carre,...,chance worden standaard allemaal op 0 gezet bij het aanmaken van de lijst. Dit betekent dat de vakjes eigenlijk nog open zijn, en de Speler er nog mag in schrijven. Als een speler een vakje wil doorstrepen (wanneer hij bv. geen enkele legale zet meer kan doen), dan zal er in dat vakje een zodanig hoge score geschreven worden die men niet met dobbelstenen kan behalen (bij elk vakje dezelfde hoge score). Alleen wanneer een vakje nog niet ingevuld of doorstreept is, kan de speler daar nog iets invullen. Als de speler iets op een leeg vakje wil invullen, zal eerst nagegaan worden of dat wel kan. Je kan bv. niets invullen op het vakje tripple, als je geen drie dobbelstenen hebt die gelijk aan elkaar zijn. Als het legaal is worden vervolgens de punten berekend en wordt de score ingevuld. Als het niet legaal is, wordt de speler gevraagd om iets anders te doen. Hij kan dan bv iets anders invullen of iets doorstrepen.
Code: Select all
Speler* = POINTER TO SpelerDesc;
SpelerDesc* =
RECORD
nr : INTEGER;
naam : String;
1 : INTEGER;
2 : INTEGER;
3 : INTEGER;
4 : INTEGER;
5 : INTEGER;
6 : INTEGER;
triple : INTEGER;
carre : INTEGER;
fullhouse : INTEGER;
kleinestr : INTEGER;
grotestr : INTEGER;
yahtzee : INTEGER;
chance : INTEGER;
next : Speler;
prev : Speler;
END;
De methodes die hiervoor al gepland zijn zijn:
- Create (de lijst aanmaken)
- Add (speler toevoegen)*
* de Add communiceert op zijn beurt met de SpelLeider om telkens bij het toevoegen van een nieuwe speler, het aantalspelers te verhogen.
2) De klasse SpelLeider
Deze klasse bevat eigenlijk de spelinfo. Het aantal spelers houd ik bij om te bepalen welke speler aan de beurt is. Het spel begint steeds bij de speler met het nummer 1. Vervolgens is het aan speler 2 enz. Wanneer we ten slotte aan de speler zijn aangekomen met een spelernummer die gelijk is aan het aantalspelers, weten we dat het de beurt daarna terug aan speler 1 is.
Via ronde weten we hoe ver het spel al gevorderd is, een yahtzee spel eindigt na een vast aantal ronden. Wanneer het aantal ronden bereikt is, eindigt het spel en gaan we naar een eindprocedure.
Code: Select all
SpelLeiderDesc* =
RECORD
aantalspelers : INTEGER;
speleraandebeurt : INTEGER;
ronde : INTEGER;
END;
3) De klasse DobbelSteen
Deze klasse houdt enkel de dobbelstenen bij die net geworpen zijn. Door het sturen van berichten naar een object aangemaakt volgens de richtlijnen van deze klasse, kan men te weten komen welke waarde dobbelsteen1, dobbelsteen2, dobbelsteen3, dobbelsteen4 en dobbelsteen5 hadden bij de laatste worp.
Code: Select all
DobbelSteenDesc* =
RECORD
1 : INTEGER;
2 : INTEGER;
3 : INTEGER;
4 : INTEGER;
5 : INTEGER;
END;
De methodes die hiervoor gepland zijn zijn:
- Gooi (de dobbelsteen gooit zich als het ware zelf)
Om terug te komen op de vraag. Bij Yahtzee kan elke speler 3 pogingen doen (misschien moet ik het aantal gedane pogingen ook opslaan in de spelleider, en dit telkens terug resetten). Wanneer men geworpen heeft, kiest de speler zelf, welke dobbelstenen die hij opnieuw werpt, de andere blijven liggen.
Wat jullie voorstellen om het fractionele deel weg te laten vallen vind ik echt geweldig en was er zelf niet opgekomen. Ik ga dat nu doen en dan verder proberen mijn Yahtzee in elkaar te steken. Als jullie nog tips hebben zijn deze altijd welkom
. Het OO programmeren is nieuw voor me en ben nu aan het uitzoeken had je het best gebruikt.
EDIT: ik zie net dat velden met een getal vooraan niet zijn toegestaan in Oberon. Ik heb dus de velden van spelers een andere naam moeten geven.