annotate lisp/play/blackbox.el @ 71710:dbbc0b93cfeb

(Forcing Redisplay, Displaying Messages, Temporary Displays, Font Selection, Auto Faces, Font Lookup, Fringe Indicators, Display Margins, Image Descriptors, Showing Images, Image Cache, Button Types, Making Buttons, Manipulating Buttons, Button Buffer Commands, Display Table Format, Glyphs): Remove @tindex.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 08 Jul 2006 18:11:49 +0000
parents 836785857446
children e3694f1cb928 c5406394f567
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 473
diff changeset
1 ;;; blackbox.el --- blackbox game in Emacs Lisp
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 473
diff changeset
2
64701
34bd8e434dd7 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64085
diff changeset
3 ;; Copyright (C) 1985, 1986, 1987, 1992, 2001, 2002, 2003, 2004,
68634
836785857446 Update copyright notices of all files in the lisp/play directory.
Romain Francoise <romain@orebokech.com>
parents: 66440
diff changeset
4 ;; 2005, 2006 Free Software Foundation, Inc.
845
213978acbc1e entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 826
diff changeset
5
801
e9e34745ae3b *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 727
diff changeset
6 ;; Author: F. Thomas May <uw-nsr!uw-warp!tom@beaver.cs.washington.edu>
e9e34745ae3b *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 727
diff changeset
7 ;; Adapted-By: ESR
e9e34745ae3b *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 727
diff changeset
8 ;; Keywords: games
e9e34745ae3b *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 727
diff changeset
9
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
727
540b047ece4d *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 662
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15 ;; any later version.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20 ;; GNU General Public License for more details.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64085
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63239
diff changeset
24 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63239
diff changeset
25 ;; Boston, MA 02110-1301, USA.
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26
801
e9e34745ae3b *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 727
diff changeset
27 ;;; Commentary:
e9e34745ae3b *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 727
diff changeset
28
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
29 ;; by F. Thomas May <uw-nsr!uw-warp!tom@beaver.cs.washington.edu>
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
30 ;; doc comment by Root Boy Jim <rbj@dsys.icst.nbs.gov>, 27 Apr 89
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
31 ;; interface improvements by ESR, Dec 5 1991.
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
33 ;; The object of the game is to find four hidden balls by shooting rays
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
34 ;; into the black box. There are four possibilities: 1) the ray will
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
35 ;; pass thru the box undisturbed, 2) it will hit a ball and be absorbed,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
36 ;; 3) it will be deflected and exit the box, or 4) be deflected immediately,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
37 ;; not even being allowed entry into the box.
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
38 ;;
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
39 ;; The strange part is the method of deflection. It seems that rays will
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
40 ;; not pass next to a ball, and change direction at right angles to avoid it.
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
41 ;;
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
42 ;; R 3
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
43 ;; 1 - - - - - - - - 1
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
44 ;; - - - - - - - -
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
45 ;; - O - - - - - - 3
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
46 ;; 2 - - - - O - O -
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
47 ;; 4 - - - - - - - -
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
48 ;; 5 - - - - - - - - 5
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
49 ;; - - - - - - - - R
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
50 ;; H - - - - - - - O
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
51 ;; 2 H 4 H
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
52 ;;
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
53 ;; Rays which enter and exit are numbered. You can see that rays 1 & 5 pass
66440
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
54 ;; thru the box undisturbed. Ray 2 is deflected by the northwesternmost
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
55 ;; ball. Likewise rays 3 and 4. Rays which hit balls and are absorbed are
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
56 ;; marked with H. The bottom of the left and the right of the bottom hit
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
57 ;; the southeastern ball directly. Rays may also hit balls after being
66440
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
58 ;; reflected. Consider the H on the bottom next to the 4. It bounces off
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
59 ;; the NW-ern most ball and hits the central ball. A ray shot from above
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
60 ;; the right side 5 would hit the SE-ern most ball. The R beneath the 5
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
61 ;; is because the ball is returned instantly. It is not allowed into
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
62 ;; the box if it would reflect immediately. The R on the top is a more
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
63 ;; leisurely return. Both central balls would tend to deflect it east
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
64 ;; or west, but it cannot go either way, so it just retreats.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
65 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
66 ;; At the end of the game, if you've placed guesses for as many balls as
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
67 ;; there are in the box, the true board position will be revealed. Each
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 4408
diff changeset
68 ;; `x' is an incorrect guess of yours; `o' is the true location of a ball.
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69
801
e9e34745ae3b *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 727
diff changeset
70 ;;; Code:
e9e34745ae3b *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 727
diff changeset
71
42199
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
72 (defvar bb-board nil
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
73 "Blackbox board.")
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
74
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
75 (defvar bb-x -1
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
76 "Current x-position.")
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
77
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
78 (defvar bb-y -1
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
79 "Current y-position.")
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
80
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
81 (defvar bb-score 0
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
82 "Current score.")
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
83
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
84 (defvar bb-detour-count 0
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
85 "Number of detours.")
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
86
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
87 (defvar bb-balls-placed nil
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
88 "List of already placed balls.")
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
89
66433
4f54bc741533 (blackbox-redefine-key): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 64701
diff changeset
90 ;; This is used below to remap existing bindings for cursor motion to
4f54bc741533 (blackbox-redefine-key): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 64701
diff changeset
91 ;; blackbox-specific bindings in blackbox-mode-map. This is so that
4f54bc741533 (blackbox-redefine-key): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 64701
diff changeset
92 ;; users who prefer non-default key bindings for cursor motion don't
4f54bc741533 (blackbox-redefine-key): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 64701
diff changeset
93 ;; lose that when they play Blackbox.
66440
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
94 (defun blackbox-redefine-key (map oldfun newfun)
66433
4f54bc741533 (blackbox-redefine-key): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 64701
diff changeset
95 "Redefine keys that run the function OLDFUN to run NEWFUN instead."
66440
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
96 (define-key map (vector 'remap oldfun) newfun))
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
97
66433
4f54bc741533 (blackbox-redefine-key): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 64701
diff changeset
98
66440
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
99 (defvar blackbox-mode-map
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
100 (let ((map (make-keymap)))
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
101 (suppress-keymap map t)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
102 (blackbox-redefine-key map 'backward-char 'bb-left)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
103 (blackbox-redefine-key map 'forward-char 'bb-right)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
104 (blackbox-redefine-key map 'previous-line 'bb-up)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
105 (blackbox-redefine-key map 'next-line 'bb-down)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
106 (blackbox-redefine-key map 'move-end-of-line 'bb-eol)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
107 (blackbox-redefine-key map 'move-beginning-of-line 'bb-bol)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
108 (define-key map " " 'bb-romp)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
109 (define-key map [insert] 'bb-romp)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
110 (blackbox-redefine-key map 'newline 'bb-done)
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
111 map))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 ;; Blackbox mode is suitable only for specially formatted data.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 (put 'blackbox-mode 'mode-class 'special)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116 (defun blackbox-mode ()
41668
29bd5069226c (blackbox-mode, blackbox): Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 18383
diff changeset
117 "Major mode for playing blackbox.
29bd5069226c (blackbox-mode, blackbox): Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 18383
diff changeset
118 To learn how to play blackbox, see the documentation for function `blackbox'.
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120 The usual mnemonic keys move the cursor around the box.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121 \\<blackbox-mode-map>\\[bb-bol] and \\[bb-eol] move to the beginning and end of line, respectively.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
123 \\[bb-romp] -- send in a ray from point, or toggle a ball at point
63239
f48178f79206 (blackbox-mode): Use run-mode-hooks.
Lute Kamstra <lute@gnu.org>
parents: 62249
diff changeset
124 \\[bb-done] -- end game and get score"
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 (interactive)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 (kill-all-local-variables)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127 (use-local-map blackbox-mode-map)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 (setq truncate-lines t)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 (setq major-mode 'blackbox-mode)
63239
f48178f79206 (blackbox-mode): Use run-mode-hooks.
Lute Kamstra <lute@gnu.org>
parents: 62249
diff changeset
130 (setq mode-name "Blackbox")
f48178f79206 (blackbox-mode): Use run-mode-hooks.
Lute Kamstra <lute@gnu.org>
parents: 62249
diff changeset
131 (run-mode-hooks 'blackbox-mode-hook))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132
727
540b047ece4d *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 662
diff changeset
133 ;;;###autoload
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134 (defun blackbox (num)
41668
29bd5069226c (blackbox-mode, blackbox): Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 18383
diff changeset
135 "Play blackbox.
29bd5069226c (blackbox-mode, blackbox): Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 18383
diff changeset
136 Optional prefix argument is the number of balls; the default is 4.
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 What is blackbox?
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 Blackbox is a game of hide and seek played on an 8 by 8 grid (the
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 Blackbox). Your opponent (Emacs, in this case) has hidden several
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 balls (usually 4) within this box. By shooting rays into the box and
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 observing where they emerge it is possible to deduce the positions of
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144 the hidden balls. The fewer rays you use to find the balls, the lower
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
145 your score.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 Overview of play:
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148
826
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
149 \\<blackbox-mode-map>\
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
150 To play blackbox, type \\[blackbox]. An optional prefix argument
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
151 specifies the number of balls to be hidden in the box; the default is
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
152 four.
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
153
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
154 The cursor can be moved around the box with the standard cursor
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155 movement keys.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157 To shoot a ray, move the cursor to the edge of the box and press SPC.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
158 The result will be determined and the playfield updated.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
159
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160 You may place or remove balls in the box by moving the cursor into the
826
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
161 box and pressing \\[bb-romp].
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163 When you think the configuration of balls you have placed is correct,
826
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
164 press \\[bb-done]. You will be informed whether you are correct or
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
165 not, and be given your score. Your score is the number of letters and
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
166 numbers around the outside of the box plus five for each incorrectly
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
167 placed ball. If you placed any balls incorrectly, they will be
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
168 indicated with `x', and their actual positions indicated with `o'.
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
169
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170 Details:
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 There are three possible outcomes for each ray you send into the box:
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 Detour: the ray is deflected and emerges somewhere other than
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175 where you sent it in. On the playfield, detours are
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176 denoted by matching pairs of numbers -- one where the
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177 ray went in, and the other where it came out.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 Reflection: the ray is reflected and emerges in the same place
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180 it was sent in. On the playfield, reflections are
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181 denoted by the letter `R'.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183 Hit: the ray strikes a ball directly and is absorbed. It does
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184 not emerge from the box. On the playfield, hits are
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185 denoted by the letter `H'.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 The rules for how balls deflect rays are simple and are best shown by
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188 example.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190 As a ray approaches a ball it is deflected ninety degrees. Rays can
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191 be deflected multiple times. In the diagrams below, the dashes
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192 represent empty box locations and the letter `O' represents a ball.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193 The entrance and exit points of each ray are marked with numbers as
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
194 described under \"Detour\" above. Note that the entrance and exit
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195 points are always interchangeable. `*' denotes the path taken by the
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196 ray.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198 Note carefully the relative positions of the ball and the ninety
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 degree deflection it causes.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
200
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
201 1
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
202 - * - - - - - - - - - - - - - - - - - - - - - -
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
203 - * - - - - - - - - - - - - - - - - - - - - - -
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
204 1 * * - - - - - - - - - - - - - - - O - - - - O -
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205 - - O - - - - - - - O - - - - - - - * * * * - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206 - - - - - - - - - - - * * * * * 2 3 * * * - - * - -
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
207 - - - - - - - - - - - * - - - - - - - O - * - -
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
208 - - - - - - - - - - - * - - - - - - - - * * - -
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
209 - - - - - - - - - - - * - - - - - - - - * - O -
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210 2 3
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212 As mentioned above, a reflection occurs when a ray emerges from the same point
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213 it was sent in. This can happen in several ways:
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
214
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
215
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216 - - - - - - - - - - - - - - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217 - - - - O - - - - - O - O - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218 R * * * * - - - - - - - * - - - - O - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219 - - - - O - - - - - - * - - - - R - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220 - - - - - - - - - - - * - - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221 - - - - - - - - - - - * - - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222 - - - - - - - - R * * * * - - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
223 - - - - - - - - - - - - O - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
224
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225 In the first example, the ray is deflected downwards by the upper
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226 ball, then left by the lower ball, and finally retraces its path to
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
227 its point of origin. The second example is similar. The third
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228 example is a bit anomalous but can be rationalized by realizing the
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 ray never gets a chance to get into the box. Alternatively, the ray
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230 can be thought of as being deflected downwards and immediately
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231 emerging from the box.
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233 A hit occurs when a ray runs straight into a ball:
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235 - - - - - - - - - - - - - - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236 - - - - - - - - - - - - - - - - - - - - O - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 - - - - - - - - - - - - O - - - H * * * * - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238 - - - - - - - - H * * * * O - - - - - - * - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 - - - - - - - - - - - - O - - - - - - O - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240 H * * * O - - - - - - - - - - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241 - - - - - - - - - - - - - - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242 - - - - - - - - - - - - - - - - - - - - - - - -
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
244 Be sure to compare the second example of a hit with the first example of
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
245 a reflection."
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
246 (interactive "P")
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
247 (switch-to-buffer "*Blackbox*")
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248 (blackbox-mode)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
249 (setq buffer-read-only t)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250 (buffer-disable-undo (current-buffer))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251 (setq bb-board (bb-init-board (or num 4)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
252 (setq bb-balls-placed nil)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253 (setq bb-x -1)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 (setq bb-y -1)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255 (setq bb-score 0)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256 (setq bb-detour-count 0)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 (bb-insert-board)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258 (bb-goto (cons bb-x bb-y)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260 (defun bb-init-board (num-balls)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 (random t)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 (let (board pos)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263 (while (>= (setq num-balls (1- num-balls)) 0)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264 (while
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 (progn
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266 (setq pos (cons (random 8) (random 8)))
42199
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
267 (member pos board)))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268 (setq board (cons pos board)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 board))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271 (defun bb-insert-board ()
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
272 (let (i (buffer-read-only nil))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
273 (erase-buffer)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
274 (insert " \n")
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
275 (setq i 8)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
276 (while (>= (setq i (1- i)) 0)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
277 (insert " - - - - - - - - \n"))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
278 (insert " \n")
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
279 (insert (format "\nThere are %d balls in the box" (length bb-board)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
280 ))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
281
47562
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
282 (defun bb-right (count)
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
283 (interactive "p")
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
284 (while (and (> count 0) (< bb-x 8))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285 (forward-char 2)
47562
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
286 (setq bb-x (1+ bb-x))
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
287 (setq count (1- count))))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288
47562
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
289 (defun bb-left (count)
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
290 (interactive "p")
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
291 (while (and (> count 0) (> bb-x -1))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292 (backward-char 2)
47562
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
293 (setq bb-x (1- bb-x))
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
294 (setq count (1- count))))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
295
47562
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
296 (defun bb-up (count)
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
297 (interactive "p")
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
298 (while (and (> count 0) (> bb-y -1))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 (previous-line 1)
47562
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
300 (setq bb-y (1- bb-y))
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
301 (setq count (1- count))))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302
47562
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
303 (defun bb-down (count)
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
304 (interactive "p")
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
305 (while (and (> count 0) (< bb-y 8))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
306 (next-line 1)
47562
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
307 (setq bb-y (1+ bb-y))
56e5df2ccc8d (bb-right): Respect prefix argument.
Richard M. Stallman <rms@gnu.org>
parents: 42199
diff changeset
308 (setq count (1- count))))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310 (defun bb-eol ()
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311 (interactive)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 (setq bb-x 8)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
313 (bb-goto (cons bb-x bb-y)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
315 (defun bb-bol ()
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
316 (interactive)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317 (setq bb-x -1)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318 (bb-goto (cons bb-x bb-y)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
320 (defun bb-romp ()
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
321 (interactive)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
322 (cond
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
323 ((and
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
324 (or (= bb-x -1) (= bb-x 8))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
325 (or (= bb-y -1) (= bb-y 8))))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
326 ((bb-outside-box bb-x bb-y)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
327 (bb-trace-ray bb-x bb-y))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
328 (t
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
329 (bb-place-ball bb-x bb-y))))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
330
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
331 (defun bb-place-ball (x y)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
332 (let ((coord (cons x y)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
333 (cond
42199
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
334 ((member coord bb-balls-placed)
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
335 (setq bb-balls-placed (delete coord bb-balls-placed))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
336 (bb-update-board "-"))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
337 (t
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
338 (setq bb-balls-placed (cons coord bb-balls-placed))
42199
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
339 (bb-update-board (propertize "O" 'help-echo "Placed ball"))))))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
340
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
341 (defun bb-trace-ray (x y)
56989
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
342 (when (= (following-char) 32)
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
343 (let ((result (bb-trace-ray-2
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
344 t
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
345 x
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
346 (cond
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
347 ((= x -1) 1)
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
348 ((= x 8) -1)
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
349 (t 0))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
350 y
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
351 (cond
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
352 ((= y -1) 1)
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
353 ((= y 8) -1)
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
354 (t 0)))))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
355 (cond
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
356 ((eq result 'hit)
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
357 (bb-update-board (propertize "H" 'help-echo "Hit"))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
358 (setq bb-score (1+ bb-score)))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
359 ((equal result (cons x y))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
360 (bb-update-board (propertize "R" 'help-echo "Reflection"))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
361 (setq bb-score (1+ bb-score)))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
362 (t
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
363 (setq bb-detour-count (1+ bb-detour-count))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
364 (bb-update-board (propertize (format "%d" bb-detour-count)
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
365 'help-echo "Detour"))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
366 (save-excursion
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
367 (bb-goto result)
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
368 (bb-update-board (propertize (format "%d" bb-detour-count)
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
369 'help-echo "Detour")))
7cbddcabb63e (bb-trace-ray): Avoid double tracing.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
370 (setq bb-score (+ bb-score 2)))))))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372 (defun bb-trace-ray-2 (first x dx y dy)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373 (cond
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374 ((and (not first)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375 (bb-outside-box x y))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
376 (cons x y))
42199
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
377 ((member (cons (+ x dx) (+ y dy)) bb-board)
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
378 'hit)
42199
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
379 ((member (cons (+ x dx dy) (+ y dy dx)) bb-board)
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
380 (bb-trace-ray-2 nil x (- dy) y (- dx)))
42199
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
381 ((member (cons (+ x dx (- dy)) (+ y dy (- dx))) bb-board)
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
382 (bb-trace-ray-2 nil x dy y dx))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
383 (t
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
384 (bb-trace-ray-2 nil (+ x dx) dx (+ y dy) dy))))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
385
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
386 (defun bb-done ()
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
387 "Finish the game and report score."
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
388 (interactive)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
389 (let (bogus-balls)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
390 (cond
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
391 ((not (= (length bb-balls-placed) (length bb-board)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
392 (message "There %s %d hidden ball%s; you have placed %d."
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
393 (if (= (length bb-board) 1) "is" "are")
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
394 (length bb-board)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
395 (if (= (length bb-board) 1) "" "s")
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
396 (length bb-balls-placed)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
397 (t
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
398 (setq bogus-balls (bb-show-bogus-balls bb-balls-placed bb-board))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
399 (if (= bogus-balls 0)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
400 (message "Right! Your score is %d." bb-score)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
401 (message "Oops! You missed %d ball%s. Your score is %d."
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402 bogus-balls
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
403 (if (= bogus-balls 1) "" "s")
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
404 (+ bb-score (* 5 bogus-balls))))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
405 (bb-goto '(-1 . -1))))))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
406
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
407 (defun bb-show-bogus-balls (balls-placed board)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
408 (bb-show-bogus-balls-2 balls-placed board "x")
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
409 (bb-show-bogus-balls-2 board balls-placed "o"))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
410
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
411 (defun bb-show-bogus-balls-2 (list-1 list-2 c)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
412 (cond
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
413 ((null list-1)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
414 0)
42199
6f3215f24a28 (bb-member): Remove, use member instead.
Pavel Janík <Pavel@Janik.cz>
parents: 41668
diff changeset
415 ((member (car list-1) list-2)
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
416 (bb-show-bogus-balls-2 (cdr list-1) list-2 c))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
417 (t
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
418 (bb-goto (car list-1))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
419 (bb-update-board c)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
420 (1+ (bb-show-bogus-balls-2 (cdr list-1) list-2 c)))))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
421
826
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
422 (defun bb-outside-box (x y)
e9b9a1cff2c9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 801
diff changeset
423 (or (= x -1) (= x 8) (= y -1) (= y 8)))
473
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
424
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
425 (defun bb-goto (pos)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
426 (goto-char (+ (* (car pos) 2) (* (cdr pos) 22) 26)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
427
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
428 (defun bb-update-board (c)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
429 (let ((buffer-read-only nil))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
430 (backward-char (1- (length c)))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
431 (delete-char (length c))
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
432 (insert c)
999d0b38694e Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
433 (backward-char 1)))
49598
0d8b17d428b5 Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47562
diff changeset
434
18383
11218164bc54 Add provide call.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
435 (provide 'blackbox)
11218164bc54 Add provide call.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
436
66440
5a126d3f6688 (blackbox-mode-map): Move init into declaration.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 66433
diff changeset
437 ;; arch-tag: 6c474c62-5617-4b10-9b44-ac430168c0e2
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 473
diff changeset
438 ;;; blackbox.el ends here