Exemple #1
0
        /* 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);
        }
Exemple #2
0
        /* 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);
        }
Exemple #3
0
        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;
        }
Exemple #4
0
        /* 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);
        }
Exemple #6
0
        /* 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);
        }
Exemple #7
0
        /* 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));
 }