Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   N en Raya - HUMANO vs PC (https://www.clubdelphi.com/foros/showthread.php?t=76132)

WhiteJack 11-10-2011 01:06:31

N en Raya - HUMANO vs PC
 
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 argccharargv[]){
    
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>=|| c<|| 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==-1cout << "***Ud. Gana***";
    else if(
ganador==1cout << "***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;



Casimiro Notevi 11-10-2011 01:50:57

No veo la modificación para que sea de 25 en raya

WhiteJack 11-10-2011 01:58:54

Hola, seriea algo asi pero no es 25 en raya sino 5, pero queda en un ciclo infinito!

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[][5]={
{
NADIE,NADIE,NADIE,NADIE,NADIE},
{
NADIE,NADIE,NADIE,NADIE,NADIE},
{
NADIE,NADIE,NADIE,NADIE,NADIE},
{
NADIE,NADIE,NADIE,NADIE,NADIE},
{
NADIE,NADIE,NADIE,NADIE,NADIE}
};
int mejorFila,mejorCol;
int profundida;

int main(int argccharargv[]){
    
int f,c,ganador;
        
mejorFila=0;
        
mejorCol=0;
        
profundida=0;
    
impTablero();
    do{
        do{
            
cout << "Su Turno:" << endl;
            
cout << "Fila? "cin >> f;
            
cout << "Columna? "cin >> c;
        }while((
f<0||f>=|| c<|| c>=5)||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();
                
profundida=0;
    }while(
ganador==2);

    if(
ganador==-1cout << "***Ud. Gana***";
    else if(
ganador==1cout << "***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<5;i++){
        for(
j=0;j<5;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){
        
profundida++;
    
int i,j,ganador=NADIE;
    for(
i=0;i<5;i++)
        if(
t[i][0]!=NADIE && t[i][0]==t[i][1] && t[i][1]==t[i][2] && t[i][2]==t[i][3] && t[i][3]==t[i][4])
            
ganador=t[i][0];

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

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

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

    if(
ganador==JUGADOR)
                return -
1;

    if(
ganador==COMPUTADOR)
                return 
1;

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

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




La franja horaria es GMT +2. Ahora son las 13:01:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi