#include "NimSpel.h" #include #include using namespace std; NimSpel::NimSpel( ){ LaatsteZet_pt = NULL; AantalZetten = 0; for(int i = 0; i < MaxStapels; i++) { Stapels[i] = 0; } //end for //Bedacht en getest algoritme WinstArray[0][0] = 1; WinstArray[0][1] = 0; WinstArray[0][2] = 1; WinstArray[1][0] = 1; WinstArray[1][1] = 1; WinstArray[1][2] = 0; WinstArray[2][0] = 1; WinstArray[2][1] = 1; WinstArray[2][2] = 0; for(int i = 3; i < MaxAantal + 1; i++){ WinstArray[i][0] = WinstArray[i-1][0] + WinstArray[i-2][0]; WinstArray[i][1] = WinstArray[i-1][2] + WinstArray[i-2][2]; WinstArray[i][2] = WinstArray[i][0] - WinstArray[i][1]; } } //end NimSpel::NimSpel void NimSpel::BeginWaarden(int StapelNummer, int Aantal) { for (int i = 0; i < StapelNummer; i++) { Stapels[i] = Aantal; } //end for } //end NimSpel::BeginWaardes void NimSpel::PakWeg(int StapelNummer, int Aantal){ NimStapel * temp_pt; // temp_pt = new NimStapel; // temp_pt->VorigeZet_pt = LaatsteZet_pt; //Zetten onthouden LaatsteZet_pt = temp_pt; // LaatsteZet_pt->StapelNummer = StapelNummer; // LaatsteZet_pt->AantalEraf = Aantal; // AantalZetten++; //Max Zetten bijhouden Stapels[StapelNummer] = Stapels[StapelNummer] - Aantal; } //end NimSpel::NimSpel void NimSpel::ZetTerug(int AantalBeurten) { int AantalStappen = AantalBeurten * 2; NimStapel * temp_pt; for(int i = 0; i < AantalStappen; i++) { temp_pt = LaatsteZet_pt; Stapels[temp_pt->StapelNummer] = Stapels[temp_pt->StapelNummer] + temp_pt->AantalEraf; AantalZetten--; LaatsteZet_pt = temp_pt->VorigeZet_pt; delete temp_pt; } //end for } //end NimSpel::ZetTerug void NimSpel::Winnend(int * StapelNummer, int * Aantal) { *StapelNummer = -1; *Aantal = -1; double KansMax, KansMet1, KansMet2 = 0; //tempvariablen, voor het bepalen van de max for(int i = 0; i < MaxStapels; i++) { if (Stapels[i] > 0) { KansMet1 = WinstArray[Stapels[i]-1][2] / WinstArray[Stapels[i]-2][0]; } else { KansMet1 = 0; }//end if if (Stapels[i] > 1) { KansMet2 = WinstArray[Stapels[i]-2][2] / WinstArray[Stapels[i]-2][0]; } else { KansMet2 = 0; }//end if if(KansMet1 > KansMax) { *Aantal = 1; *StapelNummer = i; KansMax = KansMet1; }//end if if(KansMet2 > KansMax) { *Aantal = 2; *StapelNummer = i; KansMax = KansMet2; }//end if }//end for }// end NimSpel::Winnnend void NimSpel::RandomZet(const int AantalStapels, int * StapelNummer, int * Aantal) { do { *StapelNummer = int( double(AantalStapels) * rand()/(RAND_MAX+1.0) ); *Aantal = 1 + int( double(2) * rand()/(RAND_MAX+1.0) ); } //end do while(Stapels[*StapelNummer] - *Aantal < 0); }//end NimSpel::RandomZet void NimSpel::DrukAfConsole( ){ system("clear"); //OS Dependent Line, for windows use 'system("cls");' instead. cout << endl << " : "; for(int i = 0; i < MaxStapels; i++) { if (i < 10) {cout << " " << i << " | ";} else { cout << i << " | ";} }//end for for(int i = 1; i <= MaxAantal; i++) { cout << endl; if (i < 10) {cout << " " << i << " : ";} else { cout << i << " : ";} for(int j = 0; j < MaxStapels; j++) { if (i <= Stapels[j]) { cout << "XX | ";} else { cout << " | ";} }//end for }//end for cout << endl << endl; }//end NimSpelDrukAf bool NimSpel::ZetOnmogelijk(int StapelNummer, int AantalEraf) { if ((Stapels[StapelNummer] - AantalEraf) < 0) { return true; } else { return false; } } //end NimSpel::ZettMogelijk bool NimSpel::Afgelopen( ){ for(int i = 0; i < MaxStapels; i++) { if (Stapels[i] > 0) { //als er nog ergens waardes aanwezig zijn return (false); }//end if }//end if return (true); }//end NimSpel::Afgelopen