]> code.delx.au - gnu-emacs/blobdiff - lisp/play/mpuz.el
Update copyright year to 2015
[gnu-emacs] / lisp / play / mpuz.el
index 269da0a061cc5d23ceaa680e60eb0f3e26925df4..9b90e2c0dac0771e30eddf8a722871899542c4b1 100644 (file)
@@ -1,6 +1,6 @@
 ;;; mpuz.el --- multiplication puzzle for GNU Emacs
 
-;; Copyright (C) 1990, 2001-201 Free Software Foundation, Inc.
+;; Copyright (C) 1990, 2001-2015 Free Software Foundation, Inc.
 
 ;; Author: Philippe Schnoebelen <phs@lsv.ens-cachan.fr>
 ;; Overhauled: Daniel Pfeiffer <occitan@esperanto.org>
   :prefix "mpuz-"
   :group 'games)
 
-(random t)                             ; randomize
-
 (defcustom mpuz-silent 'error
   "Set this to nil if you want dings on inputs.
-t means never ding, and `error' means only ding on wrong input."
+The value t means never ding, and `error' means only ding on wrong input."
   :type '(choice (const :tag "No" nil)
                 (const :tag "Yes" t)
                 (const :tag "If correct" error))
@@ -56,26 +54,26 @@ t means never ding, and `error' means only ding on wrong input."
   :group 'mpuz)
 
 (defface mpuz-unsolved
-  '((((class color)) (:foreground "red1" :bold t))
-    (t (:bold t)))
-  "Face to use for letters to be solved."
+  '((default :weight bold)
+    (((class color)) :foreground "red1"))
+  "Face for letters to be solved."
   :group 'mpuz)
 
 (defface mpuz-solved
-  '((((class color)) (:foreground "green1" :bold t))
-    (t (:bold t)))
-  "Face to use for solved digits."
+  '((default :weight bold)
+    (((class color)) :foreground "green1"))
+  "Face for solved digits."
   :group 'mpuz)
 
 (defface mpuz-trivial
-  '((((class color)) (:foreground "blue" :bold t))
-    (t (:bold t)))
-  "Face to use for trivial digits solved for you."
+  '((default :weight bold)
+    (((class color)) :foreground "blue"))
+  "Face for trivial digits solved for you."
   :group 'mpuz)
 
 (defface mpuz-text
-  '((t (:inherit variable-pitch)))
-  "Face to use for text on right."
+  '((t :inherit variable-pitch))
+  "Face for text on right."
   :group 'mpuz)
 
 \f
@@ -88,26 +86,9 @@ t means never ding, and `error' means only ding on wrong input."
 
 (defvar mpuz-mode-map
   (let ((map (make-sparse-keymap)))
-    (define-key map "a" 'mpuz-try-letter)
-    (define-key map "b" 'mpuz-try-letter)
-    (define-key map "c" 'mpuz-try-letter)
-    (define-key map "d" 'mpuz-try-letter)
-    (define-key map "e" 'mpuz-try-letter)
-    (define-key map "f" 'mpuz-try-letter)
-    (define-key map "g" 'mpuz-try-letter)
-    (define-key map "h" 'mpuz-try-letter)
-    (define-key map "i" 'mpuz-try-letter)
-    (define-key map "j" 'mpuz-try-letter)
-    (define-key map "A" 'mpuz-try-letter)
-    (define-key map "B" 'mpuz-try-letter)
-    (define-key map "C" 'mpuz-try-letter)
-    (define-key map "D" 'mpuz-try-letter)
-    (define-key map "E" 'mpuz-try-letter)
-    (define-key map "F" 'mpuz-try-letter)
-    (define-key map "G" 'mpuz-try-letter)
-    (define-key map "H" 'mpuz-try-letter)
-    (define-key map "I" 'mpuz-try-letter)
-    (define-key map "J" 'mpuz-try-letter)
+    (mapc (lambda (ch)
+            (define-key map (char-to-string ch) 'mpuz-try-letter))
+          "abcdefghijABCDEFGHIJ")
     (define-key map "\C-g" 'mpuz-offer-abort)
     (define-key map "?" 'describe-mode)
     map)
@@ -115,7 +96,7 @@ t means never ding, and `error' means only ding on wrong input."
 
 
 
-(defun mpuz-mode ()
+(define-derived-mode mpuz-mode fundamental-mode "Mult Puzzle"
   "Multiplication puzzle mode.
 
 You have to guess which letters stand for which digits in the
@@ -127,13 +108,7 @@ then the digit.  Thus, to guess that A=3, type `A 3'.
 To leave the game to do other editing work, just switch buffers.
 Then you may resume the game with M-x mpuz.
 You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
-  (interactive)
-  (kill-all-local-variables)
-  (setq major-mode 'mpuz-mode
-       mode-name  "Mult Puzzle"
-       tab-width 30)
-  (use-local-map mpuz-mode-map)
-  (run-mode-hooks 'mpuz-mode-hook))
+  (setq tab-width 30))
 
 \f
 ;; Some variables for statistics
@@ -171,7 +146,7 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
   "A permutation from [0..9] to [0..9].")
 
 (defvar mpuz-letter-to-digit (make-vector 10 0)
-  "The inverse of mpuz-digit-to-letter.")
+  "The inverse of `mpuz-digit-to-letter'.")
 
 (defmacro mpuz-to-digit (letter)
   (list 'aref 'mpuz-letter-to-digit letter))
@@ -198,17 +173,16 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
 (defvar mpuz-board (make-vector 10 nil)
   "The board associates to any digit the list of squares where it appears.")
 
-(defun mpuz-put-number-on-board (number row &rest l)
+(defun mpuz-put-number-on-board (number row &rest columns)
   "Put (last digit of) NUMBER on ROW and COLUMNS of the puzzle board."
   (let (digit)
-    (while l
+    (dolist (column columns)
       (setq digit (% number 10)
-           number (/ number 10))
-      (aset mpuz-board digit `((,row . ,(car l)) ,@(aref mpuz-board digit)))
-      (setq l (cdr l)))))
+            number (/ number 10))
+      (aset mpuz-board digit `((,row . ,column) ,@(aref mpuz-board digit))))))
 
 (defun mpuz-check-all-solved (&optional row col)
-  "Check whether all digits have been solved. Return t if yes."
+  "Check whether all digits have been solved.  Return t if yes."
   (catch 'solved
     (let (A B1 B2 C D E squares)
       (and mpuz-solve-when-trivial
@@ -294,7 +268,7 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
   "The general picture of the puzzle screen, as a string.")
 
 (defun mpuz-create-buffer ()
-  "Create (or recreate) the puzzle buffer. Return it."
+  "Create (or recreate) the puzzle buffer.  Return it."
   (let ((buf (get-buffer-create "*Mult Puzzle*"))
        (face '(face mpuz-text))
        buffer-read-only)
@@ -425,7 +399,7 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
   "Propose a digit for a letter in puzzle."
   (interactive)
   (if mpuz-in-progress
-      (let (letter-char digit digit-char message)
+      (let (letter-char digit digit-char)
        (setq letter-char (upcase last-command-event)
              digit (mpuz-to-digit (- letter-char ?A)))
        (cond ((mpuz-digit-solved-p digit)
@@ -454,8 +428,7 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
   "Propose LETTER-CHAR as code for DIGIT-CHAR."
   (let* ((letter (- letter-char ?A))
         (digit (- digit-char ?0))
-        (correct-digit (mpuz-to-digit letter))
-        (game mpuz-nb-completed-games))
+        (correct-digit (mpuz-to-digit letter)))
     (cond ((mpuz-digit-solved-p correct-digit)
           (message "%c has already been found." (+ correct-digit ?0)))
          ((mpuz-digit-solved-p digit)