/** * Esta función comprueba si hay celdas afectadas. * En ese caso, las pasa a una variable global pública. * @param celda de la jugada que vamos a comprobar. * @return boolean dependiendo de si hay celdas afectadas o no. */ public bool comprobarSiHayCeldasAfectadas(Celda celda) { //Posibles celdas en donde buscará continuar //Son las colindantes con ficha del oponente List<Celda> viasTemporales = new List<Celda>(); //Celdas que igual cambiamos o igual no. List<Celda> tmpCeldasFinales; //Rotaciones que debemos hacer para recorrer una fila, columna o diagonal int x_rotar, y_rotar, x_base_rotar, y_base_rotar; //Inicializamos outputceldas para que se vacie. outputCeldas = new List<Celda>(); int[,] posiciones = new int[8, 2]; posiciones[0, 0] = -1; posiciones[0, 1] = -1; posiciones[1, 0] = -1; posiciones[1, 1] = 0; posiciones[2, 0] = -1; posiciones[2, 1] = 1; posiciones[3, 0] = 0; posiciones[3, 1] = -1; posiciones[4, 0] = 0; posiciones[4, 1] = 1; posiciones[5, 0] = 1; posiciones[5, 1] = -1; posiciones[6, 0] = 1; posiciones[6, 1] = 0; posiciones[7, 0] = 1; posiciones[7, 1] = 1; //Visitamos todas las posibles posiciones en las que puede seguir la fila for(int a=0;a<8;a++) if (celda.getY() + posiciones[a, 0] >= 0 && celda.getY() + posiciones[a, 0] < tamaño && celda.getX() + posiciones[a, 1] >= 0 && celda.getX() + posiciones[a, 1] < tamaño && getCelda(celda.getY() + posiciones[a, 0], celda.getX() + posiciones[a, 1]).getFicha() == Jugador.fichaOponente(celda.getFicha())) viasTemporales.Add(new Celda(celda.getY() + posiciones[a, 0], celda.getX() + posiciones[a, 1], getCelda(celda.getY() + posiciones[a, 0], celda.getX() + posiciones[a, 1]).getFicha())); //Hasta este momento hemos obtenido las direcciones de las celdas a las que podemos ir en busca de una ruta a voltear. foreach (Celda viatemporal in viasTemporales) { tmpCeldasFinales = new List<Celda>(); //Obtenemos una base con la que iremos permutando x_base_rotar = viatemporal.getX() - celda.getX(); y_base_rotar = viatemporal.getY() - celda.getY(); x_rotar = x_base_rotar; y_rotar = y_base_rotar; //Por si no entramos en el while, hay que aumentarlas igualmente /*if (!(celda.getY() + y_rotar >= 0 && celda.getY() + y_rotar < tamaño && celda.getX() + x_rotar >= 0 && celda.getX() + x_rotar < tamaño && getCelda(celda.getY() + y_rotar, celda.getX() + x_rotar).getFicha() == Jugador.fichaOponente(celda.getFicha()))) { y_rotar += y_base_rotar; x_rotar += x_base_rotar; }*/ //En este while vamos buscando rutas while (celda.getY() + y_rotar >= 0 && celda.getY() + y_rotar < tamaño && celda.getX() + x_rotar >= 0 && celda.getX() + x_rotar < tamaño && getCelda(celda.getY() + y_rotar, celda.getX() + x_rotar).getFicha() == Jugador.fichaOponente(celda.getFicha())) { //Vamos añadiendo celdas y vamos rotando para hacernos con esa línea tmpCeldasFinales.Add(new Celda(celda.getY() + y_rotar, celda.getX() + x_rotar, celda.getFicha())); y_rotar += y_base_rotar; x_rotar += x_base_rotar; } //Una vez llegado al limite, comprobamos si la ficha que hemos encontrado es nuestra //En tal caso, volteamos todo if (celda.getX() + x_rotar >= 0 && celda.getX() + x_rotar < tamaño && celda.getY() + y_rotar >= 0 && celda.getY() + y_rotar < tamaño && (getCelda(celda.getY() + y_rotar, celda.getX() + x_rotar).getFicha() == celda.getFicha())) { //Añadimos la celda actual outputCeldas.Add(celda); //Y las celdas que hemos obtenido (su ruta) outputCeldas.AddRange(tmpCeldasFinales); } } //foreach //Dependiendo de si tenemos algo en el output, devolvemos true o false. if (outputCeldas.Count != 0) return true; return false; }
/** * Esta función comprueba si hay celdas afectadas. * En ese caso, las pasa a una variable global pública. * @param celda de la jugada que vamos a comprobar. * @return boolean dependiendo de si hay celdas afectadas o no. */ public bool comprobarSiHayCeldasAfectadas(Celda celda) { //Posibles celdas en donde buscará continuar //Son las colindantes con ficha del oponente List <Celda> viasTemporales = new List <Celda>(); //Celdas que igual cambiamos o igual no. List <Celda> tmpCeldasFinales; //Rotaciones que debemos hacer para recorrer una fila, columna o diagonal int x_rotar, y_rotar, x_base_rotar, y_base_rotar; //Inicializamos outputceldas para que se vacie. outputCeldas = new List <Celda>(); int[,] posiciones = new int[8, 2]; posiciones[0, 0] = -1; posiciones[0, 1] = -1; posiciones[1, 0] = -1; posiciones[1, 1] = 0; posiciones[2, 0] = -1; posiciones[2, 1] = 1; posiciones[3, 0] = 0; posiciones[3, 1] = -1; posiciones[4, 0] = 0; posiciones[4, 1] = 1; posiciones[5, 0] = 1; posiciones[5, 1] = -1; posiciones[6, 0] = 1; posiciones[6, 1] = 0; posiciones[7, 0] = 1; posiciones[7, 1] = 1; //Visitamos todas las posibles posiciones en las que puede seguir la fila for (int a = 0; a < 8; a++) { if (celda.getY() + posiciones[a, 0] >= 0 && celda.getY() + posiciones[a, 0] < tamaño && celda.getX() + posiciones[a, 1] >= 0 && celda.getX() + posiciones[a, 1] < tamaño && getCelda(celda.getY() + posiciones[a, 0], celda.getX() + posiciones[a, 1]).getFicha() == Jugador.fichaOponente(celda.getFicha())) { viasTemporales.Add(new Celda(celda.getY() + posiciones[a, 0], celda.getX() + posiciones[a, 1], getCelda(celda.getY() + posiciones[a, 0], celda.getX() + posiciones[a, 1]).getFicha())); } } //Hasta este momento hemos obtenido las direcciones de las celdas a las que podemos ir en busca de una ruta a voltear. foreach (Celda viatemporal in viasTemporales) { tmpCeldasFinales = new List <Celda>(); //Obtenemos una base con la que iremos permutando x_base_rotar = viatemporal.getX() - celda.getX(); y_base_rotar = viatemporal.getY() - celda.getY(); x_rotar = x_base_rotar; y_rotar = y_base_rotar; //Por si no entramos en el while, hay que aumentarlas igualmente /*if (!(celda.getY() + y_rotar >= 0 && celda.getY() + y_rotar < tamaño && celda.getX() + x_rotar >= 0 && celda.getX() + x_rotar < tamaño && * getCelda(celda.getY() + y_rotar, celda.getX() + x_rotar).getFicha() == Jugador.fichaOponente(celda.getFicha()))) * { * y_rotar += y_base_rotar; * x_rotar += x_base_rotar; * }*/ //En este while vamos buscando rutas while (celda.getY() + y_rotar >= 0 && celda.getY() + y_rotar < tamaño && celda.getX() + x_rotar >= 0 && celda.getX() + x_rotar < tamaño && getCelda(celda.getY() + y_rotar, celda.getX() + x_rotar).getFicha() == Jugador.fichaOponente(celda.getFicha())) { //Vamos añadiendo celdas y vamos rotando para hacernos con esa línea tmpCeldasFinales.Add(new Celda(celda.getY() + y_rotar, celda.getX() + x_rotar, celda.getFicha())); y_rotar += y_base_rotar; x_rotar += x_base_rotar; } //Una vez llegado al limite, comprobamos si la ficha que hemos encontrado es nuestra //En tal caso, volteamos todo if (celda.getX() + x_rotar >= 0 && celda.getX() + x_rotar < tamaño && celda.getY() + y_rotar >= 0 && celda.getY() + y_rotar < tamaño && (getCelda(celda.getY() + y_rotar, celda.getX() + x_rotar).getFicha() == celda.getFicha())) { //Añadimos la celda actual outputCeldas.Add(celda); //Y las celdas que hemos obtenido (su ruta) outputCeldas.AddRange(tmpCeldasFinales); } } //foreach //Dependiendo de si tenemos algo en el output, devolvemos true o false. if (outputCeldas.Count != 0) { return(true); } return(false); }