-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConnect4.java
131 lines (115 loc) · 3.37 KB
/
Connect4.java
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
import usantatecla.utils.*;
public class Connect4{
private Board board;
private Turn turn;
private Player[] players;
private Victory victory;
private Menu menu;
private GestorComandos gestor;
public Connect4(){
this.board = new Board();
this.victory = new Victory();
this.players = new Player[Turn.NUMBER_PLAYERS];
this.turn = new Turn(this.board, this.players, victory);
turn.reset();
this.menu = new Menu(this, this.board, Color.R); //this.turn.getActiveColor()
this.gestor = new GestorComandos(Color.R, turn);
}
/**
* Nos permite elegir el modo de juego y nos dará la opción de aplicar el patrón undo/redo.
* El UserPlayer será el que podrá deshacer o rehacer un movimiento.
* Siempre indicará a que jugador le toca poner ficha en ese momento
*/
void playGame() {
board.initBoard();
int opcion = menu.chooseMode();
do {
setOption(opcion);
board.showInterface();
System.out.println("Turn " + turn.getActiveColor());
if (opcion == 1)
applyUndoRedo();
} while (!this.isConnect4());
}
/**
* Aplicará el patrón undo/redo. Primero será necesario que el usuario haga un undo
* que permitirá al jugador deshacer la acción y el redo se podrá hacer inmediatamente después si el
* jugador quisiera rehacer el movimiento.
*/
void applyUndoRedo(){
String response;
Console console = new Console();
response = console.readString(Message.UNDO.toString());
if (response.equalsIgnoreCase("undo")) {
gestor.undo();
board.deleteToken(board.getLastColumn());
board.showInterface();
response = console.readString(Message.REDO.toString());
if (response.equalsIgnoreCase("redo")){
Color c = gestor.redo();
if (c != Color.NULL)
board.putToken(c, board.getLastColumn());
board.showInterface();
}
}
}
/**
* Servirá como conexion entre los modos de juego y las funciones de cada uno
* @param opcion - recibirá el modo de juego
*/
void setOption(int opcion) {
if (opcion == 1 || opcion == 3) {
this.turn.play(this, opcion, gestor);
this.turn.changeColor();
}
else if (opcion == 2) {
opcion = 1;
this.turn.play(this, opcion, gestor);
this.turn.changeColor();
board.showInterface();
applyUndoRedo();
opcion = 2;
this.turn.play(this, opcion, gestor);
this.turn.changeColor();
}
else
System.exit(0);
}
/**
* Comprobaremos si se ha encontrado un ganador, si es el caso,
* dejaremos que el usuario decida si quiere seguir jugando o no.
* Si no se ha encontrado ganador, comprobará si el tablero está lleno
* y en ese caso, se producirá un Empate que será notificado con un mensaje.
* @return - retornará un booleano para cada caso
*/
public boolean isConnect4() {
String response;
Console console = new Console();
if(!victory.isWinner(this.board, this.turn.getActiveColor(), this.turn)){
if (this.board.fullBoard())
Message.TIED_MESSAGE.toString();
}
else {
do {
response = console.readString(Message.CONTINUE_MESSAGE.toString());
if (response.equalsIgnoreCase("no"))
System.exit(0);
this.start();
} while(response.equalsIgnoreCase("yes"));
}
return false;
}
/**
* Nos permitirá iniciar la partida
*/
private void start() {
this.playGame();
}
/**
* Donde empieza todo, método principal que inicia el programa
* @param args
*/
public static void main(String[] args) {
new Connect4().start();
}
}