Advertisement
Guest User

Untitled

a guest
Apr 26th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.61 KB | None | 0 0
  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))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement