SHARE
TWEET

Untitled

a guest Apr 26th, 2019 70 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (defun heuristica (estado)
  2.   ; current player standpoint
  3.   (let* ((tablero (estado-tablero estado))
  4.          (ficha-actual (estado-turno estado))
  5.          (ficha-oponente (siguiente-jugador ficha-actual)))
  6.     (if (juego-terminado-p estado)
  7.         (let ((ganador (ganador estado)))
  8.           (cond ((not ganador) 0)
  9.                 ((eql ganador ficha-actual) +val-max+)
  10.                 (t +val-min+)))
  11.       (let ((puntuacion-actual 0)
  12.             (puntuacion-oponente 0))
  13.         (loop for columna from 0 below (tablero-ancho tablero) do
  14.               (let* ((altura (altura-columna tablero columna))
  15.                      (fila (1- altura))
  16.                      (abajo (contar-abajo tablero ficha-actual columna fila))
  17.                      (der (contar-derecha-p tablero ficha-actual columna (+ 1 fila)))
  18.                      (izq (contar-izquierda-p tablero ficha-actual columna (+ 1 fila)))
  19.                      (abajo-der (contar-abajo-derecha tablero ficha-actual columna fila))
  20.                      (arriba-izq (contar-arriba-izquierda tablero ficha-actual columna fila))
  21.                      (abajo-izq (contar-abajo-izquierda tablero ficha-actual columna fila))
  22.                      (arriba-der (contar-arriba-derecha tablero ficha-actual columna fila)))
  23.                 (setf puntuacion-actual
  24.                   (+ puntuacion-actual
  25.                      (if (>(+(- 6 altura)abajo) 3)
  26.                          (cond ((= abajo 0) 0)
  27.                                ((= abajo 1) 10)
  28.                                ((= abajo 2) 30)
  29.                                ((= abajo 3) 1000)
  30.                                (t 0))
  31.                        0)
  32.                      
  33.                      (if(>(+ der izq) 2)
  34.                          1000
  35.                        (if (and (= (+ der izq) 2)(/= der 0)(/= izq 0)
  36.                                 (or(and(dentro-del-tablero-p tablero (- columna 2) (+ 1 fila))
  37.                                         (eql (obtener-ficha tablero (- columna 2) (+ 1 fila)) NIL))
  38.                                     (and(dentro-del-tablero-p tablero (+ columna 2) (+ 1 fila))
  39.                                          (eql(obtener-ficha tablero (+  columna 2) (+ 1 fila)) NIL))))
  40.                            30
  41.                          (if ( = der 0)
  42.                              0
  43.                            (if (= der 1)
  44.                                10
  45.                              (if (and (= der 2)  (or(and(dentro-del-tablero-p tablero (- columna 1) (+ 1 fila))
  46.                                                          (eql (obtener-ficha tablero (- columna 1) (+ 1 fila)) NIL))
  47.                                                      (and(dentro-del-tablero-p tablero (+ columna 3) (+ 1 fila))
  48.                                                           (eql(obtener-ficha tablero (+ columna 3) (+ 1 fila)) NIL))))
  49.                                  30
  50.                                
  51.                                (if (= izq 0)
  52.                                    0
  53.                                  
  54.                                  (if (= izq 1)
  55.                                      10
  56.                                    (when (and (= izq 2)(or(and(dentro-del-tablero-p tablero (+ columna 1) (+ 1 fila))
  57.                                                          (eql (obtener-ficha tablero (+ columna 1) (+ 1 fila)) NIL))
  58.                                                      (and(dentro-del-tablero-p tablero (- columna 3) (+ 1 fila))
  59.                                                           (eql(obtener-ficha tablero (- columna 3) (+ 1 fila)) NIL))))
  60.                                      30))))))))
  61.                      
  62.                    )))
  63.               (let* ((altura (altura-columna tablero columna))
  64.                      (fila (1- altura))
  65.                      (abajo (contar-abajo tablero ficha-oponente columna fila))
  66.                      (der (contar-derecha-p tablero ficha-actual columna (+ 1 fila)))
  67.                      (izq (contar-izquierda-p tablero ficha-actual columna (+ 1 fila)))
  68.                      (abajo-der (contar-abajo-derecha tablero ficha-oponente columna fila))
  69.                      (arriba-izq (contar-arriba-izquierda tablero ficha-oponente columna fila))
  70.                      (abajo-izq (contar-abajo-izquierda tablero ficha-oponente columna fila))
  71.                      (arriba-der (contar-arriba-derecha tablero ficha-oponente columna fila)))
  72.                 (setf puntuacion-oponente
  73.                   (+ puntuacion-oponente
  74.                      (if (>(+(- 6 altura)abajo) 3)
  75.                          (cond ((= abajo 0) 0)
  76.                                ((= abajo 1) 10)
  77.                                ((= abajo 2) 30)
  78.                                ((= abajo 3) 1000)
  79.                                (t 0))
  80.                        0)
  81.                      
  82.                      (if(>(+ der izq) 2)
  83.                          1000
  84.                        (if (and (= (+ der izq) 2)(/= der 0)(/= izq 0)
  85.                                 (or(and(dentro-del-tablero-p tablero (- columna 2) (+ 1 fila))
  86.                                         (eql (obtener-ficha tablero (- columna 2) (+ 1 fila)) NIL))
  87.                                     (and(dentro-del-tablero-p tablero (+ columna 2) (+ 1 fila))
  88.                                          (eql(obtener-ficha tablero (+  columna 2) (+ 1 fila)) NIL))))
  89.                            30
  90.                          (if ( = der 0)
  91.                              0
  92.                            (if (= der 1)
  93.                                10
  94.                              (if (and (= der 2)  (or(and(dentro-del-tablero-p tablero (- columna 1) (+ 1 fila))
  95.                                                          (eql (obtener-ficha tablero (- columna 1) (+ 1 fila)) NIL))
  96.                                                      (and(dentro-del-tablero-p tablero (+ columna 3) (+ 1 fila))
  97.                                                           (eql(obtener-ficha tablero (+ columna 3) (+ 1 fila)) NIL))))
  98.                                  30
  99.                                
  100.                                (if (= izq 0)
  101.                                    0
  102.                                  
  103.                                  (if (= izq 1)
  104.                                      10
  105.                                    (when (and (= izq 2)(or(and(dentro-del-tablero-p tablero (+ columna 1) (+ 1 fila))
  106.                                                          (eql (obtener-ficha tablero (+ columna 1) (+ 1 fila)) NIL))
  107.                                                      (and(dentro-del-tablero-p tablero (- columna 3) (+ 1 fila))
  108.                                                           (eql(obtener-ficha tablero (- columna 3) (+ 1 fila)) NIL))))
  109.                                      30))))))))
  110.                      
  111.                     ))))
  112.        
  113.         (let ((puntuacion-alternativa 0))
  114.           (loop for i from 0 to 5 do
  115.                 (loop for j from 0 to 6 do
  116.                       (let ((ficha (obtener-ficha tablero j i))
  117.                             (puntos (aref pesos i j)))
  118.                         (when ficha
  119.                           (if (eql ficha ficha-actual)
  120.                               (setf puntuacion-alternativa (+ puntuacion-alternativa puntos))  
  121.                               (setf puntuacion-alternativa (- puntuacion-alternativa puntos))
  122.                             )))))
  123.          
  124.            (+ (* (- puntuacion-actual puntuacion-oponente) 1) (* puntuacion-alternativa 95) )  
  125.         )
  126.        
  127.         ))))
  128.  
  129.  
  130.  
  131. (defparameter pesos #2A((3 4 5 7 5 4 3)
  132.                         (4 6 8 10 8 6 4)
  133.                         (5 8 11 13 11 8 5)
  134.                         (5 8 11 13 11 8 5)
  135.                         (4 6 8 10 8 6 4)
  136.                         (3 4 5 7 5 4 3)))
  137.  
  138.  
  139. (defun contar-derecha-p (tablero ficha columna fila)
  140.   (if (not (dentro-del-tablero-p tablero columna fila))
  141.       0
  142.     (contar-derecha-p-r tablero ficha (1+ columna) fila)))
  143.  
  144.  
  145. (defun contar-derecha-p-r (tablero ficha columna fila)
  146.   (if (or (not (dentro-del-tablero-p tablero columna fila))
  147.       (not (eql (obtener-ficha tablero columna fila) ficha)))
  148.       0
  149.     (1+ (contar-derecha-p-r tablero ficha (1+ columna) fila))))
  150.  
  151.  
  152.  
  153. (defun contar-izquierda-p (tablero ficha columna fila)
  154.   (if (not (dentro-del-tablero-p tablero columna fila))
  155.       0
  156.     (contar-izquierda-p-r tablero ficha (1- columna) fila)))
  157.  
  158.  
  159. (defun contar-izquierda-p-r (tablero ficha columna fila)
  160.   (if (or (not (dentro-del-tablero-p tablero columna fila))
  161.       (not (eql (obtener-ficha tablero columna fila) ficha)))
  162.       0
  163.     (1+ (contar-izquierda-p-r tablero ficha (1- columna) fila))))
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top