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

  • Utilizar números decimales en Visual C++
    Un control para el manejo de números decimales en Visual C++, está basado en la clase CEdit, y ha sido modificada para poder manipular y visualizar números decimales en formularios MFC.
    Por: ivancp, 2008-05-11
  • 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
  • Uso de CListCtrl y DAO
    na forma de utilizar el control ActiveX MSFlexGrid en aplicaciones Visual C++ basadas en MFC, este control es útil para visualizar datos.
    Por: MicroLogic©Software, 2005-04-20
¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro de Visual C++ »