예제 #1
0
        /// <summary>
        /// Hacemos dos comprobaciones, que la posición está dentro del tablero
        /// y que cumple con las reglas del juego.
        /// </summary>
        /// <param name="tablero">Tablero en la situación actual de juego
        /// </param>
        /// <param name="posicion">Posición elegida por el jugador cuya
        /// legalidad queremos comprobar</param>
        /// <param name="color">Color del jugador</param>
        /// <returns>True si la jugada es correcta, false en caso contrario
        /// </returns>
        private Boolean ComprobarJugada(Tablero tablero, Posicion posicion, Color color)
        {
            Boolean movimientoValido;

            movimientoValido = Reglas.PosicionDentroTablero(posicion.Row, posicion.Col);
            if (!movimientoValido)
            {
                return(false);
            }
            movimientoValido = Reglas.PosicionLegal(tablero, posicion.Row, posicion.Col, color);
            if (!movimientoValido)
            {
                return(false);
            }

            return(true);
        }
예제 #2
0
파일: Ordenador.cs 프로젝트: floppp/Reversi
        /// <summary>
        /// Método para comprobar en qué casillas podemos colocar piezas.
        /// </summary>
        /// <param name="tablero">Tablero en su situación actual</param>
        public void ComprobarValidas(Tablero tablero)
        {
            posicionesValidas = new Queue();

            Posicion posicion;

            for (int row = 1; row < 9; row++)
            {
                for (int col = 1; col < 9; col++)
                {
                    if (Reglas.PosicionLegal(tablero, row, col, color))
                    {
                        posicion     = new Posicion();
                        posicion.Row = row;
                        posicion.Col = col;
                        posicionesValidas.Enqueue(posicion);
                    }
                }
            }
        }
예제 #3
0
        /// <summary>
        /// Método para pedir posición al jugador
        /// </summary>
        /// <param name="tablero">Tablero en su sitúación actual</param>
        public void Movimiento(Tablero tablero)
        {
            Posicion posicion = null;
            Boolean  movimientoValido = false, pasa = false;
            int      piezasComidas = 0;

            /* Pedimos posición de juego al jugador hasta que la que
             * introduzca cumpla con las reglas del juego */
            do
            {
                posicion = ElegirPosicion(tablero);

                if (posicion.Col == 0)
                {
                    if (posicion.Row == 0)
                    {
                        pasa = true;
                        break;
                    }
                }
                movimientoValido = ComprobarJugada(tablero, posicion, color);

                if (!movimientoValido)
                {
                    Console.WriteLine("Jugada " +
                                      "INCORRECTA. Vuelve a introducir posición.");
                }
            } while (!movimientoValido);

            /* Cambiamos de color las fichas 'comidas' y colocamos la pieza
             * en la posición elegida en caso de no pasar turno */
            if (!pasa)
            {
                Reglas.CambioDeColor(tablero, color, posicion.Row,
                                     posicion.Col, out piezasComidas);
                ActualizarTablero(tablero, posicion.Row, posicion.Col);
            }
        }
예제 #4
0
        /// <summary>
        /// Comprobamos la matriz de registro de piezas comidas, y devolvemos
        /// la mejor posición para colocar la pieza
        /// </summary>
        /// <returns>Posición óptima</returns>
        private Posicion ComprobarMejorPosicion()
        {
            Posicion posicion = new Posicion();

            int rowMax = 1, colMax = 1;

            for (int row = 1; row < 9; row++)
            {
                for (int col = 1; col < 9; col++)
                {
                    if (fichasComidas[row, col] > fichasComidas[rowMax, colMax])
                    {
                        rowMax = row;
                        colMax = col;
                    }
                }
            }

            posicion.Row = rowMax;
            posicion.Col = colMax;

            return(posicion);
        }
예제 #5
0
        /// <summary>
        /// Buscamos posición que genere una mayor ganancia de piezas del
        /// rival
        /// </summary>
        /// <param name="tablero">Tablero del que queremos obtener
        /// distintas opciones de juego</param>
        /// <param name="profundidad">rango de movimientos máximos que
        /// podemos simular en cascada</param>
        /// <returns></returns>
        public Posicion ElegirPosicion_bis(Tablero tablero)
        {
            int      piezasComidas;
            int      row, col;
            Posicion posicionElegida = new Posicion();
            Tablero  tableroCopia    = new Tablero();

            tableroCopia.Copiar(tablero);

            foreach (Posicion posicion in posicionesValidas)
            {
                Reglas.CambioDeColor(tableroCopia, color, posicion.Row,
                                     posicion.Col, out piezasComidas);
                row = posicion.Row;
                col = posicion.Col;

                fichasComidas[row, col] += piezasComidas;
            }
            ImprimirMatriz();
            posicionElegida = ComprobarMejorPosicion();

            return(posicionElegida);
        }
예제 #6
0
        /// <summary>
        /// Método donde decidimos la forma de actual de la IA.
        /// En este caso, elgimos de forma aleatoria entre las posiciones
        /// válidas
        /// </summary>
        /// <returns>Posicion elegida</returns>
        public Posicion ElegirPosicion(Tablero tablero)
        {
            Random   random   = new Random(Guid.NewGuid().GetHashCode());
            Posicion posicion = new Posicion();
            int      posicionElegida;

            if (posicionesValidas.Count != 0)
            {
                posicionElegida = random.Next(1, posicionesValidas.Count);
            }
            else
            {
                posicionElegida = 0;
                posicion.Col    = 0;
                posicion.Row    = 0;
            }
            for (int i = 0; i < posicionElegida; i++)
            {
                posicion = new Posicion();
                posicion = (Posicion)posicionesValidas.Dequeue();
            }

            return(posicion);
        }