/// <summary> /// Verifica si hay un barco posicionado sobre una ona del mar del barco que se quiere posicionar /// </summary> /// <param name="barco">El barco a posicionar</param> /// <returns>true si hay superposicion, false si no</returns> bool verificarSuperposicionBarcoIA(BarcoEnPartida barco) { if (barco.infoInstancia.orientacion == OrientacionBarco.Vertical) { for (int i = 0; i < barco.longitud; i++) { if (tableroIA[barco.infoInstancia.coordenadaDeReferencia.FilaToNum() - i, barco.infoInstancia.coordenadaDeReferencia.Columna]) { return(true); } } } else if (barco.infoInstancia.orientacion == OrientacionBarco.Horizontal) { for (int i = 0; i < barco.longitud; i++) { if (tableroIA[barco.infoInstancia.coordenadaDeReferencia.FilaToNum(), barco.infoInstancia.coordenadaDeReferencia.Columna + i]) { return(true); } } } return(false); }
/// <summary> /// Obetener el barco golpeado por un disparo /// </summary> /// <param name="coordenada">La cordenada del disparo</param> /// <returns>El barco golpeado</returns> private BarcoEnPartida getBarcoGolpeado(Coordenada coordenada) { if (turnoDelUsuario) { for (int i = 0; i < informacionDeLaPartida.barcosIA.Count; i++) { BarcoEnPartida barco = informacionDeLaPartida.barcosIA[i]; for (int j = 0; j < barco.infoInstancia.coordenadasOcupadas.Length; j++) { //SI este es el barco que golpeamos if (barco.infoInstancia.coordenadasOcupadas[j].Equals(coordenada)) { return(barco); } } } } else { for (int i = 0; i < informacionDeLaPartida.barcosUsuario.Count; i++) { BarcoEnPartida barco = informacionDeLaPartida.barcosUsuario[i]; for (int j = 0; j < barco.infoInstancia.coordenadasOcupadas.Length; j++) { if (barco.infoInstancia.coordenadasOcupadas[j].Equals(coordenada)) { return(barco); } } } } return(null); }
/// <summary> /// Verificar la ubicacion de un barco de la IA y lo posiciona si se puede ubicar /// </summary> /// <param name="barco">El barco a ubicar</param> /// <returns></returns> private bool VerfiUbicacionBarcoIA(BarcoEnPartida barco) { if (barco.infoInstancia.orientacion == OrientacionBarco.Vertical) { //Verificamos si el barco cabe if (barco.infoInstancia.coordenadaDeReferencia.FilaToNum() + 1 - barco.longitud >= 0) { //verificar si no hay otro barco if (!verificarSuperposicionBarcoIA(barco)) { ubicarBarcoIA(barco); return(true); } else { return(false); } } else//Si el barco no cabe { return(false); } } else if (barco.infoInstancia.orientacion == OrientacionBarco.Horizontal) { //Si el barco cabe if (barco.infoInstancia.coordenadaDeReferencia.Columna - 1 + barco.longitud <= 9) { if (!verificarSuperposicionBarcoIA(barco)) { ubicarBarcoIA(barco); return(true); } else { return(false); } } else { //Si no cabe return(false); } } return(false); }
/// <summary> /// Instanciar los barcos en el world space y mostrarlos en el tablero del jugador /// </summary> private void InstanciarMisBarcos() { for (int i = 0; i < informacionDeLaPartida.barcosUsuario.Count; i++) { BarcoEnPartida barco = informacionDeLaPartida.barcosUsuario[i]; Vector3 posicion = GameObject.Find("Escenario/TableroJugador/" + barco.infoInstancia.coordenadaDeReferencia).transform.position; Vector3 rotacion = barco.infoInstancia.orientacion == OrientacionBarco.Vertical ? Vector3.zero : new Vector3(0, 90, 0); GameObject b = Instantiate(Resources.Load <GameObject>("Barcos/" + barco.nombre), posicion, Quaternion.Euler(rotacion)); } for (int i = 0; i < tableroUsuario.GetLength(0); i++) { for (int j = 0; j < tableroUsuario.GetLength(1); j++) { if (tableroUsuario[i, j]) { GameObject.Find("Escenario/TableroJugador/" + Coordenada.FILAS[i] + j).gameObject.GetComponent <Renderer>().material.color = Color.yellow; } } } }
/// <summary> /// Re seleccionar un barco previamente ubicado, para cambiar su posicion /// </summary> /// <param name="barco">El barco a reubicar</param> public void reUbicarBarco(Barco barco) { BarcoEnPartida barcoEnPart = null; //Ahora lo buscamos dentro de la lista de barcos for (int i = 0; i < informacionDeLaPartida.barcosUsuario.Count; i++) { if (barco.instanciaDelBarco.coordenadaDeReferencia.Equals(informacionDeLaPartida.barcosUsuario[i].infoInstancia.coordenadaDeReferencia)) { barcoEnPart = informacionDeLaPartida.barcosUsuario[i]; break; } } informacionDeLaPartida.barcosUsuario.Remove(barcoEnPart); if (barco.instanciaDelBarco.orientacion == OrientacionBarco.Vertical) { for (int i = 0; i < barco.informacionBarco.Longitud; i++) { int fila = barco.instanciaDelBarco.coordenadaDeReferencia.FilaToNum() - i; tableroUsuario[fila, barco.instanciaDelBarco.coordenadaDeReferencia.Columna] = false; } } else if (barco.instanciaDelBarco.orientacion == OrientacionBarco.Horizontal) { for (int i = 0; i < barco.informacionBarco.Longitud; i++) { int columna = barco.instanciaDelBarco.coordenadaDeReferencia.Columna + i; tableroUsuario[barco.instanciaDelBarco.coordenadaDeReferencia.FilaToNum(), columna] = false; } } pintarZonaDelMar(barco, TipoDePintado.Restablecer, barco.informacionBarco.Longitud); barco.ubicado = false; barco.gameObject.layer = LayerMask.NameToLayer("Ignore Raycast"); this.barcoAUbicar = barco; }
/// <summary> /// Ubica un barco de la IA, despues que se han hecho todas las verificaciones /// </summary> /// <param name="barco"></param> void ubicarBarcoIA(BarcoEnPartida barco) { barco.infoInstancia.coordenadasOcupadas = new Coordenada[barco.longitud]; if (barco.infoInstancia.orientacion == OrientacionBarco.Vertical) { for (int i = 0; i < barco.longitud; i++) { int fila = barco.infoInstancia.coordenadaDeReferencia.FilaToNum() - i; tableroIA[fila, barco.infoInstancia.coordenadaDeReferencia.Columna] = true; barco.infoInstancia.coordenadasOcupadas[i] = new Coordenada(Coordenada.FILAS[fila], barco.infoInstancia.coordenadaDeReferencia.Columna); } } else if (barco.infoInstancia.orientacion == OrientacionBarco.Horizontal) { for (int i = 0; i < barco.longitud; i++) { int columna = barco.infoInstancia.coordenadaDeReferencia.Columna + i; tableroIA[barco.infoInstancia.coordenadaDeReferencia.FilaToNum(), columna] = true; barco.infoInstancia.coordenadasOcupadas[i] = new Coordenada(barco.infoInstancia.coordenadaDeReferencia.Fila, columna); } } informacionDeLaPartida.barcosIA.Add(barco); }
// para instanciar los barcos de la IA private void InstanciarBarcosIA() { Barco b = null; //Instanciamos todos los barcos tipo 4 for (int i = 0; i < cantidadBarcos4; i++) { b = Instantiate <GameObject>(Resources.Load <GameObject>("Barcos/" + informacionDeLaPartida.BarcosDeLaPartida[3]), new Vector3(10000, 10000, 10000), Quaternion.identity).GetComponent <Barco>(); Coordenada coordenadaRandom = new Coordenada("A", 0); OrientacionBarco orientacionRandom = OrientacionBarco.Horizontal; bool posicionado = false; while (!posicionado) { //obtenemos una orientacion y coordenada random orientacionRandom = Random.Range(0, 2) == 0 ? OrientacionBarco.Horizontal : OrientacionBarco.Vertical; coordenadaRandom = new Coordenada(Coordenada.FILAS[(int)Random.Range(0, 10)], (int)Random.Range(0, 10)); BarcoEnPartida barco = new BarcoEnPartida(b.informacionBarco.Nombre, b.informacionBarco.Longitud, orientacionRandom, coordenadaRandom); posicionado = VerfiUbicacionBarcoIA(barco); } Destroy(b.gameObject); } //barcos tipo 3 for (int i = 0; i < cantidadBarcos3; i++) { b = Instantiate <GameObject>(Resources.Load <GameObject>("Barcos/" + informacionDeLaPartida.BarcosDeLaPartida[2]), new Vector3(10000, 10000, 10000), Quaternion.identity).GetComponent <Barco>(); Coordenada coordenadaRandom = new Coordenada("A", 0); OrientacionBarco orientacionRandom = OrientacionBarco.Horizontal; bool posicionado = false; while (!posicionado) { //obtenemos una orientacion y coordenada random orientacionRandom = Random.Range(0, 2) == 0 ? OrientacionBarco.Horizontal : OrientacionBarco.Vertical; coordenadaRandom = new Coordenada(Coordenada.FILAS[(int)Random.Range(0, 10)], (int)Random.Range(0, 10)); BarcoEnPartida barco = new BarcoEnPartida(b.informacionBarco.Nombre, b.informacionBarco.Longitud, orientacionRandom, coordenadaRandom); posicionado = VerfiUbicacionBarcoIA(barco); } Destroy(b.gameObject); } //barcos tipo 2 for (int i = 0; i < cantidadBarcos2; i++) { b = Instantiate <GameObject>(Resources.Load <GameObject>("Barcos/" + informacionDeLaPartida.BarcosDeLaPartida[1]), new Vector3(10000, 10000, 10000), Quaternion.identity).GetComponent <Barco>(); Coordenada coordenadaRandom = new Coordenada("A", 0); OrientacionBarco orientacionRandom = OrientacionBarco.Horizontal; bool posicionado = false; while (!posicionado) { //obtenemos una orientacion y coordenada random orientacionRandom = Random.Range(0, 2) == 0 ? OrientacionBarco.Horizontal : OrientacionBarco.Vertical; coordenadaRandom = new Coordenada(Coordenada.FILAS[(int)Random.Range(0, 10)], (int)Random.Range(0, 10)); BarcoEnPartida barco = new BarcoEnPartida(b.informacionBarco.Nombre, b.informacionBarco.Longitud, orientacionRandom, coordenadaRandom); posicionado = VerfiUbicacionBarcoIA(barco); } Destroy(b.gameObject); } //barcos tipo 1 for (int i = 0; i < CantidadBarcos1; i++) { b = Instantiate <GameObject>(Resources.Load <GameObject>("Barcos/" + informacionDeLaPartida.BarcosDeLaPartida[0]), new Vector3(10000, 10000, 10000), Quaternion.identity).GetComponent <Barco>(); Coordenada coordenadaRandom = new Coordenada("A", 0); OrientacionBarco orientacionRandom = OrientacionBarco.Horizontal; bool posicionado = false; while (!posicionado) { //obtenemos una orientacion y coordenada random orientacionRandom = Random.Range(0, 2) == 0 ? OrientacionBarco.Horizontal : OrientacionBarco.Vertical; coordenadaRandom = new Coordenada(Coordenada.FILAS[(int)Random.Range(0, 10)], (int)Random.Range(0, 10)); BarcoEnPartida barco = new BarcoEnPartida(b.informacionBarco.Nombre, b.informacionBarco.Longitud, orientacionRandom, coordenadaRandom); posicionado = VerfiUbicacionBarcoIA(barco); } Destroy(b.gameObject); } for (int i = 0; i < tableroIA.GetLength(0); i++) { for (int j = 0; j < tableroIA.GetLength(1); j++) { if (tableroIA[i, j]) { GameObject.Find("Escenario/TableroEnemigo/" + Coordenada.FILAS[i] + j).gameObject.GetComponent <Renderer>().material.color = Color.yellow; } } } }
/// <summary> /// Realiza un disparo hacia el tablero del oponente /// </summary> /// <param name="coordDisparo">La coordenada dode se va a disparar</param> public void Disparar(Coordenada coordDisparo) { if (turnoDelUsuario) { tableroDisparosUsuario[coordDisparo.FilaToNum(), coordDisparo.Columna] = true; //if Hit if (tableroIA[coordDisparo.FilaToNum(), coordDisparo.Columna]) { //buscamos el barco que golpie; BarcoEnPartida barcoGolpeado = getBarcoGolpeado(coordDisparo); barcoGolpeado.infoInstancia.golpesRestantes--; if (barcoGolpeado.infoInstancia.golpesRestantes == 0) { //Se destuye el barco informacionDeLaPartida.barcosIA.Remove(barcoGolpeado); Debug.Log("Barco Enemigo Destruido"); dineroGanado += bonoDestruirBarco; } GameObject.Find("Escenario/TableroEnemigo/" + coordDisparo).GetComponent <Renderer>().material.color = Color.green; } else { GameObject.Find("Escenario/TableroEnemigo/" + coordDisparo).GetComponent <Renderer>().material.color = Color.red; } } else { tableroDisparosIA[coordDisparo.FilaToNum(), coordDisparo.Columna] = true; //if hit if (tableroUsuario[coordDisparo.FilaToNum(), coordDisparo.Columna]) { BarcoEnPartida barcoGolpeado = getBarcoGolpeado(coordDisparo); barcoGolpeado.infoInstancia.golpesRestantes--; if (barcoGolpeado.infoInstancia.golpesRestantes == 0) { //Se destuye el barco informacionDeLaPartida.barcosUsuario.Remove(barcoGolpeado); Debug.Log("Barco Usuario DEstruido"); } GameObject.Find("Escenario/TableroJugador/" + coordDisparo).GetComponent <Renderer>().material.color = Color.green; } else { GameObject.Find("Escenario/TableroJugador/" + coordDisparo).GetComponent <Renderer>().material.color = Color.red; } } //Verificamos las condiciones de victoria o derr0ta if (informacionDeLaPartida.barcosIA.Count == 0) { Debug.Log("Se acabo la partida, has ganado"); dineroGanado += bonoGanarPartida; status = "gano"; StartCoroutine(WaitForRequest()); SceneManager.LoadScene("MenuPrincipal"); } else if (informacionDeLaPartida.barcosUsuario.Count == 0) { Debug.Log("Se acabo la patida, ha ganado la maquina"); status = "perdio"; StartCoroutine(WaitForRequest()); SceneManager.LoadScene("MenuPrincipal"); } else { turnoDelUsuario = !turnoDelUsuario; } }