Juego de ajedrez en Visual C++


Ir a Github  Download

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.

class CAjedrezView : public CView
{
    ...
 
    POINT m_celdaSel;
    POINT m_celdaCursor;
    bool m_bFichaSeleccionada;
    bool m_bTurnoBlancas;
 
    ...
}

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.

Agregando 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:

void CAjedrezView::OnMouseMove(UINT nFlags, CPoint point)
{
    static int x = -1;
    static int y = -1;
 
    x = (point.x - MARGEN)/60;
    y = (point.y - MARGEN)/60;
 
    if(x >= 0 && y >= 0 && x<8 && y<8)
    {
        if(x != m_celdaCursor.x || y != m_celdaCursor.y )
        {
            m_celdaCursor.x = x;
            m_celdaCursor.y = y;
 
            Invalidate();
        }
    }
    else
    {
        x=-1;
        y=-1;
        if(x != m_celdaCursor.x || y != m_celdaCursor.y )
        {
            m_celdaCursor.x = -1;
            m_celdaCursor.y = -1;
 
            Invalidate();
        }
    }
 
    CView::OnMouseMove(nFlags, point);
}

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.

void CAjedrezView::OnLButtonDown(UINT nFlags, CPoint point)
{
    static int x = -1;
    static int y = -1;
 
    x = (point.x - MARGEN)/60;
    y = (point.y - MARGEN)/60;
 
    if(x >= 0 && y >= 0 && x<8 && y<8)
    {
        MoverFicha(x,y);
    }
    CView::OnLButtonDown(nFlags, point);
}

Modificar la funcion DibujarTablero

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

void CAjedrezView::DibujarTablero(CDC* pDC)
{
    ...
    for(int i = 0 ; i < CELDAS ; i++)
    {
        for(int j = 0 ; j < CELDAS ; j++)
        {
 
            ...
 
            if(m_celdaSel.x == j && m_celdaSel.y == i)
            {
                CBrush *pFondoAnterior = pDC->SelectObject(&brSeleccion);
                pDC->Rectangle(&rcCelda);
                pDC->SelectObject(pFondoAnterior);
            }
 
            ...
        }
    }
 
    if(m_celdaCursor.x >= 0 && m_celdaCursor.y >= 0)
    {
        rcCelda.left  = m_celdaCursor.x*TAMCELDA + MARGEN;
        rcCelda.top   = m_celdaCursor.y*TAMCELDA + MARGEN;  
        rcCelda.right = rcCelda.left + TAMCELDA;
        rcCelda.bottom = rcCelda.top + TAMCELDA;
 
        CPen *pAnterior = pDC->SelectObject(&penAmarillo);
        pDC->MoveTo(rcCelda.left,rcCelda.top);
        pDC->LineTo(rcCelda.right,rcCelda.top);
        pDC->LineTo(rcCelda.right,rcCelda.bottom);
        pDC->LineTo(rcCelda.left,rcCelda.bottom);
        pDC->LineTo(rcCelda.left,rcCelda.top);
        pDC->SelectObject(pAnterior);
    }
    pDC->SelectObject(penAnterior);
}
3 Respuestas a “Juego de ajedrez en Visual C++”
  1. Luis De Anda 8 Ene 2018
    1 Reply

    Hola amigo como estas, oye estoy interesado en una plataforma de juegos, ajedrez, damas inglesas, bagkammon y dominó, me gustaría platicar contigo haber si estas interesado, que tengas un excelente día

Dejar una Respuesta