Título: Movimientos de Ajedrez bugueados
Publicado por: oliverm 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: 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 ... 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 bugfunción movimientoPieza (es horrible, comprensión por favor estoy aprendiendo) 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.
Título: Re: Movimientos de Ajedrez bugueados
Publicado por: eferion en 18 Julio 2013, 16:50 pm
Y concretamente... en qué consiste el error??
Título: Re: Movimientos de Ajedrez bugueados
Publicado por: oliverm en 18 Julio 2013, 16:58 pm
Y concretamente... en qué consiste el error??
Al final del tema lo dice: 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.
Título: Re: Movimientos de Ajedrez bugueados
Publicado por: eferion 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: 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; }
Ese último else es el que te está matando... mira, lo simplifico para que se vea mejor: if ((tablero[xinic][yinic]=="t1")||(tablero[xinic][yinic]=="t2")) { // ... } else { return false; }
Si no es torre te va a devolver false siempre.
Título: Re: Movimientos de Ajedrez bugueados
Publicado por: oliverm 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.
|