Juego de Ajedrez en Visual C++

Por:ivancp, enviado 14 mar 2004

Funciones generales para mover las piezas de ajedrez

Ahora veremos el código mas difícil de hacer, todo lo que hicimos hasta el momento ha estado relativamente fácil comparado con lo que vamos a ver. Pero creo que no va a ser tan dificil por que todo el codigo fuente esta explicado y será pan comido.

Antes de seguir debemos implementar algunas funciones que nos va a permitir controlar todas las movidas. Todo empieza desde la función OnLButtonDown que invoca a la función MoverFicha.

Función MoverFicha


Algoritmo:
  1. Si hay una ficha seleccionada.
    1. Si la celda es nula o es del otro equipo, entonces intentamos mover la pieza.
    2. Sino, mostramos el mensaje “Movida no permitida” y volvemos a esperar la movida del usuario.
  2. Sino
    1. Si la celda esta vacía, no hacemos nada.
    2. Si la pieza corresponde al turno es el correcto:
      1. Cambiamos la variable m_celdaSel con la posición actual.
      2. Levantamos el flag m_bFichaSeleccionada
      3. Mostramos un mensaje para hacerle saber al usuario que debe realizar el siguiente paso.
      4. Refrescar la pantalla.

Código fuente de la función MoverFicha

Code: Seleccionar todo
  1. void CAjedrezView::MoverFicha(int x,int y)

  2. {

  3.     if(m_bFichaSeleccionada)

  4.     {

  5.         if(EsCeldaNula(x,y)

  6.             || (!EsPiezaBlanca(x,y) && m_bTurnoBlancas)

  7.             || (EsPiezaBlanca(x,y) && !m_bTurnoBlancas))

  8.         {

  9.             IntentarMovidaHacia(x,y);

  10.         }

  11.         else

  12.         {

  13.             Mensaje("Movida no permitida");

  14.             CancelarMovida();

  15.         }

  16.     }

  17.     else

  18.     {

  19.         if(EsCeldaNula(x,y))

  20.             return;

  21.         if((EsPiezaBlanca(x,y) && m_bTurnoBlancas )

  22.             || (!EsPiezaBlanca(x,y) && !m_bTurnoBlancas))

  23.         {

  24.             m_celdaSel.x = x;

  25.             m_celdaSel.y = y;

  26.             m_bFichaSeleccionada = true;

  27.            

  28.             Mensaje("Presione ESC para cancelar la selección");

  29.  

  30.             Invalidate();

  31.         }

  32.     }

  33. }

  34.  



La función IntentarMovidaHacia

Algoritmo:
  1. Obtener el valor de la celda de la celda seleccionada.
  2. Identificar el tipo de pieza y e invocar a la función que corresponde.
  3. Si hay resultado exitoso al intentar mover la pieza
    1. Mostrar mensaje
    2. Realizar la movida.
  4. Sino
    1. Mostar mensaje de error

Implementación:

Code: Seleccionar todo
  1. void CAjedrezView::IntentarMovidaHacia(int x, int y)

  2. {

  3.     int nPiezaActual = m_pCeldas[m_celdaSel.y][m_celdaSel.x];

  4.  

  5.     bool bSePuedeMover = false;

  6.  

  7.     switch(nPiezaActual)

  8.     {

  9.         case PEONB:

  10.         case PEONN:

  11.             bSePuedeMover = MoverPeonHacia(x,y);

  12.             break;

  13.         case ALFILB:

  14.         case ALFILN:

  15.             bSePuedeMover = MoverAlfilHacia(x,y);

  16.             break;

  17.         case CABALLOB:

  18.         case CABALLON:

  19.             bSePuedeMover = MoverCaballoHacia(x,y);

  20.             break;

  21.         case REYB:

  22.         case REYN:

  23.             bSePuedeMover = MoverReyHacia(x,y);

  24.             break;

  25.         case REINAB:

  26.         case REINAN:

  27.             bSePuedeMover = MoverReinaHacia(x,y);

  28.             break;

  29.         case TORREB:

  30.         case TORREN:

  31.             bSePuedeMover = MoverTorreHacia(x,y);

  32.             break;

  33.     }

  34.  

  35.     if(bSePuedeMover)

  36.     {

  37.         Mensaje("Movida correcta, siguiente jugador");

  38.         RealizarMovida(x, y);

  39.     }

  40.     else

  41.     {

  42.         Mensaje("Movida incorrecta, intenta nuevamente");

  43.         CancelarMovida();

  44.     }

  45. }



La función EsViaLibre


Algoritmo:
  1. Inicialmente obtenemos la diferenca entre las coordenadas, esto nos ayudará a identificar que tipo de movida se ha realizado.
  2. Si la diferencia de las coordenadas x es igual a cero entonces se ha realizado un movimiento vertical.
    • Recorremos todas las celdas que hay entre las dos coordenadas, si encontramos alguna celda con una pieza de ajedrez entonces retornamos false.
  3. Si la diferencia de las coordenadas y es igual a cero entonces se ha realizado un movimiento horizontal.
    • Recorremos todas las celdas que hay entre las dos coordenadas, si encontramos alguna celda con una pieza de ajedrez entonces retornamos false.
  4. Si la diferencia de las coordenas x e y son iguales entonces se ha realizado un movimiento diagonal
    • Recorremos todas las celdas que hay entre las dos coordenadas, si encontramos alguna celda con una pieza de ajedrez entonces retornamos false.
  5. Si al final no se ha determinado que tipo de movimiento se ha realizado entonces se devuelve el valor de ok que en ese punto deberá ser false.

Codigo fuente de la función EsViaLibre

Code: Seleccionar todo
  1. bool CAjedrezView::EsViaLibre(int x, int y)

  2. {

  3.     int dify = y - m_celdaSel.y;

  4.     int difx = x - m_celdaSel.x;

  5.  

  6.     bool ok = true;

  7.  

  8.     if(difx == 0) //Movimiento Vertical

  9.     {        

  10.         for(int i = 1 ; i < abs(dify) ; i++)

  11.         {

  12.             if(m_pCeldas[m_celdaSel.y + (dify<0?-i:i)][m_celdaSel.x] != VACIO)

  13.             {

  14.                 ok = false;

  15.             }

  16.         }

  17.     }

  18.     else if(dify == 0) //Movimiento Horizontal

  19.     {

  20.         for(int i = 1 ; i < abs(difx) ; i++)

  21.         {

  22.             if(m_pCeldas[m_celdaSel.y][m_celdaSel.x + (difx<0?-i:i)] != VACIO )

  23.             {

  24.                 ok = false;

  25.             }

  26.         }        

  27.     }

  28.     else if(abs(difx) == abs(dify)) //Movimiento diagonal

  29.     {

  30.         for(int i = 1 ; i < abs(dify) ; i++)

  31.         {

  32.             if(m_pCeldas[m_celdaSel.y + (dify<0?-i:i)][m_celdaSel.x + (difx<0?-i:i)] != VACIO)

  33.             {

  34.                 ok = false;

  35.             }

  36.         }

  37.     }

  38.     return ok;

  39. }



En adelante, para todos los casos se utilizará la diferencia de coordenadas, por que es una manera facil y rápida de identificar la dirección y tipo de movida.

La función RealizarMovida

Algoritmo:
  1. Cambiar turno de jugador.
  2. Ubicar la pieza de origen a la posición de destino.
  3. Cambiar los valores que tienen que ver con la ficha seleccionada.
  4. Repintar.

Codigo fuente de la función RalizarMovida.

Code: Seleccionar todo
  1. void CAjedrezView::RealizarMovida(int x, int y)

  2. {

  3.     //Cambiar Turno

  4.     m_bTurnoBlancas      = !m_bTurnoBlancas;

  5.  

  6.     //Asignar la pieza de origen al destino

  7.     m_pCeldas[y][x] = m_pCeldas[m_celdaSel.y][m_celdaSel.x];

  8.  

  9.     //TODO: Agregar a la lista de eliminados

  10.     m_pCeldas[m_celdaSel.y][m_celdaSel.x] = VACIO;

  11.  

  12.     //Soltar la ficha seleccionada

  13.     m_bFichaSeleccionada = false;

  14.     m_celdaSel.x = -1;

  15.     m_celdaSel.y = -1;

  16.  

  17.     Invalidate();    

  18. }


Archivos Adjuntos

  • Ajedrez.zip 84,86 KiB
    Código fuente Ajedréz Visual C++ 2005

Otros Artículos en esta sección

¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro de Visual C++ »