summaryrefslogtreecommitdiff
path: root/chess-puzzle.el
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2002-04-22 19:23:45 +0000
committerJohn Wiegley <johnw@newartisans.com>2002-04-22 19:23:45 +0000
commit62c13bcfa1933274be856ac5840a933bbaca5f27 (patch)
tree81e2d4ab1a749a4d2561e824708abd60a04d67d0 /chess-puzzle.el
parent171cc1aceb0e9acafe329ff6cd0ca1e2852876ce (diff)
Bug fixes and reducing the TODO list.
Diffstat (limited to 'chess-puzzle.el')
-rw-r--r--chess-puzzle.el69
1 files changed, 69 insertions, 0 deletions
diff --git a/chess-puzzle.el b/chess-puzzle.el
new file mode 100644
index 0000000..e47dfe1
--- /dev/null
+++ b/chess-puzzle.el
@@ -0,0 +1,69 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; A special kind of display that merely autosaves the game
+;;
+
+(require 'chess-game)
+(require 'chess-random)
+(require 'chess-database)
+(require 'chess-file)
+
+(defvar chess-puzzle-indices nil)
+(defvar chess-puzzle-position nil)
+
+(make-variable-buffer-local 'chess-puzzle-indices)
+(make-variable-buffer-local 'chess-puzzle-position)
+
+(chess-message-catalog 'english
+ '((bad-game-read . "Error reading game at position %d")
+ (end-of-puzzles . "There are no more puzzles in this collection")))
+
+;;;###autoload
+(defun chess-puzzle (file &optional index)
+ "Pick a random puzzle from FILE, and solve it against the default engine.
+The spacebar in the display buffer is bound to `chess-puzzle-next',
+making it easy to go on to the next puzzle once you've solved one."
+ (interactive "fRead chess puzzles from: ")
+ (let* ((database (chess-database-open 'chess-file file))
+ (objects (and database (chess-session)))
+ (display (cadr objects)))
+ (when database
+ (with-current-buffer display
+ ;; make sure the database is closed when the display is shutdown
+ (chess-game-add-hook (chess-display-game nil)
+ 'chess-database-event-handler database)
+ (chess-game-set-data (chess-display-game nil) 'database database)
+ (define-key (current-local-map) [? ] 'chess-puzzle-next)
+ (let ((count (chess-database-count database)))
+ (setq chess-puzzle-indices (make-vector count nil))
+ (dotimes (i count)
+ (aset chess-puzzle-indices i i))
+ (random t)
+ (chess-shuffle-vector chess-puzzle-indices)
+ (setq chess-puzzle-position 0))
+ (chess-puzzle-next)))))
+
+(defun chess-puzzle-next ()
+ "Play the next puzzle in the collection, selected randomly."
+ (interactive)
+ (let* ((game (chess-display-game nil))
+ (database (chess-game-data game 'database))
+ (index chess-puzzle-position)
+ next-game)
+ (if (= index (length chess-puzzle-indices))
+ (chess-message 'end-of-puzzles)
+ (setq chess-puzzle-position (1+ chess-puzzle-position))
+ (if (null (setq next-game
+ (chess-database-read database
+ (aref chess-puzzle-indices index))))
+ (chess-error 'bag-game-read
+ (aref chess-puzzle-indices index))
+ (chess-display-set-game nil next-game 0)
+ (chess-game-set-data game 'my-color
+ (chess-pos-side-to-move (chess-game-pos game)))
+ (dolist (key '(database database-index database-count))
+ (chess-game-set-data game key (chess-game-data next-game key)))))))
+
+(provide 'chess-puzzle)
+
+;;; chess-puzzle.el ends here