elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Movimientos de Ajedrez bugueados
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Movimientos de Ajedrez bugueados  (Leído 3,150 veces)
oliverm

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Movimientos de Ajedrez bugueados
« en: 18 Julio 2013, 16:44 pm »

Buenas, actualmente me encuentro aprendiendo C++ (aún no sé mucho, no conozco como usar clases ni sé muy bien aplicar estructuras, pero quise hacer algo más o menos grande para solidificar conocimientos actuales) y estoy haciendo un juego de ajedrez, no pondré todo el código pero ahí va lo importante

Notas para entender el código:
moverPieza, le pregunta a usuario pieza a mover y su destino
p1 y p2 son peones
t1 y t2 son torres ... se entiende lo demas (q reina y k rey)
c2i (función que convierte char en int, para que cuando el usuario seleccione casilla 'a 2' el se vea lo que hay en tablero[0][1])
celdInicLet = celda inicial letra
celdInicNum = celda inicial numero (recordar las coordenadas de un tablero de ajedrez son (letra,numero)


Main:
Código:
int main ()
{
string tablero[8][8]; //definición de tablero

iniciaTablero(tablero);
impTablero(tablero);

while (juegoTerminado(tablero)==false)
{
moverPieza(tablero);
impTablero(tablero);
}



int noTeCierres;                 // truco feo para que no se cierre la consola 
cin>>noTeCierres;

}


Extracto de moverPieza
Código:
...
if (movimientoPieza(c2i(celdInicLet),c2i(celdInicNum),c2i(celdFinLet),c2i(celdFinNum),tablero))
{
tablero[c2i(celdFinLet)][c2i(celdFinNum)]=tablero[c2i(celdInicLet)][c2i(celdInicNum)];
tablero[c2i(celdInicLet)][c2i(celdInicNum)]="  ";
turno=turno*(-1);
}
else
cout<<"Movimiento incorrecto"<<c2i(celdFinLet)<<c2i(celdFinNum)<<c2i(celdInicLet)<<c2i(celdInicNum)<<endl;
}

Ahora, aquí supongo está el bug

función movimientoPieza (es horrible, comprensión por favor estoy aprendiendo)
Código:
bool movimientoPieza (int xinic,int yinic,int xfin, int yfin, string tablero[8][8])  
{
bool saltoPieza=false;
int a;

if (tablero[xinic][yinic]=="p1")
{
a=0;
if (xinic==xfin)
{
if (((yinic+1==yfin)||(yinic-1==yfin))
&&(tablero[xinic][yfin][1]!='2'))
{
a++;
}
if (((yinic+2==yfin)&&(xinic==xfin))
&&(yinic=1)
&&(tablero[xinic][yfin][1]!='2')&&(tablero[xinic][yinic+1]=="  "))
{
a++;
}
if (a>0)
{
return true;
}
else
{
return false;
}
}

if (((xinic+1==xfin)||(xinic-1==xfin))&&(yinic=yfin-1)&&(tablero[xfin][yfin][1]=='2'))
{
return true;
}
else
{
return false;
}

}
if (tablero[xinic][yinic]=="p2")
{
a=0;
if (xinic==xfin)
{
if (((yinic+1==yfin)||(yinic-1==yfin))
&&(tablero[xinic][yfin][1]!='1'))
{
a++;
}
if (((yinic-2==yfin)&&(xinic==xfin))
&&(yinic=6)
&&(tablero[xinic][yfin][1]!='1')&&(tablero[xinic][yinic-1]=="  "))
{
a++;
}
if (a>0)
{
return true;
}
else
{
return false;
}
}

if (((xinic+1==xfin)||(xinic-1==xfin))&&(yinic=yfin+1)&&(tablero[xfin][yfin][1]=='1'))
{
return true;
}
else
{
return false;
}

}

if ((tablero[xinic][yinic]=="t1")||(tablero[xinic][yinic]=="t2"))
{
saltoPieza=false;
if ((xinic==xfin)||(yinic==yfin))
if (xinic==xfin)
{
if (yfin>yinic)
{
for (int i=yinic;i<=yfin-1;i++)
{
if ((tablero[xinic][i]!=tablero[xinic][yinic])&&(tablero[xinic][i]!="  "))
{
saltoPieza=true;
}
}
}
if (yfin<yinic)
{
for (int i=yinic;i>=yfin+1;i--)
{
if ((tablero[xinic][i]!=tablero[xinic][yinic])&&(tablero[xinic][i]!="  "))
{
saltoPieza=true;
}
}
}
}
if (yinic==yfin)
{
if (xfin>xinic)
{
for (int i=xinic;i<=xfin-1;i++)
{
if ((tablero[i][yinic]!=tablero[xinic][yinic])&&(tablero[i][yinic]!="  "))
{
saltoPieza=true;
}
}
}
if (xfin<xinic)
{
for (int i=xinic;i>=xfin+1;i--)
{
if ((tablero[i][yinic]!=tablero[xinic][yinic])&&(tablero[i][yinic]!="  "))
{
saltoPieza=true;
}
}
}
}
if (saltoPieza==false)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}

if ((tablero[xinic][yinic]=="a1")||(tablero[xinic][yinic]=="a2"))
{
saltoPieza=false;
if (abs((xfin-xinic))==abs((yinic-yfin)))
{
if ((xfin-xinic>0)&&(yfin-yinic>0))
{
for (int i=0;i<=(xfin-xinic)-1;i++)
{
if ((tablero[xinic+i][yinic+i]!="  ")&&(tablero[xinic+i][yinic+i]!=tablero[xinic][yinic]))
{
saltoPieza=true;
}
}

}
if ((xfin-xinic<0)&&(yfin-yinic>0))
{
for (int i=0;i<=(-xfin+xinic)-1;i++)
{
if ((tablero[xinic-i][yinic+i]!="  ")&&(tablero[xinic-i][yinic+i]!=tablero[xinic][yinic]))
{
saltoPieza=true;
}
}

}
if ((xfin-xinic<0)&&(yfin-yinic<0))
{
for (int i=0;i<=(-xfin+xinic)-1;i++)
{
if ((tablero[xinic-i][yinic-i]!="  ")&&(tablero[xinic-i][yinic-i]!=tablero[xinic][yinic]))
{
saltoPieza=true;
}
}

}
if ((xfin-xinic>0)&&(yfin-yinic<0))
{
for (int i=0;i<=(+xfin-xinic)-1;i++)
{
if ((tablero[xinic+i][yinic-i]!="  ")&&(tablero[xinic+i][yinic-i]!=tablero[xinic][yinic]))
{
saltoPieza=true;
}
}

}
if (saltoPieza==true)
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
if ((tablero[xinic][yinic]=="q1")||(tablero[xinic][yinic]=="q2"))
{
saltoPieza=false;
if ((xfin-xinic)==(yinic-yfin)||(xinic==xfin)||(yinic==yfin))
{
if ((xfin-xinic>0)&&(yfin-yinic>0))
{
for (int i=0;i<=(xfin-xinic)-1;i++)
{
if ((tablero[xinic+i][yinic+i]!="  ")&&(tablero[xinic+i][yinic+i]!=tablero[xinic][yinic]))
{
saltoPieza=true;
}
}

}
if ((xfin-xinic<0)&&(yfin-yinic>0))
{
for (int i=0;i<=(-xfin+xinic)-1;i++)
{
if ((tablero[xinic-i][yinic+i]!="  ")&&(tablero[xinic-i][yinic+i]!=tablero[xinic][yinic]))
{
saltoPieza=true;
}
}

}
if ((xfin-xinic<0)&&(yfin-yinic<0))
{
for (int i=0;i<=(-xfin+xinic)-1;i++)
{
if ((tablero[xinic-i][yinic-i]!="  ")&&(tablero[xinic-i][yinic-i]!=tablero[xinic][yinic]))
{
saltoPieza=true;
}
}

}
if ((xfin-xinic>0)&&(yfin-yinic<0))
{
for (int i=0;i<=(+xfin-xinic)-1;i++)
{
if ((tablero[xinic+i][yinic-i]!="  ")&&(tablero[xinic+i][yinic-i]!=tablero[xinic][yinic]))
{
saltoPieza=true;
}
}

}

if (yinic==yfin)
{
if (xfin>xinic)
{
for (int i=xinic;i<=xfin-1;i++)
{
if ((tablero[i][yinic]!=tablero[xinic][yinic])&&(tablero[i][yinic]!="  "))
{
saltoPieza=true;
}
}
}
if (xfin<xinic)
{
for (int i=xinic;i>=xfin+1;i--)
{
if ((tablero[i][yinic]!=tablero[xinic][yinic])&&(tablero[i][yinic]!="  "))
{
saltoPieza=true;
}
}
}
}
if (xinic==xfin)
{
if (yfin>yinic)
{
for (int i=yinic;i<=yfin-1;i++)
{
if ((tablero[xinic][i]!=tablero[xinic][yinic])&&(tablero[xinic][i]!="  "))
{
saltoPieza=true;
}
}
}
if (yfin<yinic)
{
for (int i=yinic;i>=yfin+1;i--)
{
if ((tablero[xinic][i]!=tablero[xinic][yinic])&&(tablero[xinic][i]!="  "))
{
saltoPieza=true;
}
}
}
}

if (saltoPieza=true)
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
if ((tablero[xinic][yinic]=="k1")||(tablero[xinic][yinic]=="k2"))
{
if ((abs(xfin-xinic)==1)||(abs((yinic-yfin))==1))
{
return true;
}
else
return false;
}
if ((tablero[xinic][yinic]=="c1")||(tablero[xinic][yinic]=="c2"))
{
if (((abs(xfin-xinic)==2)&&(abs(yinic-yfin)==1))||((abs(xfin-xinic)==1)&&(abs(yinic-yfin)==2)))
{
return true;
}
else
{
return false;
}
}
}

Datos: Los peones y las torres se mueven bien pero si pongo movimientos válidos de la reina, alfil, rey o caballo, el programa dice "Movimiento Incorrecto"

Si necesitan más partes del programa me avisan para ponerlas.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Movimientos de Ajedrez bugueados
« Respuesta #1 en: 18 Julio 2013, 16:50 pm »

Y concretamente... en qué consiste el error??


En línea

oliverm

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Movimientos de Ajedrez bugueados
« Respuesta #2 en: 18 Julio 2013, 16:58 pm »

Y concretamente... en qué consiste el error??

Al final del tema lo dice:

Citar
Datos: Los peones y las torres se mueven bien pero si pongo movimientos válidos de la reina, alfil, rey o caballo, el programa dice "Movimiento Incorrecto"

Si necesitan más partes del programa me avisan para ponerlas.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Movimientos de Ajedrez bugueados
« Respuesta #3 en: 18 Julio 2013, 17:08 pm »

Has pensado quizás en dar el salto completo y hacerlo con clases??

si, se que estás aprendiendo y que no lo entiendes aún, pero la mejor forma de entender una pieza fundamental de c++ es usándola.

Este es un ejercicio estupendo para practicar un montón de características de c++: clases, polimorfismo, herencia.

En caso negativo, crea funciones más sencillas... aunque salgan más. Te ayudarán a encontrar más facilmente errores como este:

Código
  1. if ((tablero[xinic][yinic]=="t1")||(tablero[xinic][yinic]=="t2"))
  2. {
  3. saltoPieza=false;
  4. if ((xinic==xfin)||(yinic==yfin))
  5. if (xinic==xfin)
  6. {
  7. if (yfin>yinic)
  8. {
  9. for (int i=yinic;i<=yfin-1;i++)
  10. {
  11. if ((tablero[xinic][i]!=tablero[xinic][yinic])&&(tablero[xinic][i]!="  "))
  12. {
  13. saltoPieza=true;
  14. }
  15. }
  16. }
  17. if (yfin<yinic)
  18. {
  19. for (int i=yinic;i>=yfin+1;i--)
  20. {
  21. if ((tablero[xinic][i]!=tablero[xinic][yinic])&&(tablero[xinic][i]!="  "))
  22. {
  23. saltoPieza=true;
  24. }
  25. }
  26. }
  27. }
  28. if (yinic==yfin)
  29. {
  30. if (xfin>xinic)
  31. {
  32. for (int i=xinic;i<=xfin-1;i++)
  33. {
  34. if ((tablero[i][yinic]!=tablero[xinic][yinic])&&(tablero[i][yinic]!="  "))
  35. {
  36. saltoPieza=true;
  37. }
  38. }
  39. }
  40. if (xfin<xinic)
  41. {
  42. for (int i=xinic;i>=xfin+1;i--)
  43. {
  44. if ((tablero[i][yinic]!=tablero[xinic][yinic])&&(tablero[i][yinic]!="  "))
  45. {
  46. saltoPieza=true;
  47. }
  48. }
  49. }
  50. }
  51. if (saltoPieza==false)
  52. {
  53. return true;
  54. }
  55. else
  56. {
  57. return false;
  58. }
  59. }
  60. else
  61. {
  62. return false;
  63. }

Ese último else es el que te está matando...

mira, lo simplifico para que se vea mejor:

Código
  1. if ((tablero[xinic][yinic]=="t1")||(tablero[xinic][yinic]=="t2"))
  2. {
  3.                 // ...
  4. }
  5. else
  6. {
  7. return false;
  8. }

Si no es torre te va a devolver false siempre.


En línea

oliverm

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Movimientos de Ajedrez bugueados
« Respuesta #4 en: 18 Julio 2013, 20:45 pm »

Wooooo!!! ciertooo! gracias... el ajedrez está casi listo, cuando lo termine lo haré con clases y más.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Hacer graficos en movimientos
.NET (C#, VB.NET, ASP)
Meta 3 4,823 Último mensaje 22 Agosto 2011, 08:07 am
por Meta
Detectar movimientos de piezas en tablero de ajedrez. « 1 2 »
Programación Visual Basic
E2E4 12 10,918 Último mensaje 4 Junio 2012, 09:29 am
por BlackZeroX
ejecutar múltiples movimientos de ratón a la vez
Software
JOSE968 1 1,698 Último mensaje 25 Enero 2013, 16:44 pm
por zonahurbana
PrioVR te ofrece seguimiento de movimientos inercial y profesional en tu ...
Noticias
wolfbcn 0 1,089 Último mensaje 5 Septiembre 2013, 18:21 pm
por wolfbcn
semantica de movimientos C++ y java
Programación C/C++
SARGE553413 0 1,869 Último mensaje 4 Noviembre 2013, 11:03 am
por SARGE553413
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines