/* Comprueba si todas las coordenadas de un barco tienen un * cierto estado en este tablero */ public bool BarcoEstado(Estado e, Barco b) { List <Coordenada> cordB = b.PosicionesBarco(); List <Coordenada> cordT = this.Coordenadas(); // Comprobamos que todas las coordenadas del barco estan en el tablero foreach (Coordenada c in cordB) { if (cordT.Contains(c) == false) { return(false); } } // Comprobamos que todas esas coordenadas tienen el estado dicho foreach (Casilla c in this.tablero) { if (c.estado != e && cordB.Contains(c.coord)) { return(false); } } return(true); }
/* Actualiza los vecinos cuando un barco es tocado (es decir, las * diagonales de la casilla tocada). */ internal Tablero ActualizarVecinosTocado(Barco b, Coordenada c) { Tablero t = new Tablero(this.tablero); Coordenada c1 = new Coordenada(c.X + 1, c.Y + 1); Coordenada c2 = new Coordenada(c.X + 1, c.Y - 1); Coordenada c3 = new Coordenada(c.X - 1, c.Y + 1); Coordenada c4 = new Coordenada(c.X - 1, c.Y - 1); if (c1.EnRango()) { t.tablero.Add(new Casilla(c1, Estado.Agua)); } if (c2.EnRango()) { t.tablero.Add(new Casilla(c2, Estado.Agua)); } if (c3.EnRango()) { t.tablero.Add(new Casilla(c3, Estado.Agua)); } ; if (c4.EnRango()) { t.tablero.Add(new Casilla(c4, Estado.Agua)); } return(t); }
public Flota(List <Barco> f, Barco b) { List <Barco> f2 = new List <Barco>(); foreach (Barco bn in f) { f2.Add(bn.Clone()); } f2.Add(b); this.flota = f2; }
/* Actualiza todas las posiciones de un barco en un tablero como hundido * dejando las de los otros barcos intactas * (queda fuera del alcance de la funcion comprobar que el barco * efectivamente esta hundido) */ public Tablero HundirBarco(Barco b) { Tablero t = new Tablero(this.tablero); foreach (Casilla c in t.tablero) { if (b.PosicionesBarco().Contains(c.coord)) { c.estado = Estado.Hundido; } } return(t); }
/* Comprueba si un barco tiene espacio en una flota: * - el tam actual mas el del nuevo barco no debe sobrepasar el 20% de dimension * - todas las casillas adyacentes a las que ocupe el nuevo barco deben estar vacias */ private bool ComprobarEspacio(Barco b) { if (FlotaLlena(b)) { return(false); } foreach (Coordenada c in b.PosicionesNecesarias()) { if (this.flota.Coordenadas().Contains(c)) { return(false); } } return(true); }
/* Actualiza los vecinos cuando un barco es hundido (es decir, las * casillas anterior y siguiente al barco). */ internal Tablero ActualizarVecinosHundido(Barco b, Coordenada c) { Tablero t = new Tablero(this.tablero); Coordenada c1 = b.CoordenadaSuperior(); Coordenada c2 = b.CoordenadaInferior(); if (c1.EnRango()) { t.tablero.Add(new Casilla(c1, Estado.Agua)); } if (c2.EnRango()) { t.tablero.Add(new Casilla(c2, Estado.Agua)); } return(t); }
/* Avisa al usuario y procesa una flota leida de teclado. */ private static Flota IntroducirFlota() { double restante = (0.2 * API_Hundir_Flota.dimension * API_Hundir_Flota.dimension); Flota f = new Flota(); while (restante > 0) { Console.WriteLine("Introduce un barco (" + restante + " casillas restantes)"); String s = Console.ReadLine(); try // formateamos el barco leido { Barco n = GUI_Hundir_Flota.LecturaBarco(s); f = new Flota(f.flota, n); // no se ejecuta si hay excepcion restante -= n.tam; } catch (Exception e) { Console.WriteLine("Excepcion:" + e.GetType()); } if (restante <= 0) { break; } else if (restante < API_Hundir_Flota.dimension) // asi evitamos jugar contra una flota vacia { Console.WriteLine("Pulsa s para introducir otro barco"); string opt = Console.ReadLine(); if (opt != "s") { break; } } } return(f); }
/* Comprueba si la flota estaria llena incluyendo un barco dado * (hay mas del 20% de casillas ocupadas por barcos) */ private bool FlotaLlena(Barco b) { return((flota.Tam() + b.tam) > (0.2 * dimension * dimension)); }
/* Comprueba si un barco es admisible en una flota: * - sus coordenadas estan dentro de 1 -> dimension * - tiene espacio en la flota */ private bool ComprobarBarco(Barco b) { return(b.coord.X > 0 && b.coord.X <= dimension && b.coord.Y > 0 && b.coord.Y <= dimension && ComprobarEspacio(b)); }