source: liacs/pm/mastermind.cc@ 137

Last change on this file since 137 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: 5.6 KB
Line 
1#include <iostream>
2#include <ctime>
3#include <climits>
4using namespace std;
5
6
7// voorbeeld: 1/2/3/4
8// x = (randi()/250) + 1;
9int 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
19long 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)
32void 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
57void 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
96int 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
168int main() {
169spel_main();
170}
171
Note: See TracBrowser for help on using the repository browser.