Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 0xFer en 25 Mayo 2015, 21:16 pm



Título: [Aporte] Tres en raya con minimax
Publicado por: 0xFer en 25 Mayo 2015, 21:16 pm
Un simple juego tres en raya implementado con el algoritmo minimax  :-X


Código
  1. #include <windows.h>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int t[9];
  6.  
  7. int check( int turno ){
  8.    int G = 0;
  9.  
  10.    int r[8][3] = {{0,1,2},{3,4,5},{6,7,8},{0,3,6},
  11.               {1,4,7},{2,5,8},{0,4,8},{2,4,6}};
  12.  
  13. for( int f = 0; f < 8; f++ )
  14.   if( (t[ r[f][0] ] + t[ r[f][1] ] + t[ r[f][2] ] ) == (turno*3)  )
  15.       G = turno;              
  16.  
  17.    return G;
  18. }
  19.  
  20. int minimax( int p ,int tr ){
  21. int minimax_val = 0;
  22. bool empate = false;
  23. t[p] = tr;
  24.  
  25. if( check( tr ) == tr )
  26.   return tr;
  27. else
  28. for( int f = 0; f < 9; f++){
  29.        if( t[f] != 0 ) continue;
  30.  
  31.    int next = minimax( f, -tr);
  32.  
  33. if( next == -tr ){
  34. t[f] = 0;
  35. return -tr;
  36. }
  37.  
  38. else if( next == 0){
  39. minimax_val = 0;
  40. empate = true;
  41. }
  42. else if( next == tr )
  43.    if( !empate )
  44.    minimax_val = tr;
  45.  
  46. t[f] = 0;
  47. }
  48. return minimax_val;
  49. }
  50.  
  51. void Graficar(){
  52. system("cls");
  53. 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";
  54. for(int f = 0; f < 9;f++){
  55.      if( t[f] == 1 ) cout <<" O ";
  56.  else if( t[f] == -1 ) cout << " X ";
  57.  else cout << " - ";
  58.  if( (f +1 )%3 == 0  ) cout << "\n";
  59.     }
  60. }
  61.  
  62. int main(){
  63. memset(t,0,sizeof(t));
  64. bool Jugando = true;
  65. int tr = 1; /*Si es 1 empieza la computadora, si es -1 Empieza la persona*/
  66. int c = 0;
  67. int g = 0;
  68. while(Jugando){
  69.    Graficar();
  70. if(tr == 1){
  71.    int mejor_movimiento = -1;
  72.    int anext = -1;
  73.    for(int f = 0; f < 9;f++){
  74.  
  75.        if( t[f] != 0) continue;
  76.  
  77.    int next = minimax( f, 1);
  78.  
  79.    if( next > anext ){
  80.   anext = next;
  81.       mejor_movimiento = f;
  82.   }
  83.    t[f] = 0;  
  84.    }
  85.    t[mejor_movimiento] = 1;
  86. }
  87. else{
  88.    int m = -1;
  89. while( !(m > -1 and m < 10) )
  90.   cin >> m;
  91.   t[m-1] = -1;
  92. }
  93.  
  94. g = check(tr);
  95.  
  96. if( g == 1 or g == -1  )
  97.   Jugando = false;
  98.  
  99.       else if( c == 8 ){
  100.   g = 0;
  101.         Jugando = false;
  102. }
  103.  
  104.    tr = -tr;
  105. c++;
  106. }
  107. Graficar();
  108. switch(g){
  109.      case  1: cout << "HA GANADO LA COMPUTADORA!!\n"; break;
  110.  case -1: cout << "HAS GANADO FELICIDADES!!\n"; break;
  111.  case  0: cout <<"ES EMPATE, BUEN LOGRO!!\n"; break;
  112. }
  113.  
  114. getchar();
  115. return 0;
  116. }
  117.  

Si juegas empatas o pierdes  ;-)


Título: Re: [Aporte] Tres en raya con minimax
Publicado por: Stakewinner00 en 25 Mayo 2015, 21:18 pm
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++?


Título: Re: [Aporte] Tres en raya con minimax
Publicado por: 0xFer en 25 Mayo 2015, 21:19 pm
mmm está en C++


Título: Re: [Aporte] Tres en raya con minimax
Publicado por: Stakewinner00 en 25 Mayo 2015, 21:20 pm
Si es cierto  >:(

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


Título: Re: [Aporte] Tres en raya con minimax
Publicado por: 0xFer en 25 Mayo 2015, 21:27 pm
ya está modificado

Un saludo


Título: Re: [Aporte] Tres en raya con minimax
Publicado por: Stakewinner00 en 25 Mayo 2015, 21:36 pm
Eso a mi modo de ver sigue siendo C.


Título: Re: [Aporte] Tres en raya con minimax
Publicado por: 0xFer en 25 Mayo 2015, 21:39 pm
Por qué? porque utilizo memset?  


Título: Re: [Aporte] Tres en raya con minimax
Publicado por: Stakewinner00 en 25 Mayo 2015, 21:51 pm
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++


Título: Re: [Aporte] Tres en raya con minimax
Publicado por: 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:


Título: Re: [Aporte] Tres en raya con minimax
Publicado por: Stakewinner00 en 25 Mayo 2015, 22:02 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.