[Aporte] Tres en raya con minimax

Iniciado por 0xFer, 25 Mayo 2015, 21:16 PM

0 Miembros y 1 Visitante están viendo este tema.

0xFer

Un simple juego tres en raya implementado con el algoritmo minimax  :-X


Código (cpp) [Seleccionar]

#include <windows.h>
#include <iostream>
using namespace std;

int t[9];

int check( int turno ){
   int G = 0;
   
   int r[8][3] = {{0,1,2},{3,4,5},{6,7,8},{0,3,6},
              {1,4,7},{2,5,8},{0,4,8},{2,4,6}};

for( int f = 0; f < 8; f++ )
  if( (t[ r[f][0] ] + t[ r[f][1] ] + t[ r[f][2] ] ) == (turno*3)  )
      G = turno;              
 
   return G;
}

int minimax( int p ,int tr ){
int minimax_val = 0;
bool empate = false;
t[p] = tr;

if( check( tr ) == tr )
  return tr;
else
for( int f = 0; f < 9; f++){
       if( t[f] != 0 ) continue;

   int next = minimax( f, -tr);

if( next == -tr ){
t[f] = 0;
return -tr;
}

else if( next == 0){
minimax_val = 0;
empate = true;
}
else if( next == tr )
   if( !empate )
   minimax_val = tr;

t[f] = 0;
}
return minimax_val;
}

void Graficar(){
system("cls");
cout << "\n\n Se juega con:\n 1  2  3\n 4  5  6\n 7  8  9\n La computadora juega con O\n\n";
for(int f = 0; f < 9;f++){
     if( t[f] == 1 ) cout <<" O ";
 else if( t[f] == -1 ) cout << " X ";
 else cout << " - ";
 if( (f +1 )%3 == 0  ) cout << "\n";
    }
}

int main(){
memset(t,0,sizeof(t));
bool Jugando = true;
int tr = 1; /*Si es 1 empieza la computadora, si es -1 Empieza la persona*/
int c = 0;
int g = 0;
while(Jugando){
   Graficar();
if(tr == 1){
   int mejor_movimiento = -1;
   int anext = -1;
   for(int f = 0; f < 9;f++){

       if( t[f] != 0) continue;

   int next = minimax( f, 1);

   if( next > anext ){
  anext = next;
      mejor_movimiento = f;
  }
   t[f] = 0;  
   }
   t[mejor_movimiento] = 1;
}
else{
   int m = -1;
while( !(m > -1 and m < 10) )
  cin >> m;
  t[m-1] = -1;
}

g = check(tr);

if( g == 1 or g == -1  )
  Jugando = false;
 
      else if( c == 8 ){
  g = 0;
        Jugando = false;
}
 
   tr = -tr;
c++;
}
Graficar();
switch(g){
     case  1: cout << "HA GANADO LA COMPUTADORA!!\n"; break;
 case -1: cout << "HAS GANADO FELICIDADES!!\n"; break;
 case  0: cout <<"ES EMPATE, BUEN LOGRO!!\n"; break;
}

getchar();
return 0;
}


Si juegas empatas o pierdes  ;-)
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

Stakewinner00

Hay varios errores graves, usas librerías de C pero tienes ciertas ordenes de C++ como "using namespace std;" o bool... El código esta claramente en C pero entonces porque usas cosas de C++?

0xFer

#2
mmm está en C++
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

Stakewinner00

Cita de: 0xFer en 25 Mayo 2015, 21:19 PM
Si es cierto  >:(

Pues ya que lo haces hazlo bien en C o en C++ ...

0xFer

#4
ya está modificado

Un saludo
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

Stakewinner00

Eso a mi modo de ver sigue siendo C.

0xFer

#6
Por qué? porque utilizo memset?  
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

Stakewinner00

Por como esta programado. Poner 4 couts no lo transforma automaticamente en C++. Además, no queda muy bien esa variable global, por suerte este código es corto y no hay problema, pero si lo aplicas así a programas grandes sera caótico xD

No me se el algoritmo ese del minimax, a ver si algún día para probar lo pruebo a hacer en C++

0xFer

Ah ya entendí, tienes razón jeje, tendría que hacerlo con clases y utilizar más cosas propias de C++  :laugh:
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

Stakewinner00

Cita de: 0xFer en 25 Mayo 2015, 21:54 PM
Ah ya entendí, tienes razón jeje, tendría que hacerlo con clases y utilizar más cosas propias de C++  :laugh:

Tiene más que ver con el diseño creo. C++ soporta POO pero no significa que todo tenga que ser con POO.
Ahora no pude encontrar ningún ejemplo de 3 en raya en C y C++ para ver las diferencias, pero creo que yo lo haría bastante distinto que no tiene porque estar mejor pero siempre es bueno discutirlo xD.
Tampoco me se el algoritmo ese minimax, a ver si tengo algo libre y lo miro (no creo que sea complejo) igual el algoritmo no permite muchas interpretaciones distintas.