Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > N en Raya - HUMANO vs PC

Hola amigos, he estado estudiando un algoritmo de un 3 en raya para luego migrarlo a JAVA, el cual funciona HUMANO vs PC, no es muy complicado pero ahora quiero realizar la modificación para un tablero de 25 celdas pero el algoritmo deja de funcionar por completo entra en un ciclo infinito y no veo luz, ojala alguien pudiera echarle un ojo a ver y dar con lo que yo no veo.

Gracias, adjunto el código de la versión funcional, la modificación que no van en este serian agregar mas celdas a la matriz quedaria 5x5, aumentar los limites de los ciclos y modificar los condicionales respectivos.


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include
using namespace std;
#define GRANDE 100;

#define MAX 1
#define MIN 2

#define NADIE '-'
#define JUGADOR 'O'
#define COMPUTADOR 'X'

//---------------------------------------------------------------------------

#pragma argsused

void impTablero(void);
int bt(int);
int eval(void);

char t[][3]={
{NADIE,NADIE,NADIE},
{NADIE,NADIE,NADIE},
{NADIE,NADIE,NADIE}
};
int mejorFila,mejorCol;

int main(int argc, char* argv[]){
int f,c,ganador;
mejorFila=0;
mejorCol=0;
impTablero();
do{
do{
cout << "Su Turno:" << endl;
cout << "Fila? "; cin >> f;
cout << "Columna? "; cin >> c;
}while((f<0||f>=3 || c<0 || c>=3)||t[f][c]!=NADIE);
t[f][c]=JUGADOR;
impTablero();
bt(MAX);
cout << "Computador:" << endl;
cout << "Fila: " << mejorFila << endl;
cout << "Columna: " << mejorCol << endl;
t[mejorFila][mejorCol]=COMPUTADOR;
impTablero();
ganador=eval();
}while(ganador==2);

if(ganador==-1) cout << "***Ud. Gana***";
else if(ganador==1) cout << "***Computador gana***";
else cout << "***Empate!***";
cout << endl;
system("pause");
return 0;
}

int bt(int modo){
int i,j,val,mfLocal=0,mcLocal=0;
int valor=eval();
if(valor!=2){
return valor;
}
if(modo==MAX){
valor=-GRANDE;
}else{
valor=GRANDE;
}

for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(t[i][j]==NADIE){
if(modo==MAX){
t[i][j]=COMPUTADOR;
val=bt(MIN);
if(valor<val){
valor=val;
mfLocal=i;
mcLocal=j;
}
}else{
t[i][j]=JUGADOR;
val=bt(MAX);
if(valor>val){
valor=val;
mfLocal=i;
mcLocal=j;
}
}
t[i][j]=NADIE;
}
}
}
mejorFila=mfLocal;
mejorCol=mcLocal;
return valor;
}

int eval(void){
int i,j,ganador=NADIE;
for(i=0;i<3;i++)
if(t[i][0]!=NADIE && t[i][0]==t[i][1] && t[i][1]==t[i][2])
ganador=t[i][0];

for(j=0;j<3;j++)
if(t[0][j]!=NADIE && t[0][j]==t[1][j] && t[1][j]==t[2][j])
ganador=t[0][j];

if(t[0][0]!=NADIE && t[0][0]==t[1][1] && t[1][1]==t[2][2])
ganador=t[0][0];

if(t[0][2]!=NADIE && t[0][2]==t[1][1] && t[1][1]==t[2][0])
ganador=t[0][2];

if(ganador==JUGADOR)
return -1;

if(ganador==COMPUTADOR)
return 1;

for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(t[i][j]==NADIE)
return 2;
return 0;
}

void impTablero(void){
int i,j;
cout << endl;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
cout << t[i][j];
cout << endl;
}
cout << endl;
}

octubre 13, 2011 | Unregistered CommenterAuthor

Perdona la pregunta, pero ¿Qué objeto tiene publicar un código escrito en C en un foro dedicado a Java?.

octubre 13, 2011 | Unregistered Commenterchoces

Hola, descuida y gracias por responder, pues debo migrarlo a JAVA pero antes debo modificarlo de un 3 en raya a 5, pero creo es mejor hacerlo en el original, sin embargo no he podido. :(

octubre 13, 2011 | Unregistered CommenterAuthor

Perdona la pregunta, pero ¿Qué objeto tiene publicar un código escrito en C en un foro dedicado a Java?.

good respuesta...

cuando tengas una pregunta específica la puedes hacer.. pero no pretendas que te resolvamos el ejercicio. Hay gente ocupada que entra a este foro para ayudar a los demás, pero no con tiempo como para estudiar un código en C para romperse la cabeza entendiéndolo y para pasarlo a java..

octubre 13, 2011 | Unregistered Commenteremanuel

el código java te da el ciclo infinito? si es así ponerlo es mejor que poner el codigo en C

octubre 13, 2011 | Unregistered Commenteremanuel

Aparte de que personalmente pienso que cuestiones sobre C se responderían mejor en un foro dedicado a C, hay algunas consideraciones que me gustaría compartir.
Respecto a los lenguajes de programación, al igual que con los lenguajes humanos, para "hablarlos" es preciso "pensar en ellos".
Creo que es un error querer "traducir", como con mucha frecuencia se hace, de C a Java.
Si quieres programar en Java, "piensa en Java": plantéate la solución de tu algoritmo en términos de Java, exclusivamente.

octubre 13, 2011 | Unregistered Commenterchoces

Uno de los problemas más grandes que veo yo es que el código no está documentado en absoluto. El código ni siquiera sigue unos Coding Standards buenos... Eso obliga a leer linea a linea, y ver como se va desarrollando. Yo lo consideraría un mal ejemplo y buscaría otra implementación. Además lamentablemente este foro todavía no indenta el código por lo que veo, ni lo resalta. Eso va a desanimar a cualquiera a ayudarte, a menos que encuentres a alguno que le tire el C o que quiera homenajear a Denis Ritchie jeje.

No obstante, el código no es largo... Apenas 140 lineas. Debería ser sencillo desglosar el programa en bloques de código más pequeños separados por lógicas... La parte que muestra por pantalla, la parte que procesa la partida etc... Pero yo la verdad, si tuviese un código de ejemplo delante como ese, preferiria mirarme en la wikipedia los fundamentos del 5 en raya [irony] seguro que rayan la paranoya [/irony] y lo escribiría de cero, esta vez si, documentando.

octubre 14, 2011 | Unregistered CommenterJeflopo