Autor
|
Tema: [Aporte] Tres en raya con minimax (Leído 5,480 veces)
|
0xFer
Desconectado
Mensajes: 400
|
Un simple juego tres en raya implementado con el algoritmo minimax #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
|
|
« Última modificación: 25 Mayo 2015, 23:05 pm por 0xFer »
|
En línea
|
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++?
|
|
|
En línea
|
|
|
|
0xFer
Desconectado
Mensajes: 400
|
mmm está en C++
|
|
« Última modificación: 22 Marzo 2016, 21:09 pm por 0xFer »
|
En línea
|
int getRandomNumber(){ return 4; //chosen by fair dice roll //guaranteed to be random }
|
|
|
Stakewinner00
|
Si es cierto Pues ya que lo haces hazlo bien en C o en C++ ...
|
|
|
En línea
|
|
|
|
0xFer
Desconectado
Mensajes: 400
|
ya está modificado
Un saludo
|
|
« Última modificación: 22 Marzo 2016, 21:10 pm por 0xFer »
|
En línea
|
int getRandomNumber(){ return 4; //chosen by fair dice roll //guaranteed to be random }
|
|
|
|
0xFer
Desconectado
Mensajes: 400
|
Por qué? porque utilizo memset?
|
|
« Última modificación: 22 Marzo 2016, 21:10 pm por 0xFer »
|
En línea
|
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++
|
|
|
En línea
|
|
|
|
0xFer
Desconectado
Mensajes: 400
|
Ah ya entendí, tienes razón jeje, tendría que hacerlo con clases y utilizar más cosas propias de C++
|
|
|
En línea
|
int getRandomNumber(){ return 4; //chosen by fair dice roll //guaranteed to be random }
|
|
|
Stakewinner00
|
Ah ya entendí, tienes razón jeje, tendría que hacerlo con clases y utilizar más cosas propias de C++ 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
tres en raya con integrdos
Electrónica
|
resistron
|
2
|
3,273
|
24 Junio 2007, 21:24 pm
por resistron
|
|
|
Aporte - Tres en Raya (con IA)
Programación Visual Basic
|
rob1104
|
9
|
10,175
|
9 Marzo 2009, 22:35 pm
por peib0l
|
|
|
[Aporte] 3 en raya (2 Jugadores)
Programación C/C++
|
Manimecker
|
0
|
3,579
|
15 Enero 2012, 03:07 am
por Manimecker
|
|
|
Ejemplo de Minimax: 3 en raya
Programación C/C++
|
ghastlyX
|
4
|
15,281
|
20 Abril 2015, 23:24 pm
por cappa_daniel
|
|
|
tres en raya
Scripting
|
jalbtercero
|
1
|
2,410
|
11 Marzo 2016, 23:46 pm
por engel lex
|
|