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.