diff --git a/src/ComunacacionJugador.java b/src/ComunacacionJugador.java index ebc6c6a..97112dd 100644 --- a/src/ComunacacionJugador.java +++ b/src/ComunacacionJugador.java @@ -1,4 +1,5 @@ import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; @@ -12,8 +13,6 @@ public class ComunacacionJugador extends Thread{ } public void run() { - boolean continuar = true; - int turno = 2; try { BufferedReader bufferEntrada = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); PrintWriter bufferSalida = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()),true); @@ -21,66 +20,135 @@ public class ComunacacionJugador extends Thread{ int sala = Integer.parseInt(bufferEntrada.readLine())-1; if(Servidor.addJugador(sala, this.socket)) { bufferSalida.println("Has entrado en la sala"); + if(Servidor.determinarJuego(sala) == 1) { + sala -= Servidor.salas3.size(); + bufferSalida.println("4"); + partida4(bufferEntrada, bufferSalida, sala); + }else { + bufferSalida.println("3"); + partida3(bufferEntrada, bufferSalida, sala); + } }else { bufferSalida.println("Error al entrar en la sala"); socket.close(); return; } - if(Servidor.salas.get(sala).getJugador1().equals(this.socket)) { - bufferSalida.println("Esperando al segundo jugador"); - synchronized (this.socket) { - this.socket.wait(); - } - turno = 1; - bufferSalida.println("Primero"); - bufferSalida.println(Servidor.salas.get(sala).tablero.getTablero()); - Servidor.salas.get(sala).tablero.colocarFicha(Integer.parseInt(bufferEntrada.readLine()), - Integer.parseInt(bufferEntrada.readLine()),turno); - synchronized (Servidor.salas.get(sala).jugadores[turno%2]) { - Servidor.salas.get(sala).jugadores[turno%2].notify(); - } - synchronized (this.socket) { - this.socket.wait(); - } - }else { - bufferSalida.println("Iniciando partida"); - bufferSalida.println("Segundo"); - synchronized (Servidor.salas.get(sala).jugadores[turno%2]) { - Servidor.salas.get(sala).jugadores[turno%2].notify(); - } - synchronized (this.socket) { - this.socket.wait(); - } - } - while(continuar) { - int finalJuego = Servidor.salas.get(sala).tablero.finalJuego(); - if(finalJuego != 0) { - continuar = false; - if(finalJuego == turno) { - bufferSalida.println("v"); - }else { - bufferSalida.println("f"); - } - synchronized (Servidor.salas.get(sala).jugadores[turno%2]) { - Servidor.salas.get(sala).jugadores[turno%2].notify(); - } - }else { - bufferSalida.println(Servidor.salas.get(sala).tablero.getTablero()); - Servidor.salas.get(sala).tablero.colocarFicha(Integer.parseInt(bufferEntrada.readLine()), - Integer.parseInt(bufferEntrada.readLine()),turno); - synchronized (Servidor.salas.get(sala).jugadores[turno%2]) { - Servidor.salas.get(sala).jugadores[turno%2].notify(); - } - synchronized (this.socket) { - this.socket.wait(); - } - } - - } - Servidor.salas.remove(sala); + }catch (Exception e) { e.printStackTrace(); } } + + private void partida3(BufferedReader bufferEntrada, PrintWriter bufferSalida, int sala) throws InterruptedException, NumberFormatException, IOException { + boolean continuar = true; + int jugador = 2; + if(Servidor.salas3.get(sala).getJugador1().equals(this.socket)) { + bufferSalida.println("Esperando al segundo jugador"); + synchronized (this.socket) { + this.socket.wait(); + } + jugador = 1; + bufferSalida.println("Primero"); + bufferSalida.println(Servidor.salas3.get(sala).tablero.getTablero()); + Servidor.salas3.get(sala).tablero.colocarFicha(Integer.parseInt(bufferEntrada.readLine()), + Integer.parseInt(bufferEntrada.readLine()),jugador); + synchronized (Servidor.salas3.get(sala).jugadores[jugador%2]) { + Servidor.salas3.get(sala).jugadores[jugador%2].notify(); + } + synchronized (this.socket) { + this.socket.wait(); + } + }else { + bufferSalida.println("Iniciando partida"); + bufferSalida.println("Segundo"); + synchronized (Servidor.salas3.get(sala).jugadores[jugador%2]) { + Servidor.salas3.get(sala).jugadores[jugador%2].notify(); + } + synchronized (this.socket) { + this.socket.wait(); + } + } + while(continuar) { + int finalJuego = Servidor.salas3.get(sala).tablero.finalJuego(); + if(finalJuego != 0) { + continuar = false; + if(finalJuego == jugador) { + bufferSalida.println("v"); + }else { + bufferSalida.println("f"); + } + synchronized (Servidor.salas3.get(sala).jugadores[jugador%2]) { + Servidor.salas3.get(sala).jugadores[jugador%2].notify(); + } + }else { + bufferSalida.println(Servidor.salas3.get(sala).tablero.getTablero()); + Servidor.salas3.get(sala).tablero.colocarFicha(Integer.parseInt(bufferEntrada.readLine()), + Integer.parseInt(bufferEntrada.readLine()),jugador); + synchronized (Servidor.salas3.get(sala).jugadores[jugador%2]) { + Servidor.salas3.get(sala).jugadores[jugador%2].notify(); + } + synchronized (this.socket) { + this.socket.wait(); + } + } + + } + Servidor.salas3.remove(sala); + } + + private void partida4(BufferedReader bufferEntrada, PrintWriter bufferSalida, int sala) throws InterruptedException, NumberFormatException, IOException { + boolean continuar = true; + int jugador = 2; + if(Servidor.salas4.get(sala).getJugador1().equals(this.socket)) { + bufferSalida.println("Esperando al segundo jugador"); + synchronized (this.socket) { + this.socket.wait(); + } + jugador = 1; + bufferSalida.println("Primero"); + bufferSalida.println(Servidor.salas4.get(sala).tablero.getTablero()); + Servidor.salas4.get(sala).tablero.colocarFicha(Integer.parseInt(bufferEntrada.readLine()),jugador); + synchronized (Servidor.salas4.get(sala).jugadores[jugador%2]) { + Servidor.salas4.get(sala).jugadores[jugador%2].notify(); + } + synchronized (this.socket) { + this.socket.wait(); + } + }else { + bufferSalida.println("Iniciando partida"); + bufferSalida.println("Segundo"); + synchronized (Servidor.salas4.get(sala).jugadores[jugador%2]) { + Servidor.salas4.get(sala).jugadores[jugador%2].notify(); + } + synchronized (this.socket) { + this.socket.wait(); + } + } + while(continuar) { + int finalJuego = Servidor.salas4.get(sala).tablero.finalJuego(); + if(finalJuego != 0) { + continuar = false; + if(finalJuego == jugador) { + bufferSalida.println("v"); + }else { + bufferSalida.println("f"); + } + synchronized (Servidor.salas4.get(sala).jugadores[jugador%2]) { + Servidor.salas4.get(sala).jugadores[jugador%2].notify(); + } + }else { + bufferSalida.println(Servidor.salas4.get(sala).tablero.getTablero()); + Servidor.salas4.get(sala).tablero.colocarFicha(Integer.parseInt(bufferEntrada.readLine()),jugador); + synchronized (Servidor.salas4.get(sala).jugadores[jugador%2]) { + Servidor.salas4.get(sala).jugadores[jugador%2].notify(); + } + synchronized (this.socket) { + this.socket.wait(); + } + } + + } + Servidor.salas4.remove(sala); + } } diff --git a/src/Sala.java b/src/Sala3.java similarity index 76% rename from src/Sala.java rename to src/Sala3.java index 3e12558..efa63af 100644 --- a/src/Sala.java +++ b/src/Sala3.java @@ -1,14 +1,14 @@ import java.net.Socket; -public class Sala { +public class Sala3 { int nJugadores; Socket[] jugadores; - Tablero tablero; + Tablero3 tablero; - public Sala() { + public Sala3() { this.nJugadores = 0; this.jugadores = new Socket[2]; - this.tablero = new Tablero(); + this.tablero = new Tablero3(); } public boolean aniadirJugador(Socket jugador) { @@ -30,7 +30,7 @@ public class Sala { } public String toString() { - return String.valueOf(this.nJugadores); + return String.valueOf(this.nJugadores) + "Tres en raya"; } } diff --git a/src/Sala4.java b/src/Sala4.java new file mode 100644 index 0000000..fe875f5 --- /dev/null +++ b/src/Sala4.java @@ -0,0 +1,36 @@ +import java.net.Socket; + +public class Sala4 { + int nJugadores; + Socket[] jugadores; + Tablero4 tablero; + + public Sala4() { + this.nJugadores = 0; + this.jugadores = new Socket[2]; + this.tablero = new Tablero4(); + } + + public boolean aniadirJugador(Socket jugador) { + if(this.nJugadores <= 1 ) { + this.jugadores[this.nJugadores] = jugador; + this.nJugadores++; + return true; + }else { + return false; + } + } + + public Socket getJugador1() { + return this.jugadores[0]; + } + + public Socket getJugador2() { + return this.jugadores[1]; + } + + public String toString() { + return String.valueOf(this.nJugadores) + "Cuatro en raya"; + } + +} diff --git a/src/Servidor.java b/src/Servidor.java index 9955129..8bec62f 100644 --- a/src/Servidor.java +++ b/src/Servidor.java @@ -5,12 +5,15 @@ import java.util.ArrayList; public class Servidor { static Servidor instancia; - static ArrayList salas; + static ArrayList salas3; + static ArrayList salas4; private Servidor() { ServerSocket server; - Servidor.salas = new ArrayList(); - Servidor.salas.add(new Sala()); + Servidor.salas3 = new ArrayList(); + Servidor.salas3.add(new Sala3()); + Servidor.salas4 = new ArrayList(); + Servidor.salas4.add(new Sala4()); try { server = new ServerSocket(8080); while(true) { @@ -34,7 +37,11 @@ public class Servidor { public static String mostrarSalas() { String ret = ""; int cont = 1; - for(Sala sala:Servidor.salas) { + for(Sala3 sala:Servidor.salas3) { + ret += cont + " - Jugadores: " + sala.toString() + "\n"; + cont++; + } + for(Sala4 sala:Servidor.salas4) { ret += cont + " - Jugadores: " + sala.toString() + "\n"; cont++; } @@ -42,10 +49,27 @@ public class Servidor { } public static boolean addJugador(int sala, Socket socket) { - boolean ret = Servidor.salas.get(sala).aniadirJugador(socket); - if(Servidor.salas.get(sala).nJugadores==1) { - Servidor.salas.add(new Sala()); + boolean ret = false; + if(sala == Servidor.salas3.size()-1) { + ret = Servidor.salas3.get(sala).aniadirJugador(socket); + if(Servidor.salas3.get(sala).nJugadores==1) { + Servidor.salas3.add(new Sala3()); + } + }else if(sala == (Servidor.salas4.size()+Servidor.salas3.size()-1)) { + ret = Servidor.salas4.get(sala-Servidor.salas3.size()).aniadirJugador(socket); + if(Servidor.salas3.get(sala).nJugadores==1) { + Servidor.salas3.add(new Sala3()); + } } + return ret; } + + public static int determinarJuego(int sala) { + if(Servidor.salas3.size() > sala) { + return 0; + }else { + return 1; + } + } } diff --git a/src/Tablero.java b/src/Tablero3.java similarity index 98% rename from src/Tablero.java rename to src/Tablero3.java index dd24fca..38c483e 100644 --- a/src/Tablero.java +++ b/src/Tablero3.java @@ -1,8 +1,8 @@ -public class Tablero { +public class Tablero3 { int[][] casillas; int[] ultimasCoordenadas; - public Tablero() { + public Tablero3() { this.casillas = new int[3][3]; this.ultimasCoordenadas = new int[2]; } diff --git a/src/Tablero4.java b/src/Tablero4.java new file mode 100644 index 0000000..f34e03d --- /dev/null +++ b/src/Tablero4.java @@ -0,0 +1,118 @@ + +public class Tablero4 { + int[][] casillas; + int[] ultimasCoordenadas; + public Tablero4() { + this.casillas = new int[7][6]; + this.ultimasCoordenadas = new int[2]; + } + + public boolean colocarFicha(int x, int jugador) { + if(this.casillas[x][6] == 0) { + for(int i = 0;i < this.casillas[x].length; i++) { + if(this.casillas[x][i] == 0) { + this.casillas[x][i] = jugador; + this.ultimasCoordenadas[0]=x; + this.ultimasCoordenadas[1]=i; + break; + } + } + return true; + } + return false; + + } + + public int getLastX() { + return this.ultimasCoordenadas[0]; + } + + public int getLastY() { + return this.ultimasCoordenadas[1]; + } + + public String getTablero() { + String ret = ""; + for(int i = 0; i< this.casillas.length; i++) { + for(int j = 0; j < this.casillas[i].length; j++) { + ret += this.casillas[i][j] + " "; + } + if(i != this.casillas.length-1) { + ret += "\n"; + } + + } + return ret; + } + + public int finalJuego() { + int ret=0; + for(int i = 0;i < this.casillas.length-1; i++) { + for(int j = 0;j < this.casillas[i].length; j++) { + if(comprobarHorizontal(i, j, this.casillas[i][j]) <= 4) { + return this.casillas[i][j]; + } + if(comprobarVertical(i, j, this.casillas[i][j]) <= 4) { + return this.casillas[i][j]; + } + if(comprobarDiagonalArriba(i, j, this.casillas[i][j]) <= 4) { + return this.casillas[i][j]; + } + if(comprobarDiagonalAbajo(i, j, this.casillas[i][j]) <= 4) { + return this.casillas[i][j]; + } + } + } + return ret; + } + + private int comprobarHorizontal(int x, int y, int jugador) { + if(x == this.casillas.length-1) { + return 0; + } + if(this.casillas[x+1][y] == jugador) { + return comprobarHorizontal(x+1, y, jugador)+1; + }else { + return 0; + } + } + + private int comprobarVertical(int x, int y, int jugador) { + if(y == this.casillas[x].length-1) { + return 0; + } + if(this.casillas[x][y+1] == jugador) { + return comprobarVertical(x, y+1, jugador)+1; + }else { + return 0; + } + } + + private int comprobarDiagonalArriba(int x, int y, int jugador) { + if(y == this.casillas[x].length-1) { + return 0; + } + if(x == this.casillas.length-1) { + return 0; + } + if(this.casillas[x][y+1] == jugador) { + return comprobarDiagonalArriba(x+1, y+1, jugador)+1; + }else { + return 0; + } + } + + private int comprobarDiagonalAbajo(int x, int y, int jugador) { + if(y == 0) { + return 0; + } + if(x == this.casillas.length-1) { + return 0; + } + if(this.casillas[x][y+1] == jugador) { + return comprobarDiagonalAbajo(x+1, y-1, jugador)+1; + }else { + return 0; + } + } +}