source: liacs/pm/mastermind.cc@ 4

Last change on this file since 4 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
RevLine 
[2]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.