-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSource.cpp
More file actions
282 lines (211 loc) · 7.84 KB
/
Source.cpp
File metadata and controls
282 lines (211 loc) · 7.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
//Andrea Peña Calvin
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <fstream>
const int TAM_CODIGO = 4;//tamaño del codigo
const unsigned short int NUM_ELEM = 6;//numero de colores tColor (sin contar error)
const unsigned short int NUMINTENTOS = 15;//numero max de intentos
const int VMIN = 0;//valor minimo aceptado en las opciones de juego
const int VMAX = 3;//valor maximo aceptado en las opciones de juego
enum tColor { ROJO, AZUL, VERDE, AMARILLO, MARRON, BLANCO, ERROR };
using tCodigo = std::vector<tColor>; //vector de colores
tColor char2color(char const & jug) { //conversion de char a tColor
tColor var;
if (jug == 'R' || jug == 'r') var = ROJO;
else if (jug == 'Z' || jug == 'z') var = AZUL;
else if (jug == 'V' || jug == 'v') var = VERDE;
else if (jug == 'A' || jug == 'a') var = AMARILLO;
else if (jug == 'M' || jug == 'm') var = MARRON;
else if (jug == 'B' || jug == 'b') var = BLANCO;
else var = ERROR;
return var;
}
char color2char(tColor const & elem) { //conversion de tColor a char
switch (elem) {
case ROJO: return 'R';
case AZUL: return 'Z';
case VERDE: return 'V';
case AMARILLO: return 'A';
case MARRON: return 'M';
case BLANCO: return 'B';
}
}
int leeOpcion(){
int opt; //opcion elegida
std::cout << "1- Jugar con un codigo sin colores repetidos" << '\n';
std::cout << "2- Jugar con un codigo con colores repetidos" << '\n';
std::cout << "3- Mostrar partidas jugadas" << '\n';
std::cout << "0- Salir" << '\n';
std::cout << "Ingrese una opcion: ";
std::cin >> opt;
while (!((VMIN <= opt) && (opt <= VMAX))) {//comprueba que el valor elegido sea un numero correcto
std::cout << "Opcion incorrecta. Escoja una opcion valida: ";
std::cin >> opt;
}
return opt;
}
bool repeticiones(const tColor & color, const int & i, const tCodigo & codigo) {//comprueba si el color ya aparece en el vector
int j = 0;
bool repe = false;
while (j < i && !repe) {
if (color2char(color) == color2char(codigo[j])) repe = true;
j++;
}
return repe;
}
void codigoAleatorio(tCodigo & codigo, const bool & admiteRepetidos) { //generar el codigo que debe averiguar el jugador
tColor color;
bool repetido;
std::cout << "INFO para depuracion. Codigo secreto: ";
if (admiteRepetidos) { //opc 2
for (int i = 0; i < TAM_CODIGO; i++) {
codigo.at(i) = tColor(rand() % NUM_ELEM);
std::cout << color2char(codigo[i]);
}
}
else {//opcion 1, sin repeticiones
codigo.at(0) = tColor(rand() % NUM_ELEM);
std::cout << color2char(codigo[0]);
for (int i = 0; i < TAM_CODIGO - 1; i++) {//comprobar que no hay repeticiones y si las hay, generar otro color
color = tColor(rand() % NUM_ELEM);
repetido = repeticiones(color, i + 1, codigo);
while (repetido) {
color = tColor(rand() % NUM_ELEM);
repetido = repeticiones(color, i + 1, codigo);
}
codigo.at(i + 1) = color;
std::cout << color2char(codigo[i + 1]);
}
}
std::cout << '\n';
}
void compararCodigos(tCodigo const & codigo, tCodigo const & hipotesis, int & colocados, int & descolocados) {
std::vector<bool> vec(TAM_CODIGO, true);
for (int i = 0; i < codigo.size(); ++i) {
if (codigo[i] == hipotesis[i]) {
++colocados;
vec[i] = false;
}
}
for (int i = 0; i < TAM_CODIGO; ++i) {
if (codigo[i] != hipotesis[i]) {
bool parar = false;
for (int j = 0; j < TAM_CODIGO && !parar; ++j) {
if (vec[j] && codigo[i] == hipotesis[j]) {
++descolocados;
vec[j] = false;
parar = true;
}
}
}
}
}
bool correct(std::string const & pal) {
int i = 0;
bool error = false;
while (i < pal.size() && !error) {
//pal.size porque puede ser que se introduzca la longitud incorrecta
if (char2color(pal[i]) == ERROR) {
std::cout << "Has introducido un caracter no valido, elige letras de las siguientes: R, Z, V, A, M o B. ";
error = true;
}
i++;
}
return error;
}
void leerFichero(std::vector<int>&vecpar) {
int c;
std::ifstream ficheroI;
ficheroI.open("partidas.txt");
if (ficheroI.is_open()) { //almacena la info de las partidas anteriores en el vector vecpar
ficheroI >> c;
while (!ficheroI.fail()) {
vecpar.push_back(c);
ficheroI >> c;
}
}
ficheroI.close();
}
void escribirFichero(std::vector<int>const & vecpar) { //
std::ofstream ficheroO;
ficheroO.open("partidas.txt");
if (ficheroO.is_open())
for (int i = 0; i < vecpar.size(); i++)
ficheroO << vecpar[i] << " ";
ficheroO.close();
}
void mresultados(std::vector<int>const & vecpar) {//resultado de partidas jugadas
std::cout << "Resultado de las partidas jugadas" << '\n';
for (int i = 0; i < vecpar.size(); i++) {
if (vecpar[i] == 16) std::cout << "Partida " << i + 1 << ": No consiguio resolverse" << '\n';
else std::cout << "Partida " << i + 1 << ": Resuelto en " << vecpar[i] << " intento(s)" << '\n';
}
}
void sesionDeJuego() {
tCodigo codigo(TAM_CODIGO);//almacena el codigo que genera el ordenador
tCodigo hipotesis(TAM_CODIGO);//codigo elegido por el ususario
int colocados = 0, descolocados = 0, intentos=0;
bool admiteRepetidos;
std::vector<int>vecpar;//almacena los intentos
leerFichero(vecpar);//almacena los intentos de las partidas anteriores en un vector
int opcion = leeOpcion();//lee la opcion de juego elegida por el jugador
while (opcion != 0) {
if (opcion != 3) {
if (opcion == 1) admiteRepetidos = false; //jugar SIN repetidos
else if (opcion == 2) admiteRepetidos = true;//jugar CON repetidos
codigoAleatorio(codigo, admiteRepetidos);//genera el codigo a adivinar
while (intentos < NUMINTENTOS && colocados != TAM_CODIGO) {//solo se permiten 15 intentos/ cuando todas las letras coincidan se acaba la partida
std::cout << "Introduce el codigo (palabra de 4 letras con alguna de R, Z, V, A, M o B) : ";
std::string pal;
std::cin >> pal;
bool error = correct(pal);//comprueba que los caracteres sean validos
while (pal.size() != TAM_CODIGO || error) {//comprueba si hay un error en el codigo introducido y dice cual es
if (pal.size() != TAM_CODIGO) std::cout << "Longitud incorrecta, deben ser 4 letras: ";//error de longitud
std::cin >> pal;
error = correct(pal);//error de caracter
}
for (int i = 0; i < TAM_CODIGO; i++)
hipotesis.at(i) = char2color(pal[i]); //mete EL CODIGO CORRECTO en la hipotesis
compararCodigos(codigo, hipotesis, colocados, descolocados);//determina las letras colocadas y descolocadas
std::cout << "Hay " << colocados << " letras colocadas y " << descolocados << " descolocadas." << '\n';
if (colocados == TAM_CODIGO) {
std::cout << "Enhorabuena. Te ha costado " << intentos + 1 << " intento(s)." << '\n';
vecpar.push_back(intentos + 1);
}
else {
colocados = 0; descolocados = 0; intentos++;
if (intentos == NUMINTENTOS) {
std::cout << "Has agotado los intentos" << '\n';
vecpar.push_back(16);
}
}
}
}
else if (opcion == 3) mresultados(vecpar); //muestra el resultado de las partidas jugadas
//aqui se acaba la partida o la consulta de resultados. Se vuelven a mostrar las opciones
colocados = 0; descolocados = 0; intentos = 0;
opcion = leeOpcion();//muestra al jugador las opciones
}
//Si opcion == 0: salir
escribirFichero(vecpar);//escribe en el fichero los intentos de las partidas jugadas
}
int main() {
srand(time(NULL));
std::ifstream normas;
std::string x;
normas.open("normas.txt");
if (normas.is_open()) { //abre el fichero que lee las normas del juego
while (!normas.eof()) {
getline(normas, x);
std::cout << x << '\n';
}
}
normas.close();
sesionDeJuego();
system("PAUSE");
return 0;
}