|
Mostrar Mensajes
|
Páginas: [1] 2
|
1
|
Programación / Programación C/C++ / Re: Duda algoritmo ajedrez en c++
|
en: 20 Julio 2013, 22:44 pm
|
OK, se me ocurrió segmentar el algoritmo, como hacer la mejor jugada posible una función (son 8 fors 2 grupos de 4 anidados). Hay alguna forma de sacar 4 valores de la función? (x inicial, y inicial, x final ....) o tendría que meterme usar variables globales, "memoria heap", o algo por el estilo?
En el fondo hacer una función tipo array.
|
|
|
3
|
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") #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;
}
|
|
|
5
|
Programación / Programación C/C++ / Re: Movimientos de Ajedrez bugueados
|
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.
|
|
|
6
|
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: 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.
|
|
|
7
|
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: #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
|
|
|
9
|
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. Private Sub puntoDePartida2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles puntoDePartida2.KeyPress puntoDePartida2.Text = Replace(puntoDePartida2.Text, ".", ",") puntoDePartida2.SelectionStart = Len(puntoDePartida2.Text) End Sub
Eso es lo que llevo. Qué le agrego para arreglaro? Saludos
|
|
|
|
|
|
|