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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Duda algoritmo ajedrez en c++ en: 20 Julio 2013, 20:36 pm
La duda escapa algo del lenguaje en sí, pero no supe en que sección ponerlo, supongo que es acá (está escrito en c++).

El código me pide hacer mi jugada y luego debería jugar el pc automáticamente, pero cuando le toca al pc tira error. Antes de poner el código explicaré la idea un poco.

El algoritmo revisa el tablero y ve celda por celda si hay una pieza que pueda mover, después de eso ve todos los destinos que le puede dar a cada pieza y si come una pieza gana cierto puntaje (1 si come un peón, 4 por una torre, etc) luego guarda las 2 mejores jugadas en cuanto a puntaje y analiza la mejor jugada que podría hacer yo (para esto cambia el turno) en contra de esas 2 jugadas y ve cuanto pierde, luego compara el total de los 2 casos y realiza la jugada que termina mejor (vuelve a cambiar turno). Si los 2 casos son iguales realiza la primera, y si por alguna razón no guardó ninguna jugada realiza un movimiento aleatorio válido de pieza. Terminado el algoritmo cambia turno de nuevo (en main) y me debería tocar

Al hacer primero yo mi jugada cuando le toca al PC da error de inmediato luego intenté iniciando un tablero con un alfil mio al lado de sus peones para que sea claro lo que tiene que hacer, pero aún así da error. Al parecer hay algún loop sin fin en el algoritmo.

El código es bastante "áspero" estoy aprendiendo C++ recién y hay muchas cosas que no sé usar aún como objetos, clases, etc... planeo hacerlo con esos recursos una vez que termine este.



El código:   (al lado del título de la función algoritmo puse "ACA ESTA EL ALGORITMOOO")
Código:
#include <iostream>
#include <string>
#include <cstdlib>

using namespace::std;
int turno=1;

void impTablero(string tablero[8][8])
{
int cont=0;
cout<<"\311";
while (cont<7)
{
for (int i=1;i<=4;i++) // dibujando límite superior
{
if (i%4!=0)
{
cout<<"\315";
}
else
{
cout<<"\313";
cont++;
}
if (cont==7)
{
cout<<"\315\315\315\273"<<endl;
}
}
}
for (int j=7;j>=0;j--)
{
for (int i=0;i<8;i++)
{
cout<<"\272"<<tablero[i][j]<<" "; //imprimiendo tablero
if (i==7)
{
cout<<"\272 "<<(j+1);

}
}
cout<<endl;
if (j!=0)
{
cout<<"\314";
cont=0;
while (cont<=7)
{
for (int k=1;k<=4;k++)
{
if (k%4!=0)
{
cout<<"\315"; //dibujando rayas entre cuadrantes
}
else
{
cout<<"\316";
cont++;
}

}
if (cont==7)
{
cout<<"\315\315\315\271"<<endl;
cont++;
}
}

}
}
cout<<"\310";
cont=0;
while (cont<7)
{
for (int i=1;i<=4;i++) // dibujando límite inferior
{
if (i%4!=0)
{
cout<<"\315";
}
else
{
cout<<"\312";
cont++;
}
if (cont==7)
{
cout<<"\315\315\315\274"<<endl;
}
}
}
for(int i=65;i<(65+8);i++)
{
printf("  %c ",i);
if (i==(65+7))
{
cout<<"\n\n";
cout<<"***********************************\n\n";

}
}
}

void iniciaTablero(string tablero[8][8])
{
for (int i=0;i<8;i++)
{
tablero[i][1]="p1"; //ubicación de peones
tablero[i][6]="p2";
}

tablero[0][0]="t1";
tablero[1][0]="c1"; //ubicación otras piezas jugador 1
tablero[2][0]="a1";
tablero[3][0]="q1";
tablero[4][0]="k1";
for (int i=5;i<8;i++)
{
tablero[i][0]=tablero[7-i][0];
}
tablero[0][7]="t2";
tablero[1][7]="c2";
tablero[2][7]="a2";
tablero[3][7]="k2"; //ubicación otras piezas jugador 2
tablero[4][7]="q2";

for (int i=5;i<8;i++)
{
tablero[i][7]=tablero[7-i][7];
}

for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
if (tablero[i][j]=="\0") //Dibujando espacitos vacíos
{
tablero[i][j]="  ";
}
}
}
}

bool movimientoPieza (int xinic,int yinic,int xfin, int yfin, string tablero[8][8]) 
{
bool saltoPieza=false;
int a;
if ((xinic==xfin)&&(yinic==yfin))
{
return false;
}
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)
{
if (tablero[xfin][yfin][1]!=tablero[xinic][yinic][1])
{
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)
{
if (tablero[xfin][yfin][1]!=tablero[xinic][yinic][1])
{
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+1)
{
for (int i=yinic+1;i<=yfin-1;i++)
{
if (tablero[xinic][i]!="  ")
{
saltoPieza=true;
}
}
}
if (yfin<yinic-1)
{
for (int i=yinic-1;i>=yfin+1;i--)
{
if (tablero[xinic][i]!="  ")
{
saltoPieza=true;
}
}
}
}
if (yinic==yfin)
{
if (xfin>xinic+1)
{
for (int i=xinic+1;i<=xfin-1;i++)
{
if (tablero[i][yinic]!="  ")
{
saltoPieza=true;
}
}
}
if (xfin<xinic)
{
for (int i=xinic-1;i>=xfin+1;i--)
{
if (tablero[i][yinic]!="  ")
{
saltoPieza=true;
}
}
}
}
if (saltoPieza==false)
{
if (tablero[xfin][yfin][1]!=tablero[xinic][yinic][1])
{
return true;
}
}
else
{
return false;
}
}

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

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

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

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

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

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

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

}

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

if (saltoPieza=true)
{
return false;
}
else
{
if (tablero[xfin][yfin][1]!=tablero[xinic][yinic][1])
{
return true;
}
}
}
else
{
return false;
}
}
if ((tablero[xinic][yinic]=="k1")||(tablero[xinic][yinic]=="k2"))
{
if ((abs(xfin-xinic)==1)||(abs((yinic-yfin))==1))
{
if (tablero[xfin][yfin][1]!=tablero[xinic][yinic][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)))
{
if (tablero[xfin][yfin][1]!=tablero[xinic][yinic][1])
{
return true;
}
}
else
{
return false;
}
}
}
int c2i (char a)
{
switch (a)
{
case '1':
return 0;
break;
case '2':
return 1;
break;
case '3':
return 2;
break;
case '4':
return 3;
break;
case '5':
return 4;
break;
case '6':
return 5;
break;
case '7':
return 6;
break;
case '8':
return 7;
break;
case 'A':
return 0;
break;
case 'B':
return 1;
break;
case 'C':
return 2;
break;
case 'D':
return 3;
break;
case 'E':
return 4;
break;
case 'F':
return 5;
break;
case 'G':
return 6;
break;
case 'a':
return 0;
break;
case 'b':
return 1;
break;
case 'c':
return 2;
break;
case 'd':
return 3;
break;
case 'e':
return 4;
break;
case 'f':
return 5;
break;
case 'g':
return 6;
break;
case 'h':
return 7;
break;

case 'H':
return 7;
break;
default:
return 0;
break;
}
}
void celdaInicial (char *celdInicLet, char *celdInicNum, string tablero[8][8])
{
bool turnoCorrecto=false;
while (turnoCorrecto==false)
{
cout<<"Ingrese letra de celda a mover"<<endl;
cin>>*celdInicLet;
while (*celdInicLet != 'A'&&*celdInicLet != 'B'&&*celdInicLet != 'C'&&*celdInicLet != 'D'&&*celdInicLet != 'E'&&
*celdInicLet != 'F'&&*celdInicLet != 'G'&&*celdInicLet != 'H'&&*celdInicLet != 'a'&&*celdInicLet != 'b'&&*celdInicLet != 'c'&&
*celdInicLet != 'd'&&*celdInicLet != 'e'&&*celdInicLet != 'f'&&*celdInicLet != 'g'&&*celdInicLet != 'h')
{
cout<<"La celda ingresada no es valida, ingrese letra de celda entre A y H"<<endl;
cin>>*celdInicLet;
}
cout<<"Ingrese numero de celda para mover pieza (1-8)"<<endl;
cin>>*celdInicNum;
while (*celdInicNum != '1'&&*celdInicNum != '2'&&*celdInicNum != '3'&&*celdInicNum != '4'&&*celdInicNum != '5'&&
*celdInicNum != '6'&&*celdInicNum != '7'&&*celdInicNum != '8')
{
cout<<"La celda ingresada no es valida, ingrese un numero entre 1 y 8"<<endl;
cin>>*celdInicNum;
}
if (((tablero[c2i(*celdInicLet)][c2i(*celdInicNum)][1]=='1')&&(turno==1))
||((tablero[c2i(*celdInicLet)][c2i(*celdInicNum)][1]=='2')&&(turno==(-1))))
{
turnoCorrecto=true;
}
else
{
turnoCorrecto=false;
}
if (turnoCorrecto==true)
{
cout<<"Ok, la celda de la pieza a mover sera: "<<*celdInicLet<<*celdInicNum<<endl;
cout<<"La coordenada especificada ("<<*celdInicLet<<*celdInicNum<<") tiene la pieza "
<<tablero[c2i(*celdInicLet)][c2i(*celdInicNum)]<<endl;

}
else
{
cout<<"La celda seleccionada no contiene una pieza suya"<<endl;
}
}
}

void celdaFinal (char *celdFinLet, char *celdFinNum, string tablero[8][8])
{
bool turnoCorrecto=false;

while (turnoCorrecto==false)
{
cout<<"Ingrese letra de celda destino"<<endl;
cin>>*celdFinLet;

while (*celdFinLet != 'A'&&*celdFinLet != 'B'&&*celdFinLet != 'C'&&*celdFinLet != 'D'&&*celdFinLet != 'E'&&
*celdFinLet != 'F'&&*celdFinLet != 'G'&&*celdFinLet != 'H'&&*celdFinLet != 'a'&&*celdFinLet != 'b'&&*celdFinLet != 'c'&&
*celdFinLet != 'd'&&*celdFinLet != 'e'&&*celdFinLet != 'f'&&*celdFinLet != 'g'&&*celdFinLet != 'h')
{
cout<<"La celda ingresada no es valida, ingrese letra de celda entre A y H"<<endl;
cin>>*celdFinLet;
}
cout<<"Ingrese numero de celda destino (1-8)"<<endl;
cin>>*celdFinNum;
while (*celdFinNum != '1'&&*celdFinNum != '2'&&*celdFinNum != '3'&&*celdFinNum != '4'&&*celdFinNum != '5'&&
*celdFinNum != '6'&&*celdFinNum != '7'&&*celdFinNum != '8')
{
cout<<"La celda ingresada no es valida, ingrese un numero entre 1 y 8"<<endl;
cin>>*celdFinNum;
}
if (((tablero[c2i(*celdFinLet)][c2i(*celdFinNum)][1]=='1')&&(turno==1))
||((tablero[c2i(*celdFinLet)][c2i(*celdFinNum)][1]=='2')&&(turno==(-1))))
{
turnoCorrecto=false;
cout<<"No puedes comerte piezas aliadas"<<endl;
}
else
{
turnoCorrecto=true;
}
if (turnoCorrecto==true)
{
cout<<"Ok, la celda destino sera: "<<*celdFinLet<<*celdFinNum<<endl;
}
}
}

void moverPieza(string tablero[8][8])
{
char celdInicLet='z';
char celdInicNum='z';
char celdFinLet='z';
char celdFinNum='z';
char verificador='z';

while (verificador!='s')
{
celdaInicial(&celdInicLet,&celdInicNum,tablero);
celdaFinal(&celdFinLet,&celdFinNum, tablero);
cout<<"Esta seguro que desea mover su "<<tablero[c2i(celdInicLet)][c2i(celdInicNum)]<<" a "<<celdFinLet<<celdFinNum<<"? (s/n)"<<endl;
cin>>verificador;
while (verificador!='s'&&verificador!='n')
{
cout<<"Ingrese opcion correcta"<<endl;
cin>>verificador;
}
}
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;

}

bool juegoTerminado(string tablero[8][8])
{
int i=0;
for (int j=0;j<=7;j++)
{
for (int k=0;k<=7;k++)
{
if ((tablero[j][k]=="k1")||(tablero[j][k]=="k2"))
{
i++;
}
}
}
if (i==2)
{
return false;
}
else
return true;
}
int valorPieza(int x, int y, string tablero[8][8])
{
switch (tablero[x][y][0])
{
case 'p': return 1;
break;
case 't': return 5;
break;
case 'c': return 4;
break;
case 'a': return 4;
break;
case 'q': return 12;
break;
case 'k': return 1000;
break;
case ' ': return 0;
break;
}
}
int valorMaxArray(int arreglo[40],int* cantJugadas)
{
int max=arreglo[0];
for (int i=1;i<=*cantJugadas;i++)
{
if (max<arreglo[i])
{
max=arreglo[i];
}
}
return max;
}
int numAleatorio07()
{
return (rand()%8);
}


void algoritmoShuperLoco(string tablero[8][8])  // ACA EL ALGORITMOOOOOO
{


int valorJugada1;
int mejoresJugadas[40];
int contadorJugadasTotales=0;
int mejorJugada1[4];
int sdaMejorJugada1[4];
int valorSegundaMejorJugada;
int contadorJugadasTotales2=0;
for (int i=0;i<=7;i++)
{
for (int j=0;j<=7;j++)
{
for (int iDest=0;iDest<=7;iDest++)
{
for (int jDest=0;jDest<=7;jDest++)
{
if ((movimientoPieza(i,j,iDest,jDest,tablero))&&(tablero[i][j][1]=='2'))
{
valorJugada1=valorPieza(iDest,jDest,tablero);
contadorJugadasTotales++;
mejoresJugadas[contadorJugadasTotales-1]=valorJugada1;
}
}
}
}
}
for (int i=0;i<=7;i++)
{
for (int j=0;j<=7;j++)
{
for (int iDest=0;iDest<=7;iDest++)
{
for (int jDest=0;jDest<=7;jDest++)
{
if ((movimientoPieza(i,j,iDest,jDest,tablero))&&(tablero[i][j][1]=='2'))
{
if (valorPieza(iDest,jDest,tablero)==
valorMaxArray(mejoresJugadas,&contadorJugadasTotales))
{
mejorJugada1[0]=i;
mejorJugada1[1]=j;
mejorJugada1[2]=iDest;
mejorJugada1[3]=jDest;
}


}
}
}
}
}


for (int i=0;i<=7;i++)
{
for (int j=0;j<=7;j++)
{
for (int iDest=0;iDest<=7;iDest++)
{
for (int jDest=0;jDest<=7;jDest++)
{
if ((movimientoPieza(i,j,iDest,jDest,tablero))&&((i!=mejorJugada1[0])||(j!=mejorJugada1[1])||
(iDest!=mejorJugada1[2])||(jDest!=mejorJugada1[3]))&&(tablero[i][j][1]=='2'))
{
valorJugada1=valorPieza(iDest,jDest,tablero);
contadorJugadasTotales2++;
mejoresJugadas[contadorJugadasTotales2-1]=valorJugada1;
}
}
}
}
}
for (int i=0;i<=7;i++)
{
for (int j=0;j<=7;j++)
{
for (int iDest=0;iDest<=7;iDest++)
{
for (int jDest=0;jDest<=7;jDest++)
{
if ((movimientoPieza(i,j,iDest,jDest,tablero))&&(tablero[i][j][1]=='2'))
{
if (valorPieza(iDest,jDest,tablero)==
valorMaxArray(mejoresJugadas,&contadorJugadasTotales2))
{
sdaMejorJugada1[0]=i;
sdaMejorJugada1[1]=j;
sdaMejorJugada1[2]=iDest;
sdaMejorJugada1[3]=jDest;
valorSegundaMejorJugada=valorMaxArray(mejoresJugadas,&contadorJugadasTotales2);
}


}
}
}
}
}
//Ver cuanto se pierde si el oponente hace la mejor jugada posible con cada jugada
//Caso 1: Hacer la mejor jugada posible (la que come la pieza de mayor puntaje)

int valorJugada1Op;
int mejoresJugadasOp[40];
int contadorJugadasTotalesOp=0;
int contadorJugadasTotalesOp2=0;
int mejorJugada1Op[4];
int valorJugadaTotal1;
int valorJugadaTotal2;
string loQueHabiaFin, loQueHabiaInic;
turno=turno*-1;
loQueHabiaFin=tablero[mejorJugada1[2]][mejorJugada1[3]];
loQueHabiaInic=tablero[mejorJugada1[0]][mejorJugada1[1]];

tablero[mejorJugada1[2]][mejorJugada1[3]]=tablero[mejorJugada1[0]][mejorJugada1[1]];
tablero[mejorJugada1[0]][mejorJugada1[1]]="  ";
for (int i=0;i<=7;i++)
{
for (int j=0;j<=7;j++)
{
for (int iDest=0;iDest<=7;iDest++)
{
for (int jDest=0;jDest<=7;jDest++)
{
if ((movimientoPieza(i,j,iDest,jDest,tablero))&&(tablero[i][j][1]=='1'))
{
valorJugada1Op=valorPieza(iDest,jDest,tablero);
contadorJugadasTotalesOp++;
mejoresJugadasOp[contadorJugadasTotalesOp-1]=valorJugada1Op;
}
}
}
}
}
for (int i=0;i<=7;i++)
{
for (int j=0;j<=7;j++)
{
for (int iDest=0;iDest<=7;iDest++)
{
for (int jDest=0;jDest<=7;jDest++)
{
if ((movimientoPieza(i,j,iDest,jDest,tablero))&&(tablero[i][j][1]=='1'))
{
if (valorPieza(iDest,jDest,tablero)==
valorMaxArray(mejoresJugadasOp,&contadorJugadasTotalesOp))
{
mejorJugada1Op[0]=i;
mejorJugada1Op[1]=j;
mejorJugada1Op[2]=iDest;
mejorJugada1Op[3]=jDest;
}
}
}
}
}
}

valorJugadaTotal1=valorMaxArray(mejoresJugadas,&contadorJugadasTotales)
-valorMaxArray(mejoresJugadasOp,&contadorJugadasTotalesOp);

tablero[mejorJugada1[2]][mejorJugada1[3]]=loQueHabiaFin;
tablero[mejorJugada1[0]][mejorJugada1[1]]=loQueHabiaInic;
tablero[sdaMejorJugada1[2]][sdaMejorJugada1[3]]=tablero[sdaMejorJugada1[0]][sdaMejorJugada1[1]];
tablero[sdaMejorJugada1[0]][sdaMejorJugada1[1]]="  ";
for (int i=0;i<=7;i++)
{
for (int j=0;j<=7;j++)
{
for (int iDest=0;iDest<=7;iDest++)
{
for (int jDest=0;jDest<=7;jDest++)
{
if (movimientoPieza(i,j,iDest,jDest,tablero))
{
valorJugada1Op=valorPieza(iDest,jDest,tablero);
contadorJugadasTotalesOp2++;
mejoresJugadasOp[contadorJugadasTotalesOp2-1]=valorJugada1Op;
}
}
}
}
}
for (int i=0;i<=7;i++)
{
for (int j=0;j<=7;j++)
{
for (int iDest=0;iDest<=7;iDest++)
{
for (int jDest=0;jDest<=7;jDest++)
{
if ((movimientoPieza(i,j,iDest,jDest,tablero))&&(tablero[i][j][1]=='1'))
{
if (valorPieza(iDest,jDest,tablero)==
valorMaxArray(mejoresJugadasOp,&contadorJugadasTotalesOp2))
{
mejorJugada1Op[0]=i;
mejorJugada1Op[1]=j;
mejorJugada1Op[2]=iDest;
mejorJugada1Op[3]=jDest;
}
}
}
}
}
}
int a=1;
int numAleatorio1,numAleatorio2,numAleatorio3,numAleatorio4;
valorJugadaTotal2=valorSegundaMejorJugada-valorMaxArray(mejoresJugadasOp,&contadorJugadasTotalesOp2);
tablero[mejorJugada1[2]][mejorJugada1[3]]=loQueHabiaFin;
tablero[mejorJugada1[0]][mejorJugada1[1]]=loQueHabiaInic;
int contadorDeEmergencia=0;
if (valorJugadaTotal2!=valorJugadaTotal1)
{
if (valorJugadaTotal1>valorJugadaTotal2)
{
tablero[mejorJugada1[2]][mejorJugada1[3]]=tablero[mejorJugada1[0]][mejorJugada1[1]];
tablero[mejorJugada1[0]][mejorJugada1[1]]="  ";
}
else
{
tablero[sdaMejorJugada1[2]][sdaMejorJugada1[3]]=tablero[sdaMejorJugada1[0]][sdaMejorJugada1[1]];
tablero[sdaMejorJugada1[0]][sdaMejorJugada1[1]]="  ";
}
}
else
{
if (tablero[mejorJugada1[2]][mejorJugada1[3]]!=tablero[mejorJugada1[0]][mejorJugada1[1]])
{
tablero[mejorJugada1[2]][mejorJugada1[3]]=tablero[mejorJugada1[0]][mejorJugada1[1]];
tablero[mejorJugada1[0]][mejorJugada1[1]]="  ";
}
else
{
//algoritmoDeMovimientoAleatorio(tablero)
while (a!=0)
{
numAleatorio1=numAleatorio07();
numAleatorio2=numAleatorio07();
numAleatorio3=numAleatorio07();
numAleatorio4=numAleatorio07();

if (movimientoPieza(numAleatorio1,numAleatorio2,numAleatorio3,numAleatorio4,tablero))
{
a=0;
tablero[numAleatorio1][numAleatorio2]=tablero[numAleatorio3][numAleatorio4];
tablero[numAleatorio1][numAleatorio2]=tablero[numAleatorio3][numAleatorio4];
}
else
{
contadorDeEmergencia++;
}
if (contadorDeEmergencia>2500)
{
break;
cout<<endl<<"Se uso salida de emergencia del algorimo de movimiento aleatorio"<<endl;
}

}
}

}
turno=turno*-1;
}


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

iniciaTablero(tablero);
impTablero(tablero);

while (juegoTerminado(tablero)==false)
{
if (turno==1)
{
moverPieza(tablero);
impTablero(tablero);
}
if (turno==-1)
{
algoritmoShuperLoco(tablero);
impTablero(tablero);
turno=turno*-1;
}
}

int noTeCierres;
cin>>noTeCierres;

}
2  Programación / Programación C/C++ / 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.
3  Programación / Programación C/C++ / Problema con comando switch en: 9 Julio 2013, 00:52 am
Buenas, estoy aprendiendo c++ y tuve un problema con el comando switch.
El código es el siguiente:

Código:
#include <iostream>
 
using namespace std;
 
int main()
{
    unsigned int opcion;
cout<<"[1]\tKilogramos a libras."<<endl<<"[2]\tDolares a pesos.\n";
cout<<endl<<"Escoja la unidad a transformar\n";
cin>>opcion;
while (opcion > 2)
{
cout<<"Escoja una opcion valida (1 o 2)\n";
cin>>opcion;
}
unsigned short kg, lb, dl,ps;
switch (opcion)
{
case 1: cout<<"Ingrese kilogramos\n";
cin>>kg;
cout<<kg<<" kilogramos son "<<(float) (kg/0.45)<<" libras\n";
case 2: cout<<"Ingrese dolares\n";
cin>>dl;
cout<<dl<<" dolares son "<<(float) (dl*500)<<" pesos\n";
}
cin>>opcion; //es para que no se cierre la consola :P

return 0;
}
Cuando pongo opción 1, me pido los kilogramos, me muestra cuantas libras son, pero después de eso me pide que ingrese dolares, siendo que la variable opcion tiene el valor de 1. Si mal no entiendo switch lo que hace es ver el valor de la variable y dependiendo del caso realizar una acción, en este caso si elijo la primera, al terminarse pasa a realizar la segunda, cosa que no quiero y no entiendo por qué sucede. Saludos.
PD: Pasa en Microsoft visual Studio y en Dev-cpp
4  Programación / .NET (C#, VB.NET, ASP) / Eliminar texto seleccionado al presionar una tecla en: 3 Junio 2013, 09:26 am
Buenas, en un cuadro de texto ingresé código para que se cambien los puntos por comas y luego se deje el cursor al final, pero ahora ese textbox al seleccionar lo escrito y escribir algo nuevo, no se borra lo anterior, solo comienzas a escribir y el texto anterior se mantiene.

Código
  1. Private Sub puntoDePartida2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles puntoDePartida2.KeyPress
  2.  
  3.        puntoDePartida2.Text = Replace(puntoDePartida2.Text, ".", ",")
  4.        puntoDePartida2.SelectionStart = Len(puntoDePartida2.Text)
  5.  
  6. End Sub

Eso es lo que llevo. Qué le agrego para arreglaro?
Saludos
5  Programación / Programación Visual Basic / Dejar cursor al final luego de usar replace en: 2 Junio 2013, 12:36 pm
En un programa estoy haciendo que los números ingresados en un textbox, se le reemplaze el punto por una coma
de 0.2 a 0,2
El problema es que cuando se va escribiendo apenas apretas el punto, lo cambia a coma y deja el cursor al inicio, lo que es molesto, quisiera hacer que quede al final, traté con el siguiente código, al apretar el punto en el cuadro de texto da error (InvalidCastException).

Código:
puntoDePartida2.Text = Replace(puntoDePartida2.Text, ".", ",")
        puntoDePartida2.SelectionStart = Len(puntoDePartida2)
6  Programación / Programación Visual Basic / Activar un textbox según combobox en: 2 Junio 2013, 07:28 am
Estoy haciendo un programa donde normalmente se pida un número inicial para un cálculo numérico, pero quiero que si se elige una opción especial de un combobox, aparezca un nuevo textbox, o bien que siempre hayan 2, pero el segundo este siempre bloqueado (como gris) cuando la opción que necesita 2 número iniciales no está seleccionada.

Saludos.
7  Programación / Programación Visual Basic / Realizar cálculos según lo elegido en distintos combobox en: 1 Junio 2013, 22:46 pm
Buenas, estoy haciendo un programa para un trabajo de métodos numericos y no conozco muy bien este tipo de programación.
En el programa necesito elegir una función (predeterminada, el usuario no la ingresa) de un combobox, luego elegir un método numérico de otro combobox, finalmente que el usuario elija un punto de partida, apriete calcular y que aparezca en forma de texto el resultado.

Tengo hecho, de forma visual la interfaz gráfica, pero no sé como ponerle el código en el botón para que cuando apriete "Calcular" haga un u otro procedimiento dependiendo de lo que se haya elegido en los combobox y el valor entrado en el textbox de punto de partida.

Algo parecido hice una vez en html, supongo que cada item debe ser como una variable, y según el valor de la variable se va programando cada caso.

Agradecería me ayudaran, me dijeran dónde y como se pone el código.

Saludos cordiales :)
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines