Usted no esta registrado, haga click aqui para registrarse!
 Inicio   Artículos   Recursos   Foros 
 

Iniciar sesión

¿No estas registrado?
Registrate en Latindevelopers.com!

 



Usted ha votado: Pobre















Ir a la pagina : [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ]

Juego de Ajedrez en Visual C++

Funciones generales para mover las piezas de ajedrez

Ahora veremos el código mas difícil de hacer, todo lo que hicimos hasta el momento ha estado relativamente fácil comparado con lo que vamos a ver. Pero creo que no va a ser tan dificil por que todo el codigo fuente esta explicado y será pan comido.

Antes de seguir debemos implementar algunas funciones que nos va a permitir controlar todas las movidas. Todo empieza desde la función OnLButtonDown que invoca a la función MoverFicha.

Función MoverFicha

Código fuente de la función MoverFicha

void CAjedrezView::MoverFicha(int x,int y)
{
    if(m_bFichaSeleccionada)
    {
        if(EsCeldaNula(x,y) 
            || (!EsPiezaBlanca(x,y) && m_bTurnoBlancas)
            || (EsPiezaBlanca(x,y) && !m_bTurnoBlancas))
        {
            IntentarMovidaHacia(x,y);
        }
        else
        {
            Mensaje("Movida no permitida");
            CancelarMovida();
        }
    }
    else
    {
        if(EsCeldaNula(x,y))
            return;
        if((EsPiezaBlanca(x,y) && m_bTurnoBlancas )
            || (!EsPiezaBlanca(x,y) && !m_bTurnoBlancas))
        {
            m_celdaSel.x = x;
            m_celdaSel.y = y;
            m_bFichaSeleccionada = true;
            
            Mensaje("Presione ESC para cancelar la selección");

            Invalidate();
        }
    }
}

La función IntentarMovidaHacia



void CAjedrezView::IntentarMovidaHacia(int x, int y)
{
    int nPiezaActual = m_pCeldas[m_celdaSel.y][m_celdaSel.x];

    bool bSePuedeMover = false;

    switch(nPiezaActual)
    {
        case PEONB:
        case PEONN:
            bSePuedeMover = MoverPeonHacia(x,y);
            break;
        case ALFILB:
        case ALFILN:
            bSePuedeMover = MoverAlfilHacia(x,y);
            break;
        case CABALLOB:
        case CABALLON:
            bSePuedeMover = MoverCaballoHacia(x,y);
            break;
        case REYB:
        case REYN:
            bSePuedeMover = MoverReyHacia(x,y);
            break;
        case REINAB:
        case REINAN:
            bSePuedeMover = MoverReinaHacia(x,y);
            break;
        case TORREB:
        case TORREN:
            bSePuedeMover = MoverTorreHacia(x,y);
            break;
    }

    if(bSePuedeMover)
    {
        Mensaje("Movida correcta, siguiente jugador");
        RealizarMovida(x, y);
    }
    else
    {
        Mensaje("Movida incorrecta, intenta nuevamente");
        CancelarMovida();
    }
}

La función EsViaLibre

Codigo fuente de la función EsViaLibre

bool CAjedrezView::EsViaLibre(int x, int y)
{
    int dify = y - m_celdaSel.y;
    int difx = x - m_celdaSel.x;

    bool ok = true;

    if(difx == 0) //Movimiento Vertical
    {        
        for(int i = 1 ; i < abs(dify) ; i++)
        {
            if(m_pCeldas[m_celdaSel.y + (dify<0?-i:i)][m_celdaSel.x] != VACIO)
            {
                ok = false;
            }
        }
    }
    else if(dify == 0) //Movimiento Horizontal
    {
        for(int i = 1 ; i < abs(difx) ; i++)
        {
            if(m_pCeldas[m_celdaSel.y][m_celdaSel.x + (difx<0?-i:i)] != VACIO )
            {
                ok = false;
            }
        }        
    }
    else if(abs(difx) == abs(dify)) //Movimiento diagonal
    {
        for(int i = 1 ; i < abs(dify) ; i++)
        {
            if(m_pCeldas[m_celdaSel.y + (dify<0?-i:i)][m_celdaSel.x + (difx<0?-i:i)] != VACIO)
            {
                ok = false;
            }
        }
    }
    return ok;
}

En adelante, para todos los casos se utilizará la diferencia de coordenadas, por que es una manera facil y rápida de identificar la dirección y tipo de movida.

La función RealizarMovida

Codigo fuente de la función RalizarMovida.

void CAjedrezView::RealizarMovida(int x, int y)
{
    //Cambiar Turno
    m_bTurnoBlancas      = !m_bTurnoBlancas;

    //Asignar la pieza de origen al destino
    m_pCeldas[y][x] = m_pCeldas[m_celdaSel.y][m_celdaSel.x];

    //TODO: Agregar a la lista de eliminados
    m_pCeldas[m_celdaSel.y][m_celdaSel.x] = VACIO;

    //Soltar la ficha seleccionada
    m_bFichaSeleccionada = false;
    m_celdaSel.x = -1;
    m_celdaSel.y = -1;

    Invalidate();    
}

 

Mover las piezas de ajedrez Movida de cada pieza de ajedrez

Descargas

Acerca del Author

Nombre de usuario: latindeveloper
Blog/URL:
Fecha de envío: 2004-03-14
Ultima Actualización:
Visualizaciones: 20337

Comentarios y Consultas

  • Re: Juego de Ajedrez ...
  • Re: Juego de Ajedrez ...
  • Re: Juego de Ajedrez ...
  • Re: Juego de Ajedrez ...
  • Re: Juego de Ajedrez ...

  • + Agregar Comentario/Consulta
    -> Ver todos los comentarios
Nedstat Basic - Web site estadisticas gratuito
El contador para sitios web particulares