-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
189 lines (151 loc) · 4.91 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
#include <iostream>
#include <string>
#include "Board.h"
#include "Player.h"
#include "Computer.h"
#include "Human.h"
#include "utils.h"
using namespace std;
// declaracion de funciones
void handleWinner(Board, Player *, Player *);
void handleMatch(Board, Player *, Player *);
void handleGame();
int main(int argc, char** argv) {
// opciones
string options[] = {
"Iniciar Partida",
"Salir"
};
int optionsLength = 2;
// estado del programa
bool shouldContinue = true;
while(shouldContinue) {
cout << "----- Cuatro en Linea -----\n" << endl;
// mostrar opciones
displayOptions(options, optionsLength);
cout << endl;
// pedir y leer opcion
int option = getOption("Opcion: ", 1, optionsLength);
cout << endl;
// ejecutar accion de acuerdo a opcion elegida
if (option == 1) {
handleGame();
} else if (option == 2) {
shouldContinue = false;
} else {
cout << "Opcion invalida" << endl;
}
cout << endl;
}
return 0;
}
// controlar ganador
void handleWinner(Board board, Player *P1, Player *P2) {
// buscar secuencias para cada jugador
int firstPlayerScore = board.findSequences(P1->getToken());
int secondPlayerScore = board.findSequences(P2->getToken());
// establecer puntuaciones
P1->setScore(firstPlayerScore);
P2->setScore(secondPlayerScore);
// determinar resultado
if (P1->getScore() > P2->getScore()) {
cout << "Ganador es Jugador 1 (" << P1->getToken() << ")" << endl;
cout << "Puntaje: " << P1->getScore() << endl;
} else if (P1->getScore() < P2->getScore()) {
cout << "Ganador es Jugador 2 (" << P2->getToken() << ")" << endl;
cout << "Puntaje: " << P2->getScore() << endl;
} else {
cout << "Empate" << endl;
}
}
// controlar partida
void handleMatch(Board board, Player *P1, Player *P2) {
// obtener jugador a iniciar partida
int playerToStart = randomInRange(1, 2);
// establecer ficha de turno actual
char currentTokenTurn = playerToStart == 1
? P1->getToken()
: P2->getToken();
// mostrar jugador a iniciar partida
cout << "> Primer Turno es Jugador " << playerToStart
<< " (" << currentTokenTurn << ")\n" << endl;
// jugar hasta que partida no haya terminado
while(!board.isGameOver(P1->getToken(), P2->getToken())) {
// mostrar estado del tablero
board.display();
cout << endl;
// determinar jugador del turno
if (currentTokenTurn == P1->getToken()) {
P1->makeMove(board);
// asignar ficha del proximo turno
currentTokenTurn = P2->getToken();
} else {
P2->makeMove(board);
// asignar ficha del proximo turno
currentTokenTurn = P1->getToken();
}
}
// mostrar estado final del tablero
board.display();
cout << endl;
// determinar ganador
handleWinner(board, P1, P2);
}
// controlar juego
void handleGame() {
// modalidades
string modalities[] = {
"Ganador por primer 4 en Linea",
"Ganador por secuencias de 4 en Linea"
};
int modalitiesLength = 2;
// tipos de partida
string matchTypes[] = {
"Humano vs Humano",
"Humano vs Computadora",
"Computadora vs Computadora"
};
int matchTypesLength = 3;
// mostrar modalidades
cout << "> Modalidades\n" << endl;
displayOptions(modalities, modalitiesLength);
cout << endl;
// pedir y leer modalidad
int modality = getOption("Modalidad: ", 1, modalitiesLength);
cout << endl;
// mostrar tipos de partida
cout << "> Tipos de Partida\n" << endl;
displayOptions(matchTypes, matchTypesLength);
cout << endl;
// pedir y leer tipo de partida
int matchType = getOption("Tipo de Partida: ", 1, matchTypesLength);
cout << endl;
// crear elementos
Board board(modality);
Player *P1, *P2;
// fichas de jugadores
char firstPlayerToken = 'X';
char secondPlayerToken = 'O';
// asignar jugadores de acuerdo a tipo de partida
switch(matchType) {
case 1:
P1 = new Human(firstPlayerToken);
P2 = new Human(secondPlayerToken);
break;
case 2:
P1 = new Human(firstPlayerToken);
P2 = new Computer(secondPlayerToken, firstPlayerToken);
break;
case 3:
P1 = new Computer(firstPlayerToken, secondPlayerToken);
P2 = new Computer(secondPlayerToken, firstPlayerToken);
break;
default:
cout << "Opcion invalida" << endl;
}
// iniciar partida
handleMatch(board, P1, P2);
// destruir objetos
delete P1;
delete P2;
}