elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Aporte] Tres en raya con minimax
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Aporte] Tres en raya con minimax  (Leído 5,470 veces)
0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
[Aporte] Tres en raya con minimax
« 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  ;-)


« Última modificación: 25 Mayo 2015, 23:05 pm por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: [Aporte] Tres en raya con minimax
« Respuesta #1 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++?


En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: [Aporte] Tres en raya con minimax
« Respuesta #2 en: 25 Mayo 2015, 21:19 pm »

mmm está en C++
« Última modificación: 22 Marzo 2016, 21:09 pm por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: [Aporte] Tres en raya con minimax
« Respuesta #3 en: 25 Mayo 2015, 21:20 pm »

Si es cierto  >:(

Pues ya que lo haces hazlo bien en C o en C++ ...
En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: [Aporte] Tres en raya con minimax
« Respuesta #4 en: 25 Mayo 2015, 21:27 pm »

ya está modificado

Un saludo
« Última modificación: 22 Marzo 2016, 21:10 pm por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: [Aporte] Tres en raya con minimax
« Respuesta #5 en: 25 Mayo 2015, 21:36 pm »

Eso a mi modo de ver sigue siendo C.
En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: [Aporte] Tres en raya con minimax
« Respuesta #6 en: 25 Mayo 2015, 21:39 pm »

Por qué? porque utilizo memset?  
« Última modificación: 22 Marzo 2016, 21:10 pm por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: [Aporte] Tres en raya con minimax
« Respuesta #7 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++
En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: [Aporte] Tres en raya con minimax
« Respuesta #8 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:
En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: [Aporte] Tres en raya con minimax
« Respuesta #9 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
tres en raya con integrdos
Electrónica
resistron 2 3,270 Último mensaje 24 Junio 2007, 21:24 pm
por resistron
Aporte - Tres en Raya (con IA)
Programación Visual Basic
rob1104 9 10,163 Último mensaje 9 Marzo 2009, 22:35 pm
por peib0l
[Aporte] 3 en raya (2 Jugadores)
Programación C/C++
Manimecker 0 3,572 Último mensaje 15 Enero 2012, 03:07 am
por Manimecker
Ejemplo de Minimax: 3 en raya
Programación C/C++
ghastlyX 4 15,269 Último mensaje 20 Abril 2015, 23:24 pm
por cappa_daniel
tres en raya
Scripting
jalbtercero 1 2,401 Último mensaje 11 Marzo 2016, 23:46 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines