Advertisement
Guest User

Untitled

a guest
May 26th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.45 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <vector>
  4. #include <queue>
  5. #include "player.h"
  6. #include "environment.h"
  7.  
  8. using namespace std;
  9.  
  10. const double masinf=9999999999.0, menosinf=-9999999999.0;
  11.  
  12.  
  13. // Constructor
  14. Player::Player(int jug){
  15.     jugador_=jug;
  16. }
  17.  
  18. // Actualiza el estado del juego para el jugador
  19. void Player::Perceive(const Environment & env){
  20.     actual_=env;
  21. }
  22.  
  23. double Puntuacion(int jugador, const Environment &estado){
  24.     double suma=0;
  25.  
  26.     for (int i=0; i<7; i++)
  27.       for (int j=0; j<7; j++){
  28.          if (estado.See_Casilla(i,j)==jugador){
  29.             if (j<3)
  30.                suma += j;
  31.             else
  32.                suma += (6-j);
  33.          }
  34.       }
  35.  
  36.     return suma;
  37. }
  38.  
  39.  
  40. // Funcion de valoracion para testear Poda Alfabeta
  41. double ValoracionTest(const Environment &estado, int jugador){
  42.     int ganador = estado.RevisarTablero();
  43.  
  44.     if (ganador==jugador)
  45.        return 99999999.0; // Gana el jugador que pide la valoracion
  46.     else if (ganador!=0)
  47.             return -99999999.0; // Pierde el jugador que pide la valoracion
  48.     else if (estado.Get_Casillas_Libres()==0)
  49.             return 0;  // Hay un empate global y se ha rellenado completamente el tablero
  50.     else
  51.           return Puntuacion(jugador,estado);
  52. }
  53.  
  54. // ------------------- Los tres metodos anteriores no se pueden modificar
  55.  
  56.  
  57. void FichasVerticales(const Environment &E, int jugador,int fila, int columna,int &verticales){
  58.    verticales = 0;
  59.    for(int i=1;fila-i>=0;i++){
  60.       if(E.See_Casilla(fila-i,columna)!=jugador) break;
  61.       else if(E.See_Casilla(fila-i,columna)==jugador)
  62.          verticales++;
  63.    }
  64.  
  65.    for(int i=1;fila+i<7;i++){
  66.       if(E.See_Casilla(fila+i,columna)!=jugador) break;
  67.       else if(E.See_Casilla(fila+i,columna)==jugador)
  68.          verticales++;
  69.    }
  70. }
  71.  
  72. void FichasHorizontales(const Environment &E, int jugador,int fila, int columna,int &horizontales){
  73.    horizontales = 0;
  74.    for(int i=1;columna-i>=0;i++){
  75.       if(E.See_Casilla(fila,columna-i)!=jugador)break;
  76.       else if(E.See_Casilla(fila,columna-i)==jugador)
  77.          horizontales++;
  78.    }
  79.  
  80.    for(int i=0;columna+i<7;i++){
  81.       if(E.See_Casilla(fila,columna+i)!=jugador)break;
  82.       else if(E.See_Casilla(fila,columna+i)==jugador)
  83.          horizontales++;
  84.    }
  85. }
  86.  
  87.  
  88. void FichasDiagonales(const Environment &E, int jugador,int fila, int columna,int &diagonales){
  89.    diagonales = 0;
  90.    for(int i=1;i<4;i++){
  91.       if(fila+i == 7 || columna+i== 7)break;
  92.  
  93.       if(E.See_Casilla(fila-i,columna-i)!=jugador)break;
  94.       if(E.See_Casilla(fila-i,columna-i)==jugador)
  95.          diagonales++;
  96.    }
  97.  
  98.    for(int i=1;i<4;i++){
  99.       if(fila+i == -1 || columna+i== 7)break;
  100.      
  101.       if(E.See_Casilla(fila-i,columna+i)!=jugador)break;
  102.       else if(E.See_Casilla(fila-i,columna+i)==jugador)
  103.          diagonales++;
  104.    }
  105.  
  106.    for(int i=1;i<4;i++){
  107.       if(fila+i == 7 || columna-i== -1)
  108.          break;
  109.          
  110.       if(E.See_Casilla(fila+i,columna-i)!=jugador)break;
  111.       if(E.See_Casilla(fila+i,columna-i)==jugador)
  112.          diagonales++;
  113.    }
  114.  
  115.    for(int i=1;i<4;i++){
  116.       if(fila+i == -1 || columna-i== 7)
  117.          break;
  118.      
  119.       if(E.See_Casilla(fila-i,columna-i)!=jugador)break;
  120.       if(E.See_Casilla(fila-i,columna-i)==jugador)
  121.          diagonales++;
  122.    }
  123. }
  124.  
  125. double Heuristica(const Environment &E, int jugador){
  126.    double puntuacion = 0;
  127.    int verticales = 0, horizontales = 0, diagonales = 0;
  128.  
  129.    for(int i=0;i<7;i++){
  130.       for(int j=0;j<7;j++){
  131.          FichasVerticales(E,jugador,i,j,verticales);
  132.          FichasHorizontales(E,jugador,i,j,horizontales);
  133.          FichasDiagonales(E,jugador,i,j,diagonales);
  134.          puntuacion += 100*verticales + 100*horizontales + 100*diagonales;
  135.       }
  136.    }
  137.    return puntuacion;
  138. }
  139.  
  140.  
  141.  
  142.  
  143. // Funcion heuristica (ESTA ES LA QUE TENEIS QUE MODIFICAR)
  144. double Valoracion(const Environment &estado, int jugador){
  145.    int rival;
  146.    int ganador = estado.RevisarTablero();
  147.    double puntuacion = 0;
  148.  
  149.    if(jugador == 1)
  150.       rival = 2;
  151.    else
  152.       rival = 1;
  153.  
  154.    if (ganador==jugador)
  155.        return 99999999.0; // Gana el jugador que pide la valoracion
  156.     else if (ganador!=0)
  157.             return -99999999.0; // Pierde el jugador que pide la valoracion
  158.     else if (estado.Get_Casillas_Libres()==0)
  159.             return 0;  // Hay un empate global y se ha rellenado completamente el tablero
  160.     else
  161.       puntuacion -=Heuristica(estado,jugador);
  162.       puntuacion +=Heuristica(estado,rival);
  163. }
  164.  
  165.  
  166.  
  167.  
  168.  
  169. // Esta funcion no se puede usar en la version entregable
  170. // Aparece aqui solo para ILUSTRAR el comportamiento del juego
  171. // ESTO NO IMPLEMENTA NI MINIMAX, NI PODA ALFABETA
  172. void JuegoAleatorio(bool aplicables[], int opciones[], int &j){
  173.     j=0;
  174.     for (int i=0; i<8; i++){
  175.         if (aplicables[i]){
  176.            opciones[j]=i;
  177.            j++;
  178.         }
  179.     }
  180. }
  181.  
  182.  
  183.  
  184. double PodaAlfaBeta(const Environment &E, int jugador, int profundidad,
  185.  Environment::ActionType accion, double alfa, double beta,double &nodos){
  186.    
  187.    if(profundidad == 0 || E.JuegoTerminado()){
  188.       return Valoracion(E,jugador);
  189.    }
  190.  
  191.    nodos++;
  192.  
  193.    bool acciones[8];
  194.    int hijos = E.possible_actions(acciones);
  195.    int ultima_accion = -1;
  196.    Environment::ActionType anterior;
  197.    double valor;
  198.    Environment nodoHijo = E.GenerateNextMove(ultima_accion);
  199.  
  200.    if(profundidad%2==0){
  201.       for(int i=0;i<hijos;i++){
  202.          valor = PodaAlfaBeta(nodoHijo,jugador,profundidad-1,anterior,alfa,beta,nodos);
  203.          if(valor>alfa){
  204.             alfa = valor;
  205.             accion = static_cast<Environment::ActionType>(ultima_accion);
  206.          }
  207.          
  208.          if(beta<=alfa)
  209.             break;
  210.          
  211.          nodoHijo = E.GenerateNextMove(ultima_accion);
  212.       }
  213.       return alfa;
  214.    }
  215.    else{
  216.       for(int i=0;i<hijos;i++){
  217.          valor = PodaAlfaBeta(nodoHijo,jugador,profundidad-1,anterior,alfa,beta,nodos);
  218.          if(valor<beta){
  219.             beta = valor;
  220.             accion = static_cast<Environment::ActionType>(ultima_accion);
  221.       }
  222.          
  223.          if(beta<=alfa)
  224.             break;
  225.          
  226.          nodoHijo = E.GenerateNextMove(ultima_accion);
  227.       }
  228.       return beta;
  229.    }  
  230. }
  231.  
  232.  
  233.  
  234.  
  235. // Invoca el siguiente movimiento del jugador
  236. Environment::ActionType Player::Think(){
  237.     const int PROFUNDIDAD_MINIMAX = 6;  // Umbral maximo de profundidad para el metodo MiniMax
  238.     const int PROFUNDIDAD_ALFABETA = 8; // Umbral maximo de profundidad para la poda Alfa_Beta
  239.  
  240.     Environment::ActionType accion; // acci�n que se va a devolver
  241.     bool aplicables[8]; // Vector bool usado para obtener las acciones que son aplicables en el estado actual. La interpretacion es
  242.                         // aplicables[0]==true si PUT1 es aplicable
  243.                         // aplicables[1]==true si PUT2 es aplicable
  244.                         // aplicables[2]==true si PUT3 es aplicable
  245.                         // aplicables[3]==true si PUT4 es aplicable
  246.                         // aplicables[4]==true si PUT5 es aplicable
  247.                         // aplicables[5]==true si PUT6 es aplicable
  248.                         // aplicables[6]==true si PUT7 es aplicable
  249.                         // aplicables[7]==true si BOOM es aplicable
  250.  
  251.  
  252.  
  253.     double valor; // Almacena el valor con el que se etiqueta el estado tras el proceso de busqueda.
  254.     double alpha, beta; // Cotas de la poda AlfaBeta
  255.  
  256.     int n_act; //Acciones posibles en el estado actual
  257.     double nodos = 0;
  258.  
  259.  
  260.     n_act = actual_.possible_actions(aplicables); // Obtengo las acciones aplicables al estado actual en "aplicables"
  261.     int opciones[10];
  262.  
  263.     // Muestra por la consola las acciones aplicable para el jugador activo
  264.     //actual_.PintaTablero();
  265.     cout << " Acciones aplicables ";
  266.     (jugador_==1) ? cout << "Verde: " : cout << "Azul: ";
  267.     for (int t=0; t<8; t++)
  268.       if (aplicables[t])
  269.          cout << " " << actual_.ActionStr( static_cast< Environment::ActionType > (t)  );
  270.     cout << endl;
  271. /*
  272.     //--------------------- COMENTAR Desde aqui
  273.     cout << "\n\t";
  274.     int n_opciones=0;
  275.     JuegoAleatorio(aplicables, opciones, n_opciones);
  276.  
  277.     if (n_act==0){
  278.       (jugador_==1) ? cout << "Verde: " : cout << "Azul: ";
  279.       cout << " No puede realizar ninguna accion!!!\n";
  280.       //accion = Environment::actIDLE;
  281.     }
  282.     else if (n_act==1){
  283.            (jugador_==1) ? cout << "Verde: " : cout << "Azul: ";
  284.             cout << " Solo se puede realizar la accion "
  285.                  << actual_.ActionStr( static_cast< Environment::ActionType > (opciones[0])  ) << endl;
  286.             accion = static_cast< Environment::ActionType > (opciones[0]);
  287.  
  288.          }
  289.          else { // Hay que elegir entre varias posibles acciones
  290.             int aleatorio = rand()%n_opciones;
  291.             cout << " -> " << actual_.ActionStr( static_cast< Environment::ActionType > (opciones[aleatorio])  ) << endl;
  292.             accion = static_cast< Environment::ActionType > (opciones[aleatorio]);
  293.          }
  294.  
  295.     //--------------------- COMENTAR Hasta aqui
  296. */
  297.  
  298.     //--------------------- AQUI EMPIEZA LA PARTE A REALIZAR POR EL ALUMNO ------------------------------------------------
  299.  
  300.  
  301.     //  Opcion: Poda AlfaBeta
  302.     // NOTA: La parametrizacion es solo orientativa
  303.     alpha = menosinf;
  304.     beta = masinf;
  305.     valor = PodaAlfaBeta(actual_, jugador_, PROFUNDIDAD_ALFABETA, accion, alpha, beta,nodos);
  306.     cout << "Valor MiniMax: " << valor << "  Accion: " << actual_.ActionStr(accion) << endl;
  307.  
  308.     return accion;
  309. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement