From cb3b2e3882bd9969761cd59197de5fb4ad71d42c Mon Sep 17 00:00:00 2001
From: groche97 <groche97@gmail.com>
Date: Sat, 14 Dec 2019 21:35:59 +0100
Subject: [PATCH] Aniadido soporte 4 en raya

---
 src/ComunacacionJugador.java        | 176 +++++++++++++++++++---------
 src/{Sala.java => Sala3.java}       |  10 +-
 src/Sala4.java                      |  36 ++++++
 src/Servidor.java                   |  38 ++++--
 src/{Tablero.java => Tablero3.java} |   4 +-
 src/Tablero4.java                   | 118 +++++++++++++++++++
 6 files changed, 314 insertions(+), 68 deletions(-)
 rename src/{Sala.java => Sala3.java} (76%)
 create mode 100644 src/Sala4.java
 rename src/{Tablero.java => Tablero3.java} (98%)
 create mode 100644 src/Tablero4.java

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<Sala> salas;
+	static ArrayList<Sala3> salas3;
+	static ArrayList<Sala4> salas4;
 	
 	private Servidor() {
 		ServerSocket server;
-		Servidor.salas = new ArrayList<Sala>();
-		Servidor.salas.add(new Sala());
+		Servidor.salas3 = new ArrayList<Sala3>();
+		Servidor.salas3.add(new Sala3());
+		Servidor.salas4 = new ArrayList<Sala4>();
+		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;
+		}
+	}
+}