Hola amigos, he estado estudiando un algoritmo de un 3 en raya, 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 5x5, aumentar los limites de los ciclos y modificar los condicionales respectivos.
Código PHP:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <iostream>
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;
}