source: liacs/alg/bantumi/branches/spel1.cc@ 399

Last change on this file since 399 was 2, checked in by Rick van der Zwet, 15 years ago

Initial import of data of old repository ('data') worth keeping (e.g. tracking
means of URL access statistics)

  • Property svn:executable set to *
File size: 6.9 KB
Line 
1#include <iostream>
2
3using namespace std;
4
5float Zetten = 0;
6// het aantal vakjes dat een veld moet beslaan, hier zit de bank
7//***niet*** bij inbegrepen
8
9//Bord 1
10const int speelVakjes = 3;
11int spelerLaag[speelVakjes + 1] = {3, 3, 3, 0 };
12int spelerHoog[speelVakjes + 1] = {3, 3, 3, 0 };
13
14//Bord2
15//const int speelVakjes = 4;
16//int spelerLaag[speelVakjes + 1] = {3, 2, 2, 2, 0 };
17//int spelerHoog[speelVakjes + 1] = {3, 2, 2, 2, 0 };
18
19//Bord3
20//const int speelVakjes = 4;
21//int spelerLaag[speelVakjes + 1] = {2, 2, 2, 2, 0 };
22//int spelerHoog[speelVakjes + 1] = {2, 2, 2, 2, 0 };
23
24const int totaalAantalVakjes = (speelVakjes + 1) * 2;
25
26// een vakje bevat de gegevens van zijn buren, en van de overkant.
27// en de inhoud natuurlijk
28class vakje {
29 public:
30 vakje * volgende;
31 vakje * vorige;
32 vakje * overkant;
33 int inhoud;
34};
35
36//vakjesarray globaal gedifineerd om zo recursie mogelijk te maken
37//voorbeeld, bij speelVakjes = 4;
38//0,1,2,3 zijn de normale vakjes, 4 is de bank
39//Speler 1 = arraySpeler[0]
40//Speler 2 = arraySpeler[1]
41vakje * arraySpeler[2][speelVakjes + 1];
42
43//score
44int winstMax = 0;
45int winstMin = 10000;
46int gelijkMax = 0;
47int gelijkMin = 10000;
48
49//het creeren van het speelveld.
50//de bank staat op positie speelVakjes
51void createfield() {
52 vakje * huidigeLaag = new vakje;
53 vakje * huidigeHoog = new vakje;
54
55//vakjes maken
56 for( int vakNummer = 0; vakNummer < speelVakjes; vakNummer++ ) {
57 arraySpeler[0][vakNummer] = huidigeLaag;
58 huidigeLaag->inhoud = spelerLaag[vakNummer];
59 huidigeLaag->volgende = new vakje;
60 huidigeLaag->volgende->vorige = huidigeLaag;
61 huidigeLaag = huidigeLaag->volgende;
62
63 arraySpeler[1][vakNummer] = huidigeHoog;
64 huidigeHoog->inhoud = spelerHoog[vakNummer];
65 huidigeHoog->volgende = new vakje;
66 huidigeHoog->volgende->vorige = huidigeHoog;
67 huidigeHoog = huidigeHoog->volgende;
68 };
69
70//overkant pointer aanmaken
71 for( int vakNummer = 0; vakNummer < speelVakjes; vakNummer++ ) {
72 arraySpeler[0][vakNummer]->overkant = arraySpeler[1][speelVakjes-1-vakNummer];
73 arraySpeler[1][speelVakjes-1-vakNummer]->overkant = arraySpeler[0][vakNummer];
74 };
75
76//banken aanmaken
77 arraySpeler[0][speelVakjes] = huidigeLaag;
78 arraySpeler[0][speelVakjes]->inhoud = spelerLaag[speelVakjes];
79 arraySpeler[0][speelVakjes]->volgende = arraySpeler[1][0];
80 arraySpeler[0][speelVakjes]->overkant = NULL;
81 arraySpeler[1][0]->vorige = arraySpeler[0][speelVakjes];
82
83 arraySpeler[1][speelVakjes] = huidigeHoog;
84 arraySpeler[1][speelVakjes]->inhoud = spelerHoog[speelVakjes];
85 arraySpeler[1][speelVakjes]->volgende = arraySpeler[0][0];
86 arraySpeler[1][speelVakjes]->overkant = NULL;
87 arraySpeler[0][0]->vorige = arraySpeler[1][speelVakjes];
88}
89
90
91//-met een pointer het spelletje verwerken.
92//-dmv van een modulo trucje ernaar kijken of een zet in de eigen vakjes
93//eindigd
94//geef terug of de speler nog een keertje mag.
95vakje * doeZet( bool & tmpSpeler, const int begin, const int aantal,
96 int & overkant ) {
97 int tmpInt = (begin + aantal) % (totaalAantalVakjes);
98 vakje * tmpPointer = arraySpeler[tmpSpeler][begin];
99
100 //doen van de echte zetten
101 tmpPointer->inhoud = 0;
102 for( int i = 0; i < aantal; i++ ) {
103 tmpPointer = tmpPointer->volgende;
104 tmpPointer->inhoud++;
105 };
106
107 //controleren bank, dan mag de speler nog een keer
108 if( tmpPointer == arraySpeler[tmpSpeler][speelVakjes] ) {
109 }
110 else {
111 //controleren of inhoud 1 is (bestemmingsvakje was dan 0)
112 if( tmpPointer->inhoud == 1 ) {
113 //controleren of vakje in het eigen domein ligt, zo ja stelen ;-)
114 if((0 <= tmpInt) and (tmpInt < speelVakjes)) {
115 overkant = tmpPointer->overkant->inhoud;
116 tmpPointer->overkant->inhoud = 0;
117 tmpPointer->inhoud = 0;
118 arraySpeler[tmpSpeler][speelVakjes]->inhoud += (overkant + 1);
119 }
120 }
121 tmpSpeler = not(tmpSpeler);
122 }
123 return(tmpPointer);
124}
125
126
127
128//het terugzetten van een zet
129//tmpPointer is de pointer naar eind die langzaam terugloopt
130void zetTerug(const bool speler, vakje * tmpPointer, const int aantal,
131const int overkantAantal ) {
132// //controleren of we met een overkant zet te maken hadden
133 if( tmpPointer->inhoud == 0 ) {
134 tmpPointer->inhoud++;
135 tmpPointer->overkant->inhoud = overkantAantal;
136 arraySpeler[speler][speelVakjes]->inhoud -= (overkantAantal + 1);
137 }
138 //netjes de steentjes in tegengestelde richting terug leggen
139 for( int i = 0; i < aantal; i++ ) {
140 tmpPointer->inhoud--;
141 tmpPointer = tmpPointer->vorige;
142 }
143 //orspronkelijke aantal weer op het begin vakje leggen
144 tmpPointer->inhoud = aantal;
145}
146
147
148// print het eind resultaat
149void resultaat( ) {
150cout << "-------------------------------" << endl;
151cout << "Min Winst : " << winstMin <<endl;
152cout << "Min Gelijk: " << gelijkMin <<endl;
153cout << "Max Winst : " << winstMax <<endl;
154cout << "Max Gelijk: " << gelijkMax <<endl;
155cout << "-------------------------------" << endl;
156cout << endl;
157}
158
159
160//kijken of wat de eindsituatie opleverd
161void checkScore( const int zetten ) {
162 Zetten++;
163 int scoreSpelerEEN = arraySpeler[0][speelVakjes]->inhoud;
164 int scoreSpelerTWEE = arraySpeler[1][speelVakjes]->inhoud;
165 for( int i = 0; i < speelVakjes; i++ ) {
166 scoreSpelerEEN += arraySpeler[0][i]->inhoud;
167 scoreSpelerTWEE += arraySpeler[1][i]->inhoud;
168 }
169 if( scoreSpelerEEN == scoreSpelerTWEE ) {
170 if( zetten < gelijkMin ) {
171 gelijkMin = zetten;
172 }
173 if( zetten > gelijkMax ) {
174 gelijkMax = zetten;
175 }
176 }
177 else {
178 if( zetten < winstMin ) {
179 winstMin = zetten;
180 }
181 if( zetten > winstMax ) {
182 winstMax = zetten;
183 }
184 }
185}
186
187
188//controleer of het spel afgelopen is voor een speler
189bool checkEnd_speler( const bool speler ) {
190 for( int i = 0; i < speelVakjes; i++ ) {
191 if( arraySpeler[speler][i]->inhoud != 0 ) {
192 return(false);
193 }
194 }
195 return(true);
196}
197
198
199//controleer of het spel afgelopen is. Controleer dit eerst voor speler
200//0, als deze nog niet afgelopen is controleer dan speler 1
201bool checkEnd( ) {
202 if( checkEnd_speler(0) ) {
203 return(true);
204 }
205 else {
206 return(checkEnd_speler(1));
207 }
208}
209
210
211//Lets play a game
212//eerst wijst de tmpPointer het begin vakje aan, dan wordt ie
213//getransformeerd naar het eind vakje (beginvakje voor terugzetten)
214void runGame(const bool spelerAanZet, int zetNummer ) {
215 //controleer of het afgelopen is
216 if( checkEnd( ) ) {
217 checkScore( zetNummer );
218 return;
219 }
220 else {
221 int aantal;
222 int overkantAantal = 0;
223 vakje * tmpPointer;
224 bool volgendeSpeler;
225 zetNummer++;
226 for( int huidigeVakje = 0; huidigeVakje < speelVakjes; huidigeVakje++ ) {
227 if( arraySpeler[spelerAanZet][huidigeVakje]->inhoud != 0 ) {
228 volgendeSpeler = spelerAanZet;
229 aantal = arraySpeler[spelerAanZet][huidigeVakje]->inhoud;
230 tmpPointer = doeZet(volgendeSpeler, huidigeVakje, aantal, overkantAantal );
231 runGame( volgendeSpeler, zetNummer );
232 zetTerug( spelerAanZet, tmpPointer, aantal, overkantAantal );
233 }
234 }
235 }
236}
237
238
239
240int main ( ) {
241 createfield( );
242 runGame( 0, 0 );
243 resultaat( );
244}
Note: See TracBrowser for help on using the repository browser.