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

Last change on this file since 278 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.