![]() |
![]() |
|
|
|
|
|
Usted ha votado: Pobre
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.
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();
}
}
}
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();
}
}
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.
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 |
|
![]() |
![]() |
|||
Comentarios y Consultas
|
||||
![]() |
![]() |