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

  • Personal Pack para OpenGL
    Se trata de un pequeño pack sobre OpenGL que he compilado para ustedes. Pueden utilizar estas librerías para sus proyectos.
    Por: MicroLogic©Software, 2011-09-01
  • Shell para Simulación
    Shell para Simulación es una herramienta donde el usuario de manera interactiva puede modelar sistemas reales y definir sus características. La herramienta está orientada a la simulación de sistemas dinámicos y estocásticos que cambian de manera discreta.
    Por: nazg, 2006-03-18
  • LaPetite - La Aplicación MFC mas Pequeña
    ¿Es posible Incluir todo un proyecto MFC en un solo Archivo? Pues parece que sí, este articulo te muestra como.
    Por: MicroLogic©Software, 2006-03-02
¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro de Visual C++ »