LISP function help

  • Thread starter Adam
  • Start date
Got a problem with this function. It is part of a heuristic thing for a game. If I can't get a winning row of five stones, or block a winning row from the opponent, or blah blah blah, I want it to place a stone at some random point adjacent to the opponent's last move. Basically think of a tic-tac-toe grid but larger. A 3x3 array, 0 to 9. If opponent places a stone in 4, then I want it to place randomly in 0 to 3 or 5 to 9. At the moment it almost works, but freezes if the stone is placed on the left edge of the board.

(defun rndplyr ()
  (if (null (get-history))
      (list 0 0 )
    (let ((hist (get-history))
          (lm (car (get-history))))
      (do ((row (+ (car lm) (+ (random 3) -1 ) ))
           (col (+ (cadr lm) (+ (random 3) -1 ) )))
          ((score (list row col) (get-board))
           (list row col)))))
Any hints?


Staff Emeritus
Science Advisor
Gold Member
Your code doesn't seem to error check to see if your value for row and col lie on the board... I surmise that the score function isn't written to handle illegal values and gets itself caught in an infinite loop.

Physics Forums Values

We Value Quality
• Topics based on mainstream science
• Proper English grammar and spelling
We Value Civility
• Positive and compassionate attitudes
• Patience while debating
We Value Productivity
• Disciplined to remain on-topic
• Recognition of own weaknesses
• Solo and co-op problem solving