/// <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); }
/// <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); } } } }
/// <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); } }
/// <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); }
/// <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); }
/// <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); }