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 |
|
---|