[2] | 1 | #include "NimSpel.h"
|
---|
| 2 | #include <iostream>
|
---|
| 3 | #include <cstdlib>
|
---|
| 4 |
|
---|
| 5 | using namespace std;
|
---|
| 6 |
|
---|
| 7 | NimSpel::NimSpel( ){
|
---|
| 8 | LaatsteZet_pt = NULL;
|
---|
| 9 | AantalZetten = 0;
|
---|
| 10 |
|
---|
| 11 | for(int i = 0; i < MaxStapels; i++) {
|
---|
| 12 | Stapels[i] = 0;
|
---|
| 13 | } //end for
|
---|
| 14 |
|
---|
| 15 | //Bedacht en getest algoritme
|
---|
| 16 | WinstArray[0][0] = 1;
|
---|
| 17 | WinstArray[0][1] = 0;
|
---|
| 18 | WinstArray[0][2] = 1;
|
---|
| 19 | WinstArray[1][0] = 1;
|
---|
| 20 | WinstArray[1][1] = 1;
|
---|
| 21 | WinstArray[1][2] = 0;
|
---|
| 22 | WinstArray[2][0] = 1;
|
---|
| 23 | WinstArray[2][1] = 1;
|
---|
| 24 | WinstArray[2][2] = 0;
|
---|
| 25 | for(int i = 3; i < MaxAantal + 1; i++){
|
---|
| 26 | WinstArray[i][0] = WinstArray[i-1][0] + WinstArray[i-2][0];
|
---|
| 27 | WinstArray[i][1] = WinstArray[i-1][2] + WinstArray[i-2][2];
|
---|
| 28 | WinstArray[i][2] = WinstArray[i][0] - WinstArray[i][1];
|
---|
| 29 | }
|
---|
| 30 | } //end NimSpel::NimSpel
|
---|
| 31 |
|
---|
| 32 |
|
---|
| 33 |
|
---|
| 34 | void NimSpel::BeginWaarden(int StapelNummer, int Aantal) {
|
---|
| 35 | for (int i = 0; i < StapelNummer; i++) {
|
---|
| 36 | Stapels[i] = Aantal;
|
---|
| 37 | } //end for
|
---|
| 38 | } //end NimSpel::BeginWaardes
|
---|
| 39 |
|
---|
| 40 |
|
---|
| 41 |
|
---|
| 42 | void NimSpel::PakWeg(int StapelNummer, int Aantal){
|
---|
| 43 | NimStapel * temp_pt; //
|
---|
| 44 | temp_pt = new NimStapel; //
|
---|
| 45 | temp_pt->VorigeZet_pt = LaatsteZet_pt; //Zetten onthouden
|
---|
| 46 | LaatsteZet_pt = temp_pt; //
|
---|
| 47 | LaatsteZet_pt->StapelNummer = StapelNummer; //
|
---|
| 48 | LaatsteZet_pt->AantalEraf = Aantal; //
|
---|
| 49 | AantalZetten++; //Max Zetten bijhouden
|
---|
| 50 | Stapels[StapelNummer] = Stapels[StapelNummer] - Aantal;
|
---|
| 51 | } //end NimSpel::NimSpel
|
---|
| 52 |
|
---|
| 53 |
|
---|
| 54 |
|
---|
| 55 | void NimSpel::ZetTerug(int AantalBeurten) {
|
---|
| 56 | int AantalStappen = AantalBeurten * 2;
|
---|
| 57 | NimStapel * temp_pt;
|
---|
| 58 | for(int i = 0; i < AantalStappen; i++) {
|
---|
| 59 | temp_pt = LaatsteZet_pt;
|
---|
| 60 | Stapels[temp_pt->StapelNummer] = Stapels[temp_pt->StapelNummer] + temp_pt->AantalEraf;
|
---|
| 61 | AantalZetten--;
|
---|
| 62 | LaatsteZet_pt = temp_pt->VorigeZet_pt;
|
---|
| 63 | delete temp_pt;
|
---|
| 64 | } //end for
|
---|
| 65 | } //end NimSpel::ZetTerug
|
---|
| 66 |
|
---|
| 67 | void NimSpel::Winnend(int * StapelNummer, int * Aantal) {
|
---|
| 68 | *StapelNummer = -1;
|
---|
| 69 | *Aantal = -1;
|
---|
| 70 | double KansMax, KansMet1, KansMet2 = 0; //tempvariablen, voor het bepalen van de max
|
---|
| 71 | for(int i = 0; i < MaxStapels; i++) {
|
---|
| 72 | if (Stapels[i] > 0) {
|
---|
| 73 | KansMet1 = WinstArray[Stapels[i]-1][2] / WinstArray[Stapels[i]-2][0];
|
---|
| 74 | }
|
---|
| 75 | else {
|
---|
| 76 | KansMet1 = 0;
|
---|
| 77 | }//end if
|
---|
| 78 |
|
---|
| 79 | if (Stapels[i] > 1) {
|
---|
| 80 | KansMet2 = WinstArray[Stapels[i]-2][2] / WinstArray[Stapels[i]-2][0];
|
---|
| 81 | }
|
---|
| 82 | else {
|
---|
| 83 | KansMet2 = 0;
|
---|
| 84 | }//end if
|
---|
| 85 |
|
---|
| 86 | if(KansMet1 > KansMax) {
|
---|
| 87 | *Aantal = 1;
|
---|
| 88 | *StapelNummer = i;
|
---|
| 89 | KansMax = KansMet1;
|
---|
| 90 | }//end if
|
---|
| 91 |
|
---|
| 92 | if(KansMet2 > KansMax) {
|
---|
| 93 | *Aantal = 2;
|
---|
| 94 | *StapelNummer = i;
|
---|
| 95 | KansMax = KansMet2;
|
---|
| 96 | }//end if
|
---|
| 97 | }//end for
|
---|
| 98 | }// end NimSpel::Winnnend
|
---|
| 99 |
|
---|
| 100 | void NimSpel::RandomZet(const int AantalStapels, int * StapelNummer, int * Aantal) {
|
---|
| 101 | do {
|
---|
| 102 | *StapelNummer = int( double(AantalStapels) * rand()/(RAND_MAX+1.0) );
|
---|
| 103 | *Aantal = 1 + int( double(2) * rand()/(RAND_MAX+1.0) );
|
---|
| 104 | } //end do
|
---|
| 105 | while(Stapels[*StapelNummer] - *Aantal < 0);
|
---|
| 106 | }//end NimSpel::RandomZet
|
---|
| 107 |
|
---|
| 108 |
|
---|
| 109 | void NimSpel::DrukAfConsole( ){
|
---|
| 110 | system("clear"); //OS Dependent Line, for windows use 'system("cls");' instead.
|
---|
| 111 | cout << endl << " : ";
|
---|
| 112 | for(int i = 0; i < MaxStapels; i++) {
|
---|
| 113 | if (i < 10) {cout << " " << i << " | ";} else { cout << i << " | ";}
|
---|
| 114 | }//end for
|
---|
| 115 | for(int i = 1; i <= MaxAantal; i++) {
|
---|
| 116 | cout << endl;
|
---|
| 117 | if (i < 10) {cout << " " << i << " : ";} else { cout << i << " : ";}
|
---|
| 118 | for(int j = 0; j < MaxStapels; j++) {
|
---|
| 119 | if (i <= Stapels[j]) { cout << "XX | ";} else { cout << " | ";}
|
---|
| 120 | }//end for
|
---|
| 121 | }//end for
|
---|
| 122 | cout << endl << endl;
|
---|
| 123 | }//end NimSpelDrukAf
|
---|
| 124 |
|
---|
| 125 | bool NimSpel::ZetOnmogelijk(int StapelNummer, int AantalEraf) {
|
---|
| 126 | if ((Stapels[StapelNummer] - AantalEraf) < 0) {
|
---|
| 127 | return true;
|
---|
| 128 | }
|
---|
| 129 | else {
|
---|
| 130 | return false;
|
---|
| 131 | }
|
---|
| 132 | } //end NimSpel::ZettMogelijk
|
---|
| 133 |
|
---|
| 134 | bool NimSpel::Afgelopen( ){
|
---|
| 135 | for(int i = 0; i < MaxStapels; i++) {
|
---|
| 136 | if (Stapels[i] > 0) { //als er nog ergens waardes aanwezig zijn
|
---|
| 137 | return (false);
|
---|
| 138 | }//end if
|
---|
| 139 | }//end if
|
---|
| 140 | return (true);
|
---|
| 141 | }//end NimSpel::Afgelopen
|
---|
| 142 |
|
---|