-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
208 lines (170 loc) · 6.99 KB
/
main.cpp
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
#include <bits/stdc++.h>
#include "TADS/Interfaces.h"
#include "TADS/Huffman.h"
#include "TADS/Grafo.cpp"
using namespace std;
enum StringOptions {
inicializar,
turno,
invalido,
guardar,
guardar_comprimido,
inicializar_comprimido,
conquista_mas_barata,
costo_conquista
};
StringOptions evalString(string a) {
if (a == "inicializar") return inicializar;
else if (a == "turno") return turno;
else if (a == "guardar") return guardar;
else if (a == "guardar_comprimido") return guardar_comprimido;
else if (a == "inicializar_comprimido") return inicializar_comprimido;
else if (a == "conquista_mas_barata") return conquista_mas_barata;
else if (a == "costo_conquista") return costo_conquista;
else return invalido;
}
int main() {
system("ascii-image-converter title.png -f -b --dither -C");
list<string> command;
list<string>::iterator it;
// inicializar
Interfaces juego;
Huffman saveGame;
bool juegoIniciado = false;
bool primerTurno = false;
bool juegoFinalizado = false;
do {
cout << "Ingrese su comando: ";
command.clear();
char* str = new char[100];
cin.getline(str, 50);
char *p = strtok(str, " ");
if (p != NULL) {
while (p != NULL){
command.push_back(p);
p = strtok(NULL, " ");
}
} else {
command.push_back(str);
}
it = command.begin();
switch (evalString(*it)) {
case inicializar: {
if(!juegoIniciado){
if (!juego.getGame().inicializarDatos()) {
cout << "Algo salio mal inicializando los datos\n";
break;
}
int initOption = -1;
do {
cout << "¿Desea inicializarlo con un archivo?: [1 -> YES / 0 -> NO]: ";
cin >> initOption;
} while (initOption != 1 && initOption != 0);
if (initOption == 1) {
string fileName;
cout << "Escriba el nombre del archivo para inicializar el juego: ";
cin >> fileName;
juego.getGame().iniciarJuego(
*juego.getGame().inicializarJugadores(fileName)
);
} else {
juego.inicializarJuego();
}
juegoIniciado = true;
cout << "(Inicialización satisfactoria) El juego se ha inicializado correctamente." << endl;
}else{
cout << "(Juego en curso) El juego ya ha sido inicializado." << endl;
}
primerTurno = true;
break;
}
case turno: { //turno <id_jugador>
if (juegoFinalizado) {
cout << "Esta partida ya tuvo un ganador.\n";
break;
}
auto itTurno = command.begin();
itTurno++;
if (!primerTurno) {
juego.getGame().avanzarTurno(1);
}
if (juego.getGame().getTurno()->getId() != *itTurno) {
cout << "(Jugador fuera de turno) UPS, turno invalido\n";
if (!primerTurno) {
juego.getGame().avanzarTurno(-1);
}
break;
}
primerTurno = false;
int numberCont = juego.efectuarTurno();
if (numberCont == 6) {
cout << "Ganaste el juego " << juego.getGame().getTurno()->getNombre() << ". Felicidades.\n";
juegoFinalizado = true;
}
break;
}
case guardar: {
auto file = command.begin();
file++;
if ( !saveGame.guardarPartida(juego.getGame(), *file) ) {
cout << "Ocurrio algo con el guardado de la partida normal\n";
}
break;
}
case guardar_comprimido : {
auto itCommand = command.begin();
itCommand++;
string fileCompress = saveGame.encode(*itCommand);
if (fileCompress == "\0") {
cout << "Algo ha salido mal con el archivo comprimido\n";
break;
}
cout << "Se ha guardado el archivo con el nombre: " << fileCompress << endl;
break;
}
case inicializar_comprimido: {
auto it = command.begin();
it++;
cout << "Se ha escrito el archivo en " << saveGame.decode(*it) << " por favor, ingrese el comando inicializar para indicar la incialización con dicho archivo" << endl;
break;
}
case conquista_mas_barata: {
pair<int, list<Territorio>> q = juego.getGame().conquistaMasBarata();
auto it = q.second.end();
advance(it, -1);
Territorio last = *it;
cout << "La conquista más barata es avanzar sobre el territorio " << last.getNombre() << " desde el territorio ";
it = q.second.begin();
cout << it->getNombre() << ". Para conquistar el territorio " << last.getNombre() << ", debe atacar desde " << it->getNombre() << ", pasando por los territorios ";
for (auto terr: q.second) {
cout << terr.getNombre() << ", ";
}
cout << ".Debe conquistar " << q.first << " unidades de ejercito.\n";
}
case costo_conquista: {
string code = "o";
set<string> validCodes;
for (auto terr: juego.getGame().getGrafo().getvertices()) {
validCodes.insert(terr.getIdTerritorio());
}
while (!validCodes.count(code)) {
cout << "Ingrese el codigo del territorio el cual quiere atacar: ";
cin >> code;
}
pair<int, list<Territorio> > conquista = juego.getGame().costoConquista(code);
if (conquista.first == -1) {
cout << "Ups, algo pasó en la conquista, debe ser que no es alcanzable o sucedio algo en el sistema\n";
} else {
cout << "Para conquistar el territorio con el codigo: " << code << ", debe atacar desde ";
for (auto terr: conquista.second) {
cout << terr.getNombre() << ", ";
}
cout << ".Debe conquistar " << conquista.first << " unidades de ejercito.\n";
};
}
default:
break;
}
} while (*it != "salir");
return 0;
}