Juego de Ajedrez en Visual C++

Por:ivancp, enviado 14 mar 2004

Moviendo cada pieza de ajedrez

Ahora veremos en detalle como podemos controlar la movida de cada pieza de ajedréz.

Movida del peón

Es la movida que parece simple de implementar, pero presenta situaciones especiales.

  1. Obtenemos la diferencia entre las coordenadas de origen y destino.
  2. Si es una movida vertical
    • Si se ha movido un casillero
      • Si la dirección de la movida corresponde al turno, entonces es posible realizar la movida
    • Si se ha movido dos casilleros
      • Si la dirección de la movida corresponde al turno y la pieza del peon aun no se ha movido, entonces es posible realizar la movida
        • Si hay vía libre para realizar la movida, entonces es posible realizar la movida.

  3. Si es un movimiento diagonal y si la orientación de la movida es correcta con el turno y si la celda de destino no esta vacía y si la celda de destino corresponde a una pieza del oponente.
    • Se puede realizar la movida.

Código fuente de la función MoverPeonHacia

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

  2. {

  3.     int dify = y - m_celdaSel.y;

  4.     int difx = x - m_celdaSel.x;

  5.  

  6.     bool bMovidaPosible = false;

  7.  

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

  9.     {        

  10.         if(abs(dify) == 1)//Si mueve un casillero

  11.         {

  12.             if(dify == (EsPiezaBlanca(m_celdaSel.x ,m_celdaSel.y)?-1:1))

  13.             {

  14.                 bMovidaPosible = true;

  15.             }

  16.         }

  17.         else if(abs(dify) == 2) //Movida larga de peon

  18.         {

  19.             if(m_celdaSel.y == (EsPiezaBlanca(m_celdaSel.x ,m_celdaSel.y)?6:1))

  20.             {

  21.                 if(EsViaLibre(x,y))

  22.                     bMovidaPosible = true;

  23.             }

  24.         }

  25.     }

  26.     else if((abs(difx) == 1) // Si esta intentando comer

  27.         && (dify == (EsPiezaBlanca(m_celdaSel.x ,m_celdaSel.y)?-1:1))

  28.         && !EsCeldaNula(x,y)

  29.         && (m_pCeldas[m_celdaSel.y ][m_celdaSel.x] != m_pCeldas[y][x]))

  30.     {

  31.         bMovidaPosible = true;

  32.     }

  33.  

  34.     return bMovidaPosible;

  35. }

  36.  



Movida del alfil

El alfil es una pieza que se mueve diagonalmente, entonces basta con verificar si hay vía libre entre las posiciones.

  1. Obtenemos la diferencia entre las coordenadas de origen y destino.
  2. Si la diferencia de ambas coordenadas son iguales entonces es un movimiento diagonal.
    • Si hay vía libre y la celda de destino esta vacía o corresponde al enemigo
      • Devolver true, indicando que se puede realizar la movida.
  3. Sino, devolver falso.

Código fuente de la función

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

  2. {

  3.     int dify = y - m_celdaSel.y;

  4.     int difx = x - m_celdaSel.x;

  5.  

  6.     if(abs(difx) == abs(dify))

  7.     {

  8.         if(EsViaLibre(x,y) && m_pCeldas[m_celdaSel.y ][m_celdaSel.x] != m_pCeldas[y][x])

  9.         {            

  10.             return true;

  11.         }

  12.     }

  13.     return false;

  14. }



Movida de la torre

La movida de la torre es similar a la del alfil con la diferencia que una de las dos diferencias debe ser cero.

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

  2. {

  3.     int dify = y - m_celdaSel.y;

  4.     int difx = x - m_celdaSel.x;

  5.  

  6.     if((difx == 0) || (dify == 0) )

  7.     {

  8.         if(EsViaLibre(x,y) && m_pCeldas[m_celdaSel.y ][m_celdaSel.x] != m_pCeldas[y][x])

  9.         {            

  10.             return true;

  11.         }

  12.     }

  13.     return false;

  14. }



Movida de la reina

Es mas fácil de lo que parece:

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

  2. {

  3.     return MoverAlfilHacia(x,y) || MoverTorreHacia(x,y);

  4. }



Movida del rey

En esta movida solo hay que verificar que se haya movido un casillero y que la celda de destino sea la del oponente.

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

  2. {

  3.     int dify = y - m_celdaSel.y;

  4.     int difx = x - m_celdaSel.x;

  5.  

  6.     if((abs(difx) == 1) && (abs(dify) == 1) )

  7.     {        

  8.         if(m_pCeldas[m_celdaSel.y ][m_celdaSel.x] != m_pCeldas[y][x])

  9.         {

  10.             return true;

  11.         }

  12.     }

  13.     return false;

  14. }

  15.  


Movida del caballo

Esta movida no se parece a ninguna de las anteriores, es por eso que necesita explicación.

  1. Obtenemos la diferencia entre las coordenadas de origen y destino.
  2. Si la diferencia entre las coordenadas debe ser 2 y 1 para cada caso
    • Si la celda de destino es del oponente o esta en blanco
      • Devolver true indicando que se puede realizar la movida
  3. Sino, retornar false.

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

  2. {

  3.     int dify = y - m_celdaSel.y;

  4.     int difx = x - m_celdaSel.x;

  5.  

  6.     if(((abs(difx) == 2) && (abs(dify) == 1))||((abs(difx) == 1) && (abs(dify) == 2)))

  7.     {

  8.         if(m_pCeldas[m_celdaSel.y ][m_celdaSel.x] != m_pCeldas[y][x])

  9.         {

  10.             return true;

  11.         }

  12.     }

  13.     return false;

  14. }


Es todo!

Ya pueden compilar y ejecutar, sientanse libre de escribir sus comentarios, tampoco se olviden de votar por el articulo.

Archivos Adjuntos

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

Otros Artículos en esta sección

  • NSChart - Visual C++
    Chart para visual c++, control que visualiza gráficos de barra y sectores en un dialogo MFC, puedes utilizarlo en tus aplicaciones para enriquecerlo mostrando histogramas y gráficos de sectores.
    Por: ivancp, 2004-07-26
  • CStatic de colores en Visual C++
    Un control personalizado basado en la clase CStatic en el que se puede cambiar el color de fondo y color texto, es muy útil para darle una apariencia mejorada a nuestras aplicaciones Visual C++
    Por: MicroLogic©Software, 2005-04-20
  • Separador de controles para formularios MFC
    Es un control que nos permite mantener ordenado nuestros diálogos mediante lineas divisoras. No hay una variedad de controles para diálogos MFC, pero con esto puedes poner la diferencia.
    Por: ivancp, 2004-09-20
¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro de Visual C++ »