annotate lisp/play/mpuz.el @ 18092:8428d56cd207

(smtpmail-via-smtp): Recognize XVRB as a synonym for VERB and XONE as a synonym for ONEX. (smtpmail-read-response): Add "%s" to `message' calls to avoid problems with percent signs in strings. (smtpmail-read-response): Return all lines of the response text as a list of strings. Formerly only the first line was returned. This is insufficient when one wants to parse e.g. an EHLO response. Ignore responses starting with "0". This is necessary to support the VERB SMTP extension. (smtpmail-via-smtp): Try EHLO and find out which SMTP service extensions the receiving mailer supports. Issue the ONEX and XUSR commands if the corresponding extensions are supported. Issue VERB if supported and `smtpmail-debug-info' is non-nil. Add SIZE attribute to MAIL FROM: command if SIZE extension is supported. Add code that could set the BODY= attribute to MAIL FROM: if the receiving mailer supports 8BITMIME. This is currently disabled, since doing it right might involve adding MIME headers to, and in some cases reencoding, the message.
author Richard M. Stallman <rms@gnu.org>
date Sun, 01 Jun 1997 22:24:22 +0000
parents 83f275dcd93a
children 6e13dd3d1e11
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
659
505130d1ddf8 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 232
diff changeset
1 ;;; mpuz.el --- multiplication puzzle for GNU Emacs
505130d1ddf8 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 232
diff changeset
2
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
3 ;; Copyright (C) 1990 Free Software Foundation, Inc.
838
c8798ebd7d95 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 791
diff changeset
4
791
203c23c9f22c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 659
diff changeset
5 ;; Author: Philippe Schnoebelen <phs@lifia.imag.fr>
203c23c9f22c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 659
diff changeset
6 ;; Keywords: games
203c23c9f22c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 659
diff changeset
7
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
13 ;; any later version.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
18 ;; GNU General Public License for more details.
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
19
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 4400
diff changeset
20 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14040
diff changeset
23 ;; Boston, MA 02111-1307, USA.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
2308
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
25 ;;; Commentary:
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
26
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
27 ;; When this package is loaded, `M-x mpuz' generates a random multiplication
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
28 ;; puzzle. This is a multiplication example in which each digit has been
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
29 ;; consistently replaced with some letter. Your job is to reconstruct
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
30 ;; the original digits. Type `?' while the mode is active for detailed help.
f287613dfc28 Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1217
diff changeset
31
791
203c23c9f22c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 659
diff changeset
32 ;;; Code:
203c23c9f22c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 659
diff changeset
33
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 (random t) ; randomize
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 (defvar mpuz-silent nil
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 "*Set this to T if you don't want dings on inputs.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 (defun mpuz-ding ()
232
c0bd9c7f9c42 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 142
diff changeset
40 "Dings, unless global variable `mpuz-silent' forbids it."
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 (or mpuz-silent (ding t)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;; Mpuz mode and keymaps
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 ;;----------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 (defvar mpuz-mode-hook nil)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 (defvar mpuz-mode-map nil
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 "Local keymap to use in Mult Puzzle.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 (if mpuz-mode-map nil
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 (setq mpuz-mode-map (make-sparse-keymap))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 (define-key mpuz-mode-map "a" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 (define-key mpuz-mode-map "b" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 (define-key mpuz-mode-map "c" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 (define-key mpuz-mode-map "d" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 (define-key mpuz-mode-map "e" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 (define-key mpuz-mode-map "f" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 (define-key mpuz-mode-map "g" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 (define-key mpuz-mode-map "h" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 (define-key mpuz-mode-map "i" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 (define-key mpuz-mode-map "j" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 (define-key mpuz-mode-map "A" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 (define-key mpuz-mode-map "B" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 (define-key mpuz-mode-map "C" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 (define-key mpuz-mode-map "D" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 (define-key mpuz-mode-map "E" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 (define-key mpuz-mode-map "F" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 (define-key mpuz-mode-map "G" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 (define-key mpuz-mode-map "H" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 (define-key mpuz-mode-map "I" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 (define-key mpuz-mode-map "J" 'mpuz-try-letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 (define-key mpuz-mode-map "\C-g" 'mpuz-offer-abort)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 (define-key mpuz-mode-map "?" 'describe-mode))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 (defun mpuz-mode ()
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
77 "Multiplication puzzle mode.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78
232
c0bd9c7f9c42 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 142
diff changeset
79 You have to guess which letters stand for which digits in the
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
80 multiplication displayed inside the `*Mult Puzzle*' buffer.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
82 You may enter a guess for a letter's value by typing first the letter,
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
83 then the digit. Thus, to guess that A=3, type A 3.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
85 To leave the game to do other editing work, just switch buffers.
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
86 Then you may resume the game with M-x mpuz.
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
87 You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 (interactive)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 (setq major-mode 'mpuz-mode
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 mode-name "Mult Puzzle")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 (use-local-map mpuz-mode-map)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 (run-hooks 'mpuz-mode-hook))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 ;; Some variables for statistics
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 ;;------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 (defvar mpuz-nb-errors 0
232
c0bd9c7f9c42 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 142
diff changeset
98 "Number of errors made in current game.")
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 (defvar mpuz-nb-completed-games 0
232
c0bd9c7f9c42 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 142
diff changeset
101 "Number of games completed.")
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 (defvar mpuz-nb-cumulated-errors 0
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 "Number of errors made in previous games.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 ;; Some variables for game tracking
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 ;;---------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 (defvar mpuz-in-progress nil
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 "True if a game is currently in progress.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 (defvar mpuz-found-digits (make-vector 10 nil)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 "A vector recording which digits have been decrypted.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 (defmacro mpuz-digit-solved-p (digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 (list 'aref 'mpuz-found-digits digit))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 ;; A puzzle uses a permutation of [0..9] into itself.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 ;; We use both the permutation and its inverse.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 ;;---------------------------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 (defvar mpuz-digit-to-letter (make-vector 10 0)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 "A permutation from [0..9] to [0..9].")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 (defvar mpuz-letter-to-digit (make-vector 10 0)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 "The inverse of mpuz-digit-to-letter.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 (defmacro mpuz-to-digit (letter)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 (list 'aref 'mpuz-letter-to-digit letter))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 (defmacro mpuz-to-letter (digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132 (list 'aref 'mpuz-digit-to-letter digit))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 (defun mpuz-build-random-perm ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 "Initialize puzzle coding with a random permutation."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 (let ((letters (list 0 1 2 3 4 5 6 7 8 9)) ; new cons cells, because of delq
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 (index 10)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 elem)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 (while letters
4400
a549089c0d15 (mpuz-random): Remove.
Paul Eggert <eggert@twinsun.com>
parents: 4345
diff changeset
140 (setq elem (nth (random index) letters)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 letters (delq elem letters)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 index (1- index))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 (aset mpuz-digit-to-letter index elem)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 (aset mpuz-letter-to-digit elem index))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 2451
diff changeset
147 ;; A puzzle also uses a board displaying a multiplication.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 ;; Every digit appears in the board, crypted or not.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 ;;------------------------------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 (defvar mpuz-board (make-vector 10 nil)
4345
49e68bc65e26 * mpuz.el (mpuz-board): Doc fix.
Jim Blandy <jimb@redhat.com>
parents: 3591
diff changeset
151 "The board associates to any digit the list of squares where it appears.")
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 (defun mpuz-put-digit-on-board (number square)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 "Put (last digit of) NUMBER on SQUARE of the puzzle board."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 ;; i.e. push SQUARE on NUMBER square-list
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 (setq number (% number 10))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 (aset mpuz-board number (cons square (aref mpuz-board number))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 (defun mpuz-check-all-solved ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 "Check whether all digits have been solved. Return t if yes."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 (catch 'found
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 (let ((digit -1))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 (while (> 10 (setq digit (1+ digit)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 (if (and (not (mpuz-digit-solved-p digit)) ; unsolved
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 (aref mpuz-board digit)) ; and appearing in the puzzle !
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 (throw 'found nil))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 t))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 ;; To build a puzzle, we take two random numbers and multiply them.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 ;; We also take a random permutation for encryption.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 ;; The random numbers are only use to see which digit appears in which square
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 ;; of the board. Everything is stored in individual squares.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 ;;---------------------------------------------------------------------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 (defun mpuz-random-puzzle ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 "Draw random values to be multiplied in a puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 (mpuz-build-random-perm)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 (fillarray mpuz-board nil) ; erase the board
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 (let (A B C D E)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 ;; A,B,C,D & E, are the five rows of our multiplication.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 ;; Choose random values, discarding uninteresting cases.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 (while (progn
4400
a549089c0d15 (mpuz-random): Remove.
Paul Eggert <eggert@twinsun.com>
parents: 4345
diff changeset
183 (setq A (random 1000)
a549089c0d15 (mpuz-random): Remove.
Paul Eggert <eggert@twinsun.com>
parents: 4345
diff changeset
184 B (random 100)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 C (* A (% B 10))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 D (* A (/ B 10))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 E (* A B))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 (or (< C 1000) (< D 1000)))) ; forbid leading zeros in C or D
14040
187735b53d52 Comment fixes.
Karl Heuer <kwzh@gnu.org>
parents: 6736
diff changeset
189 ;; Individual digits are now put on their respective squares.
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 ;; [NB: A square is a pair <row,column> of the screen.]
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 (mpuz-put-digit-on-board A '(2 . 9))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 (mpuz-put-digit-on-board (/ A 10) '(2 . 7))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 (mpuz-put-digit-on-board (/ A 100) '(2 . 5))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 (mpuz-put-digit-on-board B '(4 . 9))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 (mpuz-put-digit-on-board (/ B 10) '(4 . 7))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 (mpuz-put-digit-on-board C '(6 . 9))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 (mpuz-put-digit-on-board (/ C 10) '(6 . 7))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 (mpuz-put-digit-on-board (/ C 100) '(6 . 5))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 (mpuz-put-digit-on-board (/ C 1000) '(6 . 3))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 (mpuz-put-digit-on-board D '(8 . 7))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 (mpuz-put-digit-on-board (/ D 10) '(8 . 5))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 (mpuz-put-digit-on-board (/ D 100) '(8 . 3))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 (mpuz-put-digit-on-board (/ D 1000) '(8 . 1))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 (mpuz-put-digit-on-board E '(10 . 9))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 (mpuz-put-digit-on-board (/ E 10) '(10 . 7))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 (mpuz-put-digit-on-board (/ E 100) '(10 . 5))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 (mpuz-put-digit-on-board (/ E 1000) '(10 . 3))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 (mpuz-put-digit-on-board (/ E 10000) '(10 . 1))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 ;; Display
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 ;;--------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 (defconst mpuz-framework
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 "
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 . . .
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 Number of errors (this game): 0
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 x . .
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 -------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 . . . .
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 Number of completed games: 0
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 . . . .
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221 --------- Average number of errors: 0.00
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 . . . . ."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 "The general picture of the puzzle screen, as a string.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 (defun mpuz-create-buffer ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 "Create (or recreate) the puzzle buffer. Return it."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 (let ((buff (get-buffer-create "*Mult Puzzle*")))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 (save-excursion
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229 (set-buffer buff)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 (let ((buffer-read-only nil))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 (erase-buffer)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
232 (insert mpuz-framework)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 (mpuz-paint-board)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 (mpuz-paint-errors)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 (mpuz-paint-statistics)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 buff))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 (defun mpuz-paint-errors ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 "Paint error count on the puzzle screen."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 (mpuz-switch-to-window)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 (let ((buffer-read-only nil))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 (goto-line 3)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 (move-to-column 49)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 (mpuz-delete-line)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 (insert (prin1-to-string mpuz-nb-errors))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 (defun mpuz-paint-statistics ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 "Paint statistics about previous games on the puzzle screen."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 (let* ((mean (if (zerop mpuz-nb-completed-games) 0
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 (/ (+ mpuz-nb-completed-games (* 200 mpuz-nb-cumulated-errors))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 (* 2 mpuz-nb-completed-games))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 (frac-part (% mean 100)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 (let ((buffer-read-only nil))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 (goto-line 7)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 (move-to-column 51)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 (mpuz-delete-line)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 (insert (prin1-to-string mpuz-nb-completed-games))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 (goto-line 9)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 (move-to-column 50)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 (mpuz-delete-line)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 (insert (format "%d.%d%d" (/ mean 100) (/ frac-part 10) (% frac-part 10))))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 (defun mpuz-paint-board ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 "Paint board situation on the puzzle screen."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 (mpuz-switch-to-window)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 (let ((letter -1))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 (while (> 10 (setq letter (1+ letter)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 (mpuz-paint-digit (mpuz-to-digit letter))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 (goto-char (point-min)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 (defun mpuz-paint-digit (digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 "Paint all occurrences of DIGIT on the puzzle board."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 ;; (mpuz-switch-to-window)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 (let ((char (if (mpuz-digit-solved-p digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 (+ digit ?0)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 (+ (mpuz-to-letter digit) ?A)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 (square-l (aref mpuz-board digit)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 (let ((buffer-read-only nil))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 (while square-l
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 (goto-line (car (car square-l))) ; line before column !
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 (move-to-column (cdr (car square-l)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 (insert char)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 (delete-char 1)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 (backward-char 1)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 (setq square-l (cdr square-l))))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 (defun mpuz-delete-line ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 "Clear from point to next newline." ; & put nothing in the kill ring
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 (while (not (= ?\n (char-after (point))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 (delete-char 1)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 (defun mpuz-get-buffer ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 "Get the puzzle buffer if it exists."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 (get-buffer "*Mult Puzzle*"))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 (defun mpuz-switch-to-window ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 "Find or create the Mult-Puzzle buffer, and display it."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 (let ((buff (mpuz-get-buffer)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 (or buff (setq buff (mpuz-create-buffer)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 (switch-to-buffer buff)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 (or buffer-read-only (toggle-read-only))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 (mpuz-mode)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 ;; Game control
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 ;;-------------
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 (defun mpuz-abort-game ()
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 2451
diff changeset
308 "Abort any puzzle in progress."
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 (message "Mult Puzzle aborted.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 (setq mpuz-in-progress nil
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 mpuz-nb-errors 0)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 (fillarray mpuz-board nil)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 (let ((buff (mpuz-get-buffer)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 (if buff (kill-buffer buff))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 (defun mpuz-start-new-game ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 "Start a new puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 (message "Here we go...")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 (setq mpuz-nb-errors 0
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 mpuz-in-progress t)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 (fillarray mpuz-found-digits nil) ; initialize mpuz-found-digits
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 (mpuz-random-puzzle)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 (mpuz-switch-to-window)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 (mpuz-paint-board)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 (mpuz-paint-errors)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 (mpuz-ask-for-try))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 (defun mpuz-offer-new-game ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 "Ask if user wants to start a new puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 (if (y-or-n-p "Start a new game ")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 (mpuz-start-new-game)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 (message "OK. I won't.")))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
333
1217
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
334 ;;;###autoload
d0b19afef0ae Fix setup of mpuz-read-map not to depend on keymap format.
Richard M. Stallman <rms@gnu.org>
parents: 838
diff changeset
335 (defun mpuz ()
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 "Multiplication puzzle with GNU Emacs."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 ;; Main entry point
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 (interactive)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 (mpuz-switch-to-window)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 (if mpuz-in-progress
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 (mpuz-offer-abort)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 (mpuz-start-new-game)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 (defun mpuz-offer-abort ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 "Ask if user wants to abort current puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 (interactive)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 (if (y-or-n-p "Abort game ")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 (mpuz-abort-game)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 (mpuz-ask-for-try)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 (defun mpuz-ask-for-try ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 "Ask for user proposal in puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 (message "Your try ?"))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 (defun mpuz-try-letter ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 "Propose a digit for a letter in puzzle."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 (interactive)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 (if mpuz-in-progress
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 (let (letter-char digit digit-char message)
2451
a149f1464f40 (mpuz-try-letter): Use read-char to read digit.
Richard M. Stallman <rms@gnu.org>
parents: 2308
diff changeset
360 (setq letter-char (upcase last-command-char)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 digit (mpuz-to-digit (- letter-char ?A)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 (cond ((mpuz-digit-solved-p digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 (message "%c already solved." letter-char))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 ((null (aref mpuz-board digit))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 (message "%c does not appear." letter-char))
2451
a149f1464f40 (mpuz-try-letter): Use read-char to read digit.
Richard M. Stallman <rms@gnu.org>
parents: 2308
diff changeset
366 ((progn (message "%c = " letter-char)
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 ;; <char> has been entered.
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 ;; Print "<char> =" and
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 ;; read <num> or = <num>
2451
a149f1464f40 (mpuz-try-letter): Use read-char to read digit.
Richard M. Stallman <rms@gnu.org>
parents: 2308
diff changeset
370 (setq digit-char (read-char))
a149f1464f40 (mpuz-try-letter): Use read-char to read digit.
Richard M. Stallman <rms@gnu.org>
parents: 2308
diff changeset
371 (if (eq digit-char ?=)
a149f1464f40 (mpuz-try-letter): Use read-char to read digit.
Richard M. Stallman <rms@gnu.org>
parents: 2308
diff changeset
372 (setq digit-char (read-char)))
142
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 (message "%c = %c" letter-char digit-char)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 (or (> digit-char ?9) (< digit-char ?0))) ; bad input
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 (ding t))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 (t
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 (mpuz-try-proposal letter-char digit-char))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 (mpuz-offer-new-game)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 (defun mpuz-try-proposal (letter-char digit-char)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 "Propose LETTER-CHAR as code for DIGIT-CHAR."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 (let* ((letter (- letter-char ?A))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 (digit (- digit-char ?0))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 (correct-digit (mpuz-to-digit letter)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 (cond ((mpuz-digit-solved-p correct-digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 (message "%c has already been found."))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 ((= digit correct-digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 (message "%c = %c correct !" letter-char digit-char)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 (mpuz-ding)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 (mpuz-correct-guess digit))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 (t ;;; incorrect guess
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 (message "%c = %c incorrect !" letter-char digit-char)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 (mpuz-ding)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 (setq mpuz-nb-errors (1+ mpuz-nb-errors))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 (mpuz-paint-errors)))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397 (defun mpuz-correct-guess (digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 "Handle correct guessing of DIGIT."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 (aset mpuz-found-digits digit t) ; Mark digit as solved
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 (mpuz-paint-digit digit) ; Repaint it (now as a digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 (if (mpuz-check-all-solved)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 (mpuz-close-game)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 (defun mpuz-close-game ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 "Housecleaning when puzzle has been solved."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 (setq mpuz-in-progress nil
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 mpuz-nb-cumulated-errors (+ mpuz-nb-cumulated-errors mpuz-nb-errors)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 mpuz-nb-completed-games (1+ mpuz-nb-completed-games))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 (mpuz-paint-statistics)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 (let ((message (mpuz-congratulate)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 (message message)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 (sit-for 4)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 (if (y-or-n-p (concat message " Start a new game "))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 (mpuz-start-new-game)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 (message "Good Bye !"))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 (defun mpuz-congratulate ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 "Build a congratulation message when puzzle is solved."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 (format "Puzzle solved with %d errors. %s"
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 mpuz-nb-errors
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421 (cond ((= mpuz-nb-errors 0) "That's perfect !")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 ((= mpuz-nb-errors 1) "That's very good !")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 ((= mpuz-nb-errors 2) "That's good.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 ((= mpuz-nb-errors 3) "That's not bad.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 ((= mpuz-nb-errors 4) "That's not too bad...")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 ((and (>= mpuz-nb-errors 5)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 (< mpuz-nb-errors 10)) "That's bad !")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 ((and (>= mpuz-nb-errors 10)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 (< mpuz-nb-errors 15)) "That's awful.")
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 ((>= mpuz-nb-errors 15) "That's not serious."))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 (defun mpuz-show-solution ()
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 "Display solution for debugging purposes."
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 (interactive)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 (mpuz-switch-to-window)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 (let (digit list)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 (setq digit -1)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 (while (> 10 (setq digit (1+ digit)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 (or (mpuz-digit-solved-p digit)
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 (setq list (cons digit list))))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 (mapcar 'mpuz-correct-guess list)))
df6ec648915f Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442
659
505130d1ddf8 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 232
diff changeset
443 ;;; mpuz.el ends here