;; -*- Mode: Lisp; -*- 

;;;; Problem-Solving Agents

(defstructure (problem-solving-agent (:include agent))
  "An agent that applies a search algorithm to a problem to find a solution,
  and then follows the steps of the solution, one at a time, and then stops."
  (algorithm 'A*-search))

;;;; Game-Playing Agents

(defstructure (game-agent (:include agent))
  "An agent that plays n-player games.  The ALGORITHM slot is filled by
  a function that takes state and game arguments, and returns a move."
  (algorithm 'minimax-decision))

(defstructure (random-game-agent 
	       (:include game-agent (algorithm 'pick-random-move)))
  "A game-playing agent that picks randomly from the legal moves.")

(defstructure (human-game-agent 
	       (:include game-agent (algorithm 'ask-game-user)))
  "A game-playing agent that asks the human user what to do.")

(defun pick-random-move (state game)
  (random-element (or (legal-moves game state) '(nothing))))

(defun ask-game-user (state game)
  (let ((legal-moves (legal-moves game state)))
    (loop (format t "~&~A's move? " (current-player state))
      (let ((move (read)))
	(when (member move legal-moves :test #'equal)
	  (RETURN move))
	(format t "~&~A is illegal for ~A.  Choose one of:~%  ~A.~%"
		move (current-player state) legal-moves)))))