Juego de Ajedrez en Visual C++

Por:ivancp, enviado 14 mar 2004

Utilizar el Mouse para mover las piezas

Antes de continuar debemos definir algunas variables que nos ayudarán a manipular los eventos, estas variables deben definirse dentro de la clase CAjedrezView para tenerlas disponibles en todo momento.

Code: Seleccionar todo
  1. class CAjedrezView : public CView

  2. {

  3.     ...

  4.  

  5.     POINT m_celdaSel;

  6.     POINT m_celdaCursor;

  7.     bool m_bFichaSeleccionada;

  8.     bool m_bTurnoBlancas;

  9.  

  10.     ...

  11. }



Algunas aclaraciones sobre las variables:

  • La variable m_celdaSel es de tipo POINT y ahí guardaremos la celda seleccionada para ser movida en el siguiente clic.
  • En la variable m_celdaCursor guardaremos las coordenadas de la celda sobre la cual esta el cursor del Mouse, para dibujar un borde amarillo en pantalla.
  • La variable booleana m_FichaSeleccionada será un indicador que nos permitirá verificar si hay una ficha seleccionada para moverla, esto nos evitará varias líneas de código para verificar si ha habido una movida antes que la actual. Esta variable se inicializa en false por que al principio no hay fichas seleccionadas.
  • La variable m_bTurnoBlancas decidirá el turno actual, esta variable se inicializará en verdadero (true) por que las reglas del ajedrez indican que primero empiezan las blancas. Si esta variable es false entonces obviamente le toca a equipo negro.

OnMouseMove

Para activar el uso del Mouse solo tenemos que hacer clic en las propiedades de la clase CAjedrezView y buscar los eventos WM_MOUSEMOVE y WM_LMOUSEDOWN, opcionalmente también utilizaremos el evento WM_KEYDOWN para interceptar la tecla de escape.

ajedrez-13.jpg
Agregar Función OnMouseMove


La función OnMouseMove, esta función nos ayudará a identificar la celda sobre la cual esta el puntero del Mouse. La secuencia del código fuentes es como sigue:
  1. Inicialmente crearemos las variables de las coordenadas inicializadas en -1 al principio.
  2. Luego transformaremos las coordenadas actuales de píxeles a posiciones de la matriz de piezas dividiendo las coordenadas entre 60.
  3. Luego verificamos si las coordenadas transformadas están dentro del margen permitido.
    1. Si están dentro del margen permitido y si han cambiado respecto a las coordenadas anteriores entonces cambiamos la celda de cursor a la posición actual.
    2. Caso contrario modificamos la celda de cursor a -1,-1 para evitar que se vea en pantalla.

Sin tantas complicaciones podemos escribir este codigo para el algoritmo anterior:

Code: Seleccionar todo
  1. void CAjedrezView::OnMouseMove(UINT nFlags, CPoint point)

  2. {

  3.     static int x = -1;

  4.     static int y = -1;

  5.  

  6.     x = (point.x - MARGEN)/60;

  7.     y = (point.y - MARGEN)/60;

  8.  

  9.     if(x >= 0 && y >= 0 && x<8 && y<8)

  10.     {

  11.         if(x != m_celdaCursor.x || y != m_celdaCursor.y )

  12.         {

  13.             m_celdaCursor.x = x;

  14.             m_celdaCursor.y = y;

  15.  

  16.             Invalidate();

  17.         }

  18.     }

  19.     else

  20.     {

  21.         x=-1;

  22.         y=-1;

  23.         if(x != m_celdaCursor.x || y != m_celdaCursor.y )

  24.         {

  25.             m_celdaCursor.x = -1;

  26.             m_celdaCursor.y = -1;

  27.  

  28.             Invalidate();

  29.         }

  30.     }

  31.  

  32.     CView::OnMouseMove(nFlags, point);

  33. }

  34.  



OnLButtonDown

La función OnLButtonDown (Al presional el boton izquierdo del mouse) , se hace la misma verificación de las coordenadas pero esta vez se invoca a la función MoverFicha, La función MoverFicha la veremos mas adelante.

Code: Seleccionar todo
  1. void CAjedrezView::OnLButtonDown(UINT nFlags, CPoint point)

  2. {

  3.     static int x = -1;

  4.     static int y = -1;

  5.  

  6.     x = (point.x - MARGEN)/60;

  7.     y = (point.y - MARGEN)/60;

  8.  

  9.     if(x >= 0 && y >= 0 && x<8 && y<8)

  10.     {

  11.         MoverFicha(x,y);

  12.     }

  13.     CView::OnLButtonDown(nFlags, point);

  14. }



Modificar la funcion DibujarTablero

Debemos agregar líneas de código a la función DibujarTablero para ver los efectos:

Code: Seleccionar todo
  1. void CAjedrezView::DibujarTablero(CDC* pDC)

  2. {

  3.     ...

  4.     for(int i = 0 ; i < CELDAS ; i++)

  5.     {

  6.         for(int j = 0 ; j < CELDAS ; j++)

  7.         {

  8.  

  9.             ...

  10.  

  11.             if(m_celdaSel.x == j && m_celdaSel.y == i)

  12.             {

  13.                 CBrush *pFondoAnterior = pDC->SelectObject(&brSeleccion);

  14.                 pDC->Rectangle(&rcCelda);

  15.                 pDC->SelectObject(pFondoAnterior);

  16.             }

  17.  

  18.             ...

  19.         }

  20.     }

  21.  

  22.     if(m_celdaCursor.x >= 0 && m_celdaCursor.y >= 0)

  23.     {

  24.         rcCelda.left  = m_celdaCursor.x*TAMCELDA + MARGEN;

  25.         rcCelda.top   = m_celdaCursor.y*TAMCELDA + MARGEN;  

  26.         rcCelda.right = rcCelda.left + TAMCELDA;

  27.         rcCelda.bottom = rcCelda.top + TAMCELDA;

  28.  

  29.         CPen *pAnterior = pDC->SelectObject(&penAmarillo);

  30.         pDC->MoveTo(rcCelda.left,rcCelda.top);

  31.         pDC->LineTo(rcCelda.right,rcCelda.top);

  32.         pDC->LineTo(rcCelda.right,rcCelda.bottom);

  33.         pDC->LineTo(rcCelda.left,rcCelda.bottom);

  34.         pDC->LineTo(rcCelda.left,rcCelda.top);

  35.         pDC->SelectObject(pAnterior);

  36.     }

  37.     pDC->SelectObject(penAnterior);

  38. }

  39.  


Archivos Adjuntos

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

Otros Artículos en esta sección

  • Pupiletras: Generación y resolución - Visual C++
    Hola a todos de nuevo fanáticos de la programación les presento un programa que genera un pupiletras o sopa de letras a partir de palabras al azar.
    Por: Lizardo, 2004-03-14
  • Calculadora en Visual C++
    Es un tutorial sobre como implementar una calculadora científica desde cero con Visual C++ con MFC. También se implementa el calculo de algunas funciones matemáticas.
    Por: ivancp, 2008-05-03
  • Juego de la Serpiente en Visual C++
    Se trata de un juego donde hay una serpiente que esta en constante movimiento, cuando come algo crece, el juego termina cuando la serpiente ya no tiene espacio.
    Por: ivancp, 2004-03-27
¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro de Visual C++ »