source: liacs/pm/nim-v4/nimSpel.cc@ 3

Last change on this file since 3 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.2 KB
Line 
1/*programeeropdracht 4 The Nim Game
2 *Pascal de Vos (ID = 0446916)
3 *Rick van der Zwet (ID = 0433373)
4 *file: nimSpel.cc
5 *de is het rekengedeelte van mainForm.cc, hierin kan makkelijk en snel
6 *gegevens worden verwerkt en oplossingen worden doorgerekend
7 */
8#include "nimSpel.h"
9#include "const.h"
10#include <cstdlib>
11
12using namespace std;
13NimSpel::NimSpel( ){ //constructor
14 laatsteZet_pt = NULL;
15 aantalZetten = 0;
16} //end NimSpel::NimSpel
17
18
19
20//aantal beurten terug geven
21int NimSpel::aantalBeurten( ){
22 return( aantalZetten/2 );
23} //end NimSpel::aantalBeurten
24
25
26
27//aantal op stapel teruggeven
28int NimSpel::aantalOpStapel( const int nummer ){
29 return( stapel[nummer] );
30} //end NimSpel::aantalOpStapel
31
32
33
34//aantal actieve stapels teruggeven
35int NimSpel::actieveStapels( ){
36 return( aantalStapels );
37} //end NimSpel::actieveStapels
38
39bool NimSpel::afgelopen( ){ //kijken of spel afgelopen is
40 for( int i = 0; i < MAX_STAPELS; i++ ) {
41 if( stapel[i] > 0 ) { //als er nog ergens waardes aanwezig zijn
42 return( false );
43 }//end if
44 }//end if
45 return( true );
46}//end NimSpel::afgelopen
47
48
49
50//zet de beginwaarden van de stapel
51void NimSpel::beginWaarden( const int stapelAantal, const int aantal) {
52 zetTerug(aantalZetten/2); //terugzetten om oude pointer naar NULL te
53 //helpen en alles netjes de destructen
54 for( int i = 0; i < stapelAantal; i++ ) {
55 stapel[i] = aantal;
56 aantalStapels = stapelAantal;
57 } //end for
58} //end NimSpel::beginWaarden
59
60
61
62//creer een nieuwe zet voor de computer
63void NimSpel::computerZet( const bool niveauComputer, int & stapelNummer,
64 int & aantal) {
65 int tmpStapelNummer = -1;
66 int tmpAantal = -1;
67
68 if( niveauComputer ) { //winnend spelen als dat verwacht wordt
69 winnend( tmpStapelNummer, tmpAantal );
70 } //end if
71
72 if( tmpAantal == -1 ) {
73 //hij zal in deze if komen als er geen winnnende keuzes zijn
74 randomZet( tmpStapelNummer, tmpAantal );
75 } //end if
76
77 stapelNummer = tmpStapelNummer;
78 aantal = tmpAantal;
79} //end NimSpel::computerZet
80
81
82
83//doe een random zet, die wel in de range van een stapel aantal ligt
84void NimSpel::randomZet( int & stapelNummer, int & aantal ) {
85 do {
86 stapelNummer = int( double(aantalStapels) * rand()/(RAND_MAX+1.0) );
87 aantal = 1 + int( double(2) * rand()/(RAND_MAX+1.0) );
88 } //end do
89 while( stapel[stapelNummer] - aantal < 0 );
90}//end NimSpel::randomZet
91
92
93
94//verwerk een zet
95void NimSpel::pakWeg( const int stapelNummer, const int aantal ){
96 NimStapel * temp_pt; //
97 temp_pt = new NimStapel; //
98 temp_pt->vorigeZet_pt = laatsteZet_pt; //Zetten onthouden
99 laatsteZet_pt = temp_pt; //
100 laatsteZet_pt->stapelNummer = stapelNummer; //
101 laatsteZet_pt->aantalEraf = aantal; //
102 aantalZetten++; //Max Zetten bijhouden
103 stapel[stapelNummer] = stapel[stapelNummer] - aantal;
104} //end NimSpel::pakweg
105
106
107//Controleer of er precies 1 stapel is met een waarde lager dan 2
108//Begin standaard met true en controleer op foute waardes
109bool NimSpel::winstAfgelopen() {
110 bool einde = true;
111 int stapelsMetWaarde = 0;
112 int totaalWaarde = 0;
113 for( int ctr=0; ctr < aantalStapels; ctr++ ) {
114 if( stapel[ctr] > 0 ) {
115 totaalWaarde = totaalWaarde + stapel[ctr];
116 stapelsMetWaarde++;
117 if( (totaalWaarde > 2) or (stapelsMetWaarde > 1) ) {
118 einde = false;
119 break;
120 } //end if
121 } //end if not 0
122 } //end loop
123 return(einde);
124} //end NimSpel::winstAfgelopen
125
126
127//Controleer of een pad zeker winnend is
128bool NimSpel::winstRecur( bool aanBeurt ) {
129 bool winst1 = false;
130 bool winst2 = false;
131 aanBeurt = not(aanBeurt);
132 if( winstAfgelopen() ) {
133 if( aanBeurt ) {
134 return(true);
135 }
136 else {
137 return(false);
138 }
139 }
140 else {
141 for( int ctr=0; ctr < aantalStapels; ctr++ ) {
142 if( stapel[ctr] > 0 ) {
143 if( stapel[ctr] > 1 ) {
144 stapel[ctr] = stapel[ctr] - 2;
145 winst2 = winstRecur( aanBeurt );
146 stapel[ctr] = stapel[ctr] + 2;
147 } //end if (test met 2)
148 stapel[ctr] = stapel[ctr] - 1;
149 winst1 = winstRecur( aanBeurt );
150 stapel[ctr] = stapel[ctr] + 1;
151 } //end if (groter dan 0)
152 if( winst1 & winst2 ) {
153 return(true);
154 } //end if (winst test)
155 } //end for loop
156 return(false);
157 }
158} //end NimSpel::winstRecur
159
160
161//Deze functie creert alle mogelijk vervolg zetten, en test deze op
162//winnend
163void NimSpel::winnend( int & stapelNummer, int & aantal ) {
164 bool winst;
165 if( winnendEnable() ) {
166 for( int ctr=0; ctr < aantalStapels; ctr++ ) {
167 if( stapel[ctr] > 0 ) {
168 if( stapel[ctr] > 1) {
169 stapel[ctr] = stapel[ctr] - 2;
170 winst = winstRecur( "false" );
171 stapel[ctr] = stapel[ctr] + 2;
172 if( winst ) {
173 stapelNummer = ctr;
174 aantal = 2;
175 return;
176 } //winst 2
177 }
178 stapel[ctr] = stapel[ctr] - 1;
179 winst = winstRecur( "false" );
180 stapel[ctr] = stapel[ctr] + 1;
181 if( winst ) {
182 stapelNummer = ctr;
183 aantal = 1;
184 return;
185 } //winst 1
186 } //not null
187 } //loop for
188 stapelNummer = -1;
189 aantal = -1;
190 }
191 else {
192 randomZet( stapelNummer, aantal );
193 }
194} //end NimSpel::winnnend
195
196
197bool NimSpel::winnendEnable() {
198 int aantal = 0;
199 for( int ctr=0; ctr < aantalStapels; ctr++ ) {
200 aantal = aantal + stapel[ctr];
201 if( aantal > START_WINNEND ) {
202 return(false);
203 } //end if
204 } //end for
205 return(true);
206} //end NimSpel::winnendEnable
207
208
209
210//zet beurten terug
211void NimSpel::zetTerug( const int aantalBeurten ) {
212 int aantalStappen = aantalBeurten * 2;
213 NimStapel * temp_pt;
214 for( int i = 0; i < aantalStappen; i++ ) {
215 temp_pt = laatsteZet_pt;
216 stapel[temp_pt->stapelNummer] =
217 ( stapel[temp_pt->stapelNummer] + temp_pt->aantalEraf );
218 aantalZetten--;
219 laatsteZet_pt = temp_pt->vorigeZet_pt;
220 delete temp_pt;
221 } //end for
222} //end NimSpel::ZetTerug
223
224
225
226//kijk of je niet meer stokjes van een stapel afpakt als dat er liggen
227bool NimSpel::zetMogelijk( const int stapelNummer,
228 const int aantalPakken ) {
229 if( (stapel[stapelNummer] - aantalPakken) < 0 ) {
230 return false;
231 }
232 else {
233 return true;
234 } //end if
235} //end NimSpel::zetMogelijk
236
237
238
Note: See TracBrowser for help on using the repository browser.