miércoles, 23 de mayo de 2012

Diario Java: Ajedrez parte 1: Evaluar Reina Bloqueada


                                                           22-05-12   ----   Martes 4:27pm 

Buenas!!!! mis queridos lectores, Hoy empezaré con mi diario de este programa ISChess  (ISC - por ing. en sistemas computacionales), (Chess - Ajedrez en Inglés)
... ...  bonito ¿verdad? xD

Para entender este programa necesitas tener conocimientos en...
 -Fundamentos de programación.
-POO
- Librerias Swing y Awt.
- usar NetBeans

Como lo comenté en este post sólo voy a describir lo que yo haga... y empezaré con...

EVALUAR SI LA REINA SE PUEDE MOVER - una parte para saber si el rey está ahogado,

Lo que me pide mi compañero Chuy (El encargado de evaluar ahogado) es una variable booleana que le haga saber si mi reina se puede mover, para esto necesito...
                                1  - Saber si otras piezas amigas bloquean movimiento de Dama.
                                2 - Saber si mi reina esta clavada, y no puedo moverme por
                                     el camino de mi atacante, o comerlo.

Hagamos el punto 1,... como ya hice esa parte en la torre (esta pieza me ha tocado) y mi compañero Tavo ya lo hizo en el alfil, mi trabajo es juntar esas diferentes lógicas en la clase de la Reina... veamos como nos queda adaptando el código de la torre...

Solo evaluaré a la reina blanca,... si sale bien lo haré lo mismo en la negra
Es el movimiento de la torre, asi que solo el movimiento horizontal y vertical de la reina

Muy bien,.. Este es el primer código:

*********************************************************************************
... .... ... 
    //a calcular ahogados
    ///DECLARAcion de las variables que necesito
    //
    public static int aDB[][]=new int [8][8]; //**Matriz de la reina blanca,
    public static int aDN[][]=new int [8][8]; //** de la negra    //solo con fines ilustrativos, no forma parte de..
    public static boolean bloqueDN;  //** bandera que me dice si Reina negra esta bloqueada
    public static boolean bloque; //**Bandera que me dice si reina blanca esta bloqueada


    //**Método que limpia la matriz, y inicializa el Bloqueo en true,
    public void limpiaATB(){
        for(int ii=0;ii<8;ii++){
            for(int jj=0;jj<8;jj++){
                aDB[ii][jj]=0;
            }
        }
        bloque=true;
    }

//**PosiciónPiezas[][] parámetro que viene de la clase tablero,
//**Es el nombre de la pieza, i y j son las posiciones que se está leyendo
//    
    public void verificaAhogadoB(String posicionPiezas[][], int i, int j){ 
       
        fil=i+1; //**esta evaluando una casilla abajo de la reina
        colum=j;
        if(fil<8&&colum<8){
            if(posicionPiezas[fil][colum]==""||posicionPiezas[fil][colum].contains("N")){
                aDB[fil][colum]=1;
                bloque=false;
            }
        }
   
    //** solo se evalua una casilla despues de la reina, si se puede mover a cualquiera de esas, La Dama se puede mover
    //**las primeras condiciones verifican que esté dentro del rango de la matriz
    //** las segundas que la posición esté vacia o contenga una pieza contraria
    //** Si esto pasa, significa que la pieza no está bloqueada y bloque=false
    //**

        fil=i-1;
        colum=j;
        if(fil>=0&&colum>=0){
            if(posicionPiezas[fil][colum]==""||posicionPiezas[fil][colum].contains("N")){
                aDB[fil][colum]=1;
                bloque=false;
            }
        }
       
         fil=i;
        colum=j+1;
        //
        if(fil>=0&&colum<8){
            if(posicionPiezas[fil][colum]==""||posicionPiezas[fil][colum].contains("N")){
                aDB[fil][colum]=1;
                bloque=false;
            }
        }//
       
        fil=i;
        colum=j-1;//
        if(fil<8&&colum>=0){
            if(posicionPiezas[fil][colum]==""||posicionPiezas[fil][colum].contains("N")){
                aDB[fil][colum]=1;
                bloque=false;
            }
        }
    }
**********************************************************************************

Yeah!! se Crea un metodo mostrar para imprimir la matriz en pantalla y saber si esta correcta la evaluación de bloqueo, Estos métodos se mandan llamar en esa misma clase (la de la Reina)
, el método se llama movimientos futuros, y es el que utilizamos para saber en donde posiblemente se puede mover una pieza...

****************************************************************************
-----------
.......
//Futuro
       public void futuroPieza(String posicionPiezas[][], String piezasClavadas[], boolean movimientosFC, int piezas){
    //**Parámetros de la clase tablero, donde toma el nombre de las piezas
            llenarDamaB();
            llenarDamaN();

             limpiaATB(); //**Nuestro método inicializador

            limpiaATN();

    //** Ciclos para buscar la pieza
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if (movimientosFC==true) {
                        if (posicionPiezas[i][j]=="DB") {
                            futuroB(posicionPiezas,i,j);

                            verificaAhogadoB(posicionPiezas,i,j); //**Aqui mandamos llamar nuestro método largo,
                                //**si la pieza que encontró es Reina Blanca


                        }if (posicionPiezas[i][j]=="DN") {
                            futuroN(posicionPiezas,i,j);
                            verificaAhogadoN(posicionPiezas,i,j);
                        }
                    }else{
                        buscarPiezaClavadaA(piezasClavadas, piezas);
                        if (posicionPiezas[i][j]=="DB"&&db==false) {
                            futuroB(posicionPiezas,i,j);

                            verificaAhogadoB(posicionPiezas,i,j);//**Aqui mandamos llamar nuestro método largo,
                                //**si la pieza que encontró es Reina Blanca

                        }if (posicionPiezas[i][j]=="DN"&&dn==false) {
                            futuroN(posicionPiezas,i,j);
                            verificaAhogadoN(posicionPiezas,i,j);
                        }
                    }
                   
                }
            }

            mostrar(); //Verémos en pantalla la matriz y como esta la boolenada bloqueo...
     }

*********************************************************************************
Ahora verémos el resultado ejecutando el programa...





En esta imagen pueden ver que la reina no se puede mover... por lo tanto la variable bloqueo debe ser true,




Ignoren lo demás, solo vean que la matriz está toda en ceros yeah! osease que no se pude mover la reina, por lo tanto "Bloqueado Queen !!" está en true


Aquí el Peón blanco a dejado camino libre a la reina,  debe poder moverse...osease, nuestra variable debe quedar en false;

y en efecto así es, nótese en la matriz, que hay un "1" enfrente de la reina, solo indica que puede salir por allí.

Verificamos que en frente si sirve nuestra lógica, ahora hay que verificar que sirva en los demás lados...

Aqui arriba de la reina no debería aparecer 1, puesto que hay un peon impidiendo que pase

y en efecto así es, yujú!!!, ya tenemos " Verificar si la reina se puede mover" con movimientos de torre...

ahora hay que agregar el código de mi compañero Tavo para añadir el movimiento del Alfil... pero eso será en otra entrada xDDD

Nos leemos luego compañeros!! Recuerden visitar mis otras entradas (sobre todo de las ptc)... Cualquier duda, solo haganmela saber,...

Saludos y de rato!!!



No hay comentarios:

Publicar un comentario