Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun heuristica (estado)
- ; current player standpoint
- (let* ((tablero (estado-tablero estado))
- (ficha-actual (estado-turno estado))
- (ficha-oponente (siguiente-jugador ficha-actual)))
- (if (juego-terminado-p estado)
- (let ((ganador (ganador estado)))
- (cond ((not ganador) 0)
- ((eql ganador ficha-actual) +val-max+)
- (t +val-min+)))
- (let ((puntuacion-actual 0)
- (puntuacion-oponente 0))
- (loop for columna from 0 below (tablero-ancho tablero) do
- (let* ((altura (altura-columna tablero columna))
- (fila (1- altura))
- (abajo (contar-abajo tablero ficha-actual columna fila))
- (der (contar-derecha-p tablero ficha-actual columna (+ 1 fila)))
- (izq (contar-izquierda-p tablero ficha-actual columna (+ 1 fila)))
- (abajo-der (contar-abajo-derecha tablero ficha-actual columna fila))
- (arriba-izq (contar-arriba-izquierda tablero ficha-actual columna fila))
- (abajo-izq (contar-abajo-izquierda tablero ficha-actual columna fila))
- (arriba-der (contar-arriba-derecha tablero ficha-actual columna fila)))
- (setf puntuacion-actual
- (+ puntuacion-actual
- (if (>(+(- 6 altura)abajo) 3)
- (cond ((= abajo 0) 0)
- ((= abajo 1) 10)
- ((= abajo 2) 30)
- ((= abajo 3) 1000)
- (t 0))
- 0)
- (if(>(+ der izq) 2)
- 1000
- (if (and (= (+ der izq) 2)(/= der 0)(/= izq 0)
- (or(and(dentro-del-tablero-p tablero (- columna 2) (+ 1 fila))
- (eql (obtener-ficha tablero (- columna 2) (+ 1 fila)) NIL))
- (and(dentro-del-tablero-p tablero (+ columna 2) (+ 1 fila))
- (eql(obtener-ficha tablero (+ columna 2) (+ 1 fila)) NIL))))
- 30
- (if ( = der 0)
- 0
- (if (= der 1)
- 10
- (if (and (= der 2) (or(and(dentro-del-tablero-p tablero (- columna 1) (+ 1 fila))
- (eql (obtener-ficha tablero (- columna 1) (+ 1 fila)) NIL))
- (and(dentro-del-tablero-p tablero (+ columna 3) (+ 1 fila))
- (eql(obtener-ficha tablero (+ columna 3) (+ 1 fila)) NIL))))
- 30
- (if (= izq 0)
- 0
- (if (= izq 1)
- 10
- (when (and (= izq 2)(or(and(dentro-del-tablero-p tablero (+ columna 1) (+ 1 fila))
- (eql (obtener-ficha tablero (+ columna 1) (+ 1 fila)) NIL))
- (and(dentro-del-tablero-p tablero (- columna 3) (+ 1 fila))
- (eql(obtener-ficha tablero (- columna 3) (+ 1 fila)) NIL))))
- 30))))))))
- )))
- (let* ((altura (altura-columna tablero columna))
- (fila (1- altura))
- (abajo (contar-abajo tablero ficha-oponente columna fila))
- (der (contar-derecha-p tablero ficha-actual columna (+ 1 fila)))
- (izq (contar-izquierda-p tablero ficha-actual columna (+ 1 fila)))
- (abajo-der (contar-abajo-derecha tablero ficha-oponente columna fila))
- (arriba-izq (contar-arriba-izquierda tablero ficha-oponente columna fila))
- (abajo-izq (contar-abajo-izquierda tablero ficha-oponente columna fila))
- (arriba-der (contar-arriba-derecha tablero ficha-oponente columna fila)))
- (setf puntuacion-oponente
- (+ puntuacion-oponente
- (if (>(+(- 6 altura)abajo) 3)
- (cond ((= abajo 0) 0)
- ((= abajo 1) 10)
- ((= abajo 2) 30)
- ((= abajo 3) 1000)
- (t 0))
- 0)
- (if(>(+ der izq) 2)
- 1000
- (if (and (= (+ der izq) 2)(/= der 0)(/= izq 0)
- (or(and(dentro-del-tablero-p tablero (- columna 2) (+ 1 fila))
- (eql (obtener-ficha tablero (- columna 2) (+ 1 fila)) NIL))
- (and(dentro-del-tablero-p tablero (+ columna 2) (+ 1 fila))
- (eql(obtener-ficha tablero (+ columna 2) (+ 1 fila)) NIL))))
- 30
- (if ( = der 0)
- 0
- (if (= der 1)
- 10
- (if (and (= der 2) (or(and(dentro-del-tablero-p tablero (- columna 1) (+ 1 fila))
- (eql (obtener-ficha tablero (- columna 1) (+ 1 fila)) NIL))
- (and(dentro-del-tablero-p tablero (+ columna 3) (+ 1 fila))
- (eql(obtener-ficha tablero (+ columna 3) (+ 1 fila)) NIL))))
- 30
- (if (= izq 0)
- 0
- (if (= izq 1)
- 10
- (when (and (= izq 2)(or(and(dentro-del-tablero-p tablero (+ columna 1) (+ 1 fila))
- (eql (obtener-ficha tablero (+ columna 1) (+ 1 fila)) NIL))
- (and(dentro-del-tablero-p tablero (- columna 3) (+ 1 fila))
- (eql(obtener-ficha tablero (- columna 3) (+ 1 fila)) NIL))))
- 30))))))))
- ))))
- (let ((puntuacion-alternativa 0))
- (loop for i from 0 to 5 do
- (loop for j from 0 to 6 do
- (let ((ficha (obtener-ficha tablero j i))
- (puntos (aref pesos i j)))
- (when ficha
- (if (eql ficha ficha-actual)
- (setf puntuacion-alternativa (+ puntuacion-alternativa puntos))
- (setf puntuacion-alternativa (- puntuacion-alternativa puntos))
- )))))
- (+ (* (- puntuacion-actual puntuacion-oponente) 1) (* puntuacion-alternativa 95) )
- )
- ))))
- (defparameter pesos #2A((3 4 5 7 5 4 3)
- (4 6 8 10 8 6 4)
- (5 8 11 13 11 8 5)
- (5 8 11 13 11 8 5)
- (4 6 8 10 8 6 4)
- (3 4 5 7 5 4 3)))
- (defun contar-derecha-p (tablero ficha columna fila)
- (if (not (dentro-del-tablero-p tablero columna fila))
- 0
- (contar-derecha-p-r tablero ficha (1+ columna) fila)))
- (defun contar-derecha-p-r (tablero ficha columna fila)
- (if (or (not (dentro-del-tablero-p tablero columna fila))
- (not (eql (obtener-ficha tablero columna fila) ficha)))
- 0
- (1+ (contar-derecha-p-r tablero ficha (1+ columna) fila))))
- (defun contar-izquierda-p (tablero ficha columna fila)
- (if (not (dentro-del-tablero-p tablero columna fila))
- 0
- (contar-izquierda-p-r tablero ficha (1- columna) fila)))
- (defun contar-izquierda-p-r (tablero ficha columna fila)
- (if (or (not (dentro-del-tablero-p tablero columna fila))
- (not (eql (obtener-ficha tablero columna fila) ficha)))
- 0
- (1+ (contar-izquierda-p-r tablero ficha (1- columna) fila))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement