/// <summary> /// Comprobación mediante las reglas del juego de que la posición /// elegida por el jugador es legal /// </summary> /// <param name="row">Fila</param> /// <param name="col">Columna</param> /// <param name="color">Color del jugador del cuál estamos comprobando /// la jugada</param> /// <returns>Booleano indicando si se cumplen o no las reglas /// del juego</returns> public static Boolean PosicionLegal(Tablero tablero, int row, int col, Color color) { /* Lo primero, rechazamos el movimiento si la posición ya está * ocupada */ if (tablero.GetBoard()[row, col] != (char)Color.VACIO) { return(false); } /* Ahora contamos número de fichas blancas y negras alrededor de * la posición que estamos comprobando para usarlo después */ int countBlancas = 0, countNegras = 0; for (int i = row - 1; i < row + 2; i++) { for (int j = col - 1; j < col + 2; j++) { if (i == row && j == col) { continue; } if (tablero.GetBoard()[i, j] == (char)Color.BLANCO) { countBlancas++; } else if (tablero.GetBoard()[i, j] == (char)Color.NEGRO) { countNegras++; } } } /* Si tenemos alrededor de la ficha tanto fichas blancas como * negras, el movimiento siempre será válido */ if (countBlancas > 0 && countNegras > 0) { return(true); } /* Si alrededor no hay fichas, posición incorrecta */ if (countBlancas == 0 && countNegras == 0) { return(false); } /* Comprobación de la legalidad del movimiento para cada jugador * en función de su color */ if (color.Equals(Color.BLANCO) && countNegras > 0) { return(true); } if (color.Equals(Color.NEGRO) && countBlancas > 0) { return(true); } return(false); }
/// <summary> /// Núcleo de la partida. Pedimos tipo de jugadores, vamos turnando /// entre ellos, etc. /// </summary> public void Partida() { Boolean terminada = false, pasan = false; int nivel1, nivel2; char[,] boardAnterior = new char[10, 10]; tablero = new Tablero(); tablero.Inicio(); MostrarMensajeInicial(); Opciones.SeleccionJugadores(out pl1, out pl2, out nivel1, out nivel2); tablero.MostrarTablero(); Participante jugador1 = FactoriaJugador.NewInstance(pl1, nivel1); Participante jugador2 = FactoriaJugador.NewInstance(pl2, nivel2); do { boardAnterior = (char[, ])tablero.GetBoard().Clone(); Console.WriteLine("MOVIMIENTO JUGADOR 1 --------------\n"); EjecutarJugada(jugador1); Console.WriteLine("MOVIMIENTO JUGADOR 2 --------------\n"); EjecutarJugada(jugador2); ContarFichas(); terminada = ComprobarFinDePartida(); pasan = ComprobarPasaDosTurnosSeguidos(boardAnterior); } while (!terminada && !pasan); DeterminarGanador(); Console.WriteLine("Presione tecla para salir..."); Console.Read(); }
/// <summary> /// Comprobamos, en las direcciones en las que es posible el movi- /// miento, si podemos comernos piezas del jugador contrario por /// haber en dicha dirección alguna pieza nuestra /// </summary> /// <param name="tablero">Tablero en la situación actual de juego /// </param> /// <param name="color">Color del jugador</param> /// <param name="modH">Modificador de fila, marca la dirección /// horizontal en la cual buscar</param> /// <param name="modV">Modificar de columna, marca la dirección /// vertical en la cual buscar</param> /// <param name="row">Fila</param> /// <param name="col">Columna</param> public static void ComprobarDireccion(Tablero tablero, Color color, int modH, int modV, int row, int col, out int piezasComidas) { piezasComidas = 0; Boolean seguirBuscando = true; int posH = row, posV = col; do { posH += modH; posV += modV; seguirBuscando = ComprobarCasilla(tablero, color, posH, posV); piezasComidas++; } while (seguirBuscando); piezasComidas--; /* Si hemos encontrado una pieza de nuestro mismo color en la * dirección que estamos comprobando, podemos cambiar las piezas * que haya de distinto color en esa dirección */ if (tablero.GetBoard()[posH, posV] == (char)color) { /* Procedemos a deshacer el camino cambiando las piezas hasta * que lleguemos a la posición de partida */ while (posH != row || posV != col) { posH -= modH; posV -= modV; tablero.SetBoard(posH, posV, color); } } }
/// <summary> /// Método para contar el número de fichas de cada color que hay sobre /// el tablero /// </summary> private void ContarFichas() { this.countBlancas = this.countNegras = 0; for (int row = 1; row < 9; row++) { for (int col = 1; col < 9; col++) { if (tablero.GetBoard()[row, col] == (char)Color.BLANCO) { countBlancas++; } else if (tablero.GetBoard()[row, col] == (char)Color.NEGRO) { countNegras++; } } } }
public void Copiar(Tablero tablero) { for (int row = 1; row < 9; row++) { for (int col = 1; col < 9; col++) { this.board[row, col] = tablero.GetBoard()[row, col]; } } }
/// <summary> /// Comprobamos si una casilla cumple no estar vacía y ser de color /// distinto a la del jugador, es decir, si es susceptible de ser /// 'comida' por el jugador /// </summary> /// <param name="tablero">Tablero en su situación actual</param> /// <param name="color">Color del jugador</param> /// <param name="row">Fila</param> /// <param name="col">Columna</param> /// <returns>True en caso de ser casilla susceptible de ser comida, /// false en caso contrario</returns> private static Boolean ComprobarCasilla(Tablero tablero, Color color, int row, int col) { return(tablero.GetBoard()[row, col] != (char)color && tablero.GetBoard()[row, col] != (char)Color.VACIO); }