[2] | 1 | #include <iostream>
|
---|
| 2 | #include <ctime>
|
---|
| 3 | #include <climits>
|
---|
| 4 | using namespace std;
|
---|
| 5 |
|
---|
| 6 |
|
---|
| 7 | // voorbeeld: 1/2/3/4
|
---|
| 8 | // x = (randi()/250) + 1;
|
---|
| 9 | int randi () { // tussen 0 en 999
|
---|
| 10 | static int getal = time (NULL) % 1000;
|
---|
| 11 | getal = ( 621 * getal + 1 ) % 1000;
|
---|
| 12 | return getal;
|
---|
| 13 | }
|
---|
| 14 |
|
---|
| 15 | //'randomgetallen' volgens de functie x_nieuw=(a*x_oud+c)%m
|
---|
| 16 | //om te zorgen dat getallen dubbel voorkomen wordt OudGetal erbijopgeteld
|
---|
| 17 | //(de tijd is te langzaam ;-) )
|
---|
| 18 | //de tijd wordt gebruikt om elke keer andere getallen te laten weergeven
|
---|
| 19 | long randomgetal(long *OudGetal) {
|
---|
| 20 | int a = 221;
|
---|
| 21 | int c = 1;
|
---|
| 22 | int m = 1000;
|
---|
| 23 | *OudGetal = (time (NULL) % m) + *OudGetal;
|
---|
| 24 | *OudGetal = ( a * *OudGetal + c ) % m;
|
---|
| 25 | return(*OudGetal);
|
---|
| 26 | } //end randomgetal
|
---|
| 27 |
|
---|
| 28 | //Vraag de gebruiker om zijn invoer
|
---|
| 29 | //AantalGetallen_pt = aantal getallen (pointer)
|
---|
| 30 | //AantalKleuren_pt = aantal mogelijkheiden (pointer)
|
---|
| 31 | //Invoer_pt = array met ingevoerde getallen door gebruiker (pointer)
|
---|
| 32 | void spel_invoer(int *AantalGetallen_pt, int *AantalKleuren_pt, int *Invoer_pt) {
|
---|
| 33 | cout << endl << "Plaats gokje: " << endl;
|
---|
| 34 | int IngevoerdeGetallen = 0;
|
---|
| 35 | while (IngevoerdeGetallen < *AantalGetallen_pt) {
|
---|
| 36 | cout << "Voer getal " << (IngevoerdeGetallen + 1) << " (van de " << *AantalGetallen_pt << ") in "
|
---|
| 37 | << "[0-" << *AantalKleuren_pt << "] (gevolgd door een enter): ";
|
---|
| 38 | if (cin >> *(Invoer_pt + IngevoerdeGetallen)) {
|
---|
| 39 | IngevoerdeGetallen++;
|
---|
| 40 | }
|
---|
| 41 | else {
|
---|
| 42 | cout << "Dit is geen (geldig) getal, gelieve een geldig getal invoeren" << endl;
|
---|
| 43 | cin.clear();
|
---|
| 44 | cin.ignore(INT_MAX,'\n');
|
---|
| 45 | }
|
---|
| 46 | }
|
---|
| 47 | } //end spel_invoer
|
---|
| 48 |
|
---|
| 49 | //Bereken of de bebruiker iets goeds ingevoerd heeft
|
---|
| 50 | //AG_pt => AantalGetallen_pt = aantal getallen (pointer)
|
---|
| 51 | //AK_pt => AantalKleuren_pt = aantal mogelijkheiden (pointer)
|
---|
| 52 | //Invoer_pt = array met ingevoerde getallen door gebruiker (pointer)
|
---|
| 53 | //Antwoord_pt = array met antwoorden (pointer)
|
---|
| 54 | //ATA_pt => AantalTekensAanwezig_pt = Aantal tekens aanwezig, maar niet goed geplaatst (pointer)
|
---|
| 55 | //ATJP => AantalTekensGoedePlek_pt = Aantal tekens op de goede plek (pointer)
|
---|
| 56 |
|
---|
| 57 | void spel_bereken(int *AG_pt, int *ATA_pt, int *ATJP_pt, int *Antwoord, int *Invoer){
|
---|
| 58 |
|
---|
| 59 | bool HulpArray[*AG_pt]; //array die nodig is bij het testen van de geldigheid van het
|
---|
| 60 | //gegeven antwoord, als de plek corresponderend met plek in array antwoord true is dan is het
|
---|
| 61 | //getal nog niet gebruikt voor het antwoord.
|
---|
| 62 |
|
---|
| 63 | //hulp array op true stellen
|
---|
| 64 | for (int i = 0; i < *AG_pt; i++) {
|
---|
| 65 | HulpArray[i] = true;
|
---|
| 66 | }
|
---|
| 67 |
|
---|
| 68 | //Gegokte invoer array doorlopen
|
---|
| 69 | for (int i = 0;i < *AG_pt; i++) { //loop_1
|
---|
| 70 |
|
---|
| 71 | //debug (invoer + antwoord laten zien)
|
---|
| 72 | cout << *(Invoer + i) << " antwoord: " << *(Antwoord + i) << endl;
|
---|
| 73 | //end debug
|
---|
| 74 |
|
---|
| 75 | if (*(Invoer + i) == *(Antwoord + i)) { //getal op de goede plek
|
---|
| 76 | (*ATJP_pt)++;
|
---|
| 77 | HulpArray[i] = false;
|
---|
| 78 | }
|
---|
| 79 | } //end loop_1
|
---|
| 80 | for (int i = 0; i < *AG_pt; i++) { //loop_2
|
---|
| 81 | if (HulpArray[i]) {
|
---|
| 82 | for (int j = 0; j < *AG_pt; j++) { //loop_3
|
---|
| 83 | if ((*(Invoer + i) == *(Antwoord + j)) && (HulpArray[j])) { //getal aanwezig
|
---|
| 84 | (*ATA_pt)++;
|
---|
| 85 | HulpArray[j] = false;
|
---|
| 86 | j = *AG_pt; //uit loop_2 stappen, hij mag namelijk maar 1 keer tellen
|
---|
| 87 | }
|
---|
| 88 | } //end loop_3
|
---|
| 89 | }
|
---|
| 90 | } //end loop_2
|
---|
| 91 | } //end spel_bereken
|
---|
| 92 |
|
---|
| 93 |
|
---|
| 94 | //hoofdmodule voor spel mastermind.
|
---|
| 95 | //UITVOER: 0 = goed uitgevoerd, 1 = error in de invoer
|
---|
| 96 | int spel_main() {
|
---|
| 97 |
|
---|
| 98 | //variabelen voor invoer
|
---|
| 99 | int AantalGetallen = 4; //Aantal getallen dat de code lang is
|
---|
| 100 | int AantalKleuren = 6; //Aantal mogelijkheden per code teken
|
---|
| 101 |
|
---|
| 102 | cout << "Geef het aantal getallen ( <20 ) dat u wilt raden (gevolgd door enter): ";
|
---|
| 103 | if (cin >> AantalGetallen) {
|
---|
| 104 | if(AantalGetallen > 20) {
|
---|
| 105 | cout << "Dit is meer als 20" << endl;
|
---|
| 106 | return(1);
|
---|
| 107 | }
|
---|
| 108 | }
|
---|
| 109 | else {
|
---|
| 110 | cout << "Dit is GEEN getal" << endl;
|
---|
| 111 | return(1);
|
---|
| 112 | }
|
---|
| 113 |
|
---|
| 114 | cout << "Geef het aantal kleuren ( <20 )dat u wilt raden (gevolgd door enter): ";
|
---|
| 115 | if (cin >> AantalKleuren) {
|
---|
| 116 | if(AantalKleuren > 20) {
|
---|
| 117 | cout << "Dit is meer als 20" << endl;
|
---|
| 118 | return(1);
|
---|
| 119 | }
|
---|
| 120 | }
|
---|
| 121 | else {
|
---|
| 122 | cout << "Dit is GEEN getal" << endl;
|
---|
| 123 | return(1);
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | int Invoer[AantalGetallen]; //Array waar de invoer van de gebruiker wordt opgeslagen
|
---|
| 127 |
|
---|
| 128 | //variabelen voor de berekeing
|
---|
| 129 | bool NogNietGeraden = true; //Waar zolang code (Antwoord) nog niet geraden
|
---|
| 130 |
|
---|
| 131 | //variabelen voor uitvoer
|
---|
| 132 | int AantalTekensJuistePlek = 0; //Pinnetje van de juiste kleur op de juiste plek
|
---|
| 133 | int AantalTekensAanwezig = 0; //Pinnetje van de juiste kleur, maar niet op de goede plek
|
---|
| 134 |
|
---|
| 135 | //variabelen voor antwoord
|
---|
| 136 | long OudeGetalsWaarde = 0; //variable die ervoor zorgt dat elke code uniek wordt
|
---|
| 137 | int Antwoord[AantalGetallen]; //array met gezochte antwoorden
|
---|
| 138 |
|
---|
| 139 | //antwoord genereren
|
---|
| 140 | for (int i = 0; i < AantalGetallen; i++) {
|
---|
| 141 | Antwoord[i] = randomgetal(&OudeGetalsWaarde);
|
---|
| 142 | Antwoord[i] = (Antwoord[i] % 5);
|
---|
| 143 |
|
---|
| 144 | //debug (antwoord laten zien)
|
---|
| 145 | cout << Antwoord[i] << endl;
|
---|
| 146 | //end debug
|
---|
| 147 | }
|
---|
| 148 |
|
---|
| 149 | while (NogNietGeraden) { //gebruiker code laten raden
|
---|
| 150 |
|
---|
| 151 | spel_invoer(&AantalGetallen, &AantalKleuren, Invoer); //gebruikers invoer opvragen
|
---|
| 152 | spel_bereken(&AantalGetallen, &AantalTekensJuistePlek, &AantalTekensAanwezig, Antwoord, Invoer); //vergelijking uitvoeren
|
---|
| 153 |
|
---|
| 154 | //gebruikers resultaat laten zien
|
---|
| 155 | if (AantalTekensJuistePlek == AantalGetallen) {
|
---|
| 156 | cout << "Zeer goed, u heeft het goede antwoord geraden, druk op enter om verder te gaan";
|
---|
| 157 | cin.get();
|
---|
| 158 | NogNietGeraden = false;
|
---|
| 159 | }
|
---|
| 160 | else {
|
---|
| 161 | cout << "Aantal op de juiste plek: \t" << AantalTekensJuistePlek << endl;
|
---|
| 162 | cout << "Aantal niet op de juiste plek:\t" << AantalTekensAanwezig << endl;
|
---|
| 163 | } //end gebruiker code laten raden
|
---|
| 164 | }
|
---|
| 165 | return (0);
|
---|
| 166 | }
|
---|
| 167 |
|
---|
| 168 | int main() {
|
---|
| 169 | spel_main();
|
---|
| 170 | }
|
---|
| 171 |
|
---|