;;; ALPHA-BETA strategy of computer player


(defun alpha-beta (player board alpha beta)
  "Make perfect move with alpha-beta strategy."
  (let ((moves (legal-moves board)))
    (if (or (null moves) (has-won-p player board) (has-won-p (opponent player) board))
	(evaluate player board)
	(let (best-move)
	  (loop for move in moves
		with val do
		(place-piece move player board)
		(setf val (- (alpha-beta (opponent player) board (- beta) (- alpha))))
		(place-piece move empty board)
		(when (> val alpha)
		  (setf alpha val best-move move))
		until (>= alpha beta))
	  (values alpha best-move)))))


(defun alpha-beta-searcher ()
  "Wrapper for ALPHA-BETA."
  #'(lambda (player board)
      (multiple-value-bind (value move)
	  (alpha-beta player board -1 1)
	(declare (ignore value))
	move)))

	