annotate lisp/play/5x5.el @ 33863:2e449f784ca7

(init_from_display_pos): If POS says we're already after an overlay string ending at POS, make sure to pop the iterator because it will be in front of that overlay string. When POS is ZV, we've thereby also ``processed'' overlay strings at ZV.
author Gerd Moellmann <gerd@gnu.org>
date Fri, 24 Nov 2000 19:29:05 +0000
parents 8e7561d048f5
children 844457f780a5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25143
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1 ;;; 5x5.el -- Simple little puzzle game.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2
25164
8e7561d048f5 (5x5-mode-map): Bind C-p, C-n, C-b, C-f.
Karl Heuer <kwzh@gnu.org>
parents: 25160
diff changeset
3 ;; Copyright (C) 1999 Free Software Foundation, Inc.
25143
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5 ;; Author: Dave Pearson <davep@hagbard.demon.co.uk>
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6 ;; Maintainer: Dave Pearson <davep@hagbard.demon.co.uk>
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7 ;; Created: 1998-10-03
25164
8e7561d048f5 (5x5-mode-map): Bind C-p, C-n, C-b, C-f.
Karl Heuer <kwzh@gnu.org>
parents: 25160
diff changeset
8 ;; Version: $Revision: 1.2 $
25143
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
9 ;; Keywords: games puzzles
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
10
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
11 ;; This file is part of GNU Emacs.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
12
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
13 ;; GNU Emacs is free software; you can redistribute it and/or modify
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
14 ;; it under the terms of the GNU General Public License as published by
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
15 ;; the Free Software Foundation; either version 2, or (at your option)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
16 ;; any later version.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
17
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
18 ;; GNU Emacs is distributed in the hope that it will be useful,
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
21 ;; GNU General Public License for more details.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
22
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
26 ;; Boston, MA 02111-1307, USA.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
27
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
28 ;;; Commentary:
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
29
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
30 ;; The aim of 5x5 is to fill in all the squares. If you need any more of an
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
31 ;; explanation you probably shouldn't play the game.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
32
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
33 ;;; TODO:
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
34
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
35 ;; o The code for updating the grid needs to be re-done. At the moment it
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
36 ;; simply re-draws the grid every time a move is made.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
37 ;;
25160
6f69847b92b7 Undo miscorrected non-typo.
Karl Heuer <kwzh@gnu.org>
parents: 25143
diff changeset
38 ;; o Look into tarting up the display with colour. gamegrid.el looks
25143
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
39 ;; interesting, perhaps that is the way to go?
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
40
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
41 ;;; Thanks:
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
42
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
43 ;; Ralf Fassel <ralf@akutech.de> for his help and introduction to writing an
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
44 ;; emacs mode.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
45 ;;
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
46 ;; Pascal Q. Porcupine <joshagam@cs.nmsu.edu> for inspiring the animated
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
47 ;; solver.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
48
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
49 ;; Things we need.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
50
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
51 (eval-when-compile
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
52 (require 'cl))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
53
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
54 ;; If customize isn't available just use defvar instead.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
55 (eval-and-compile
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
56 (unless (fboundp 'defgroup)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
57 (defmacro defgroup (&rest rest) nil)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
58 (defmacro defcustom (symbol init docstring &rest rest)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
59 `(defvar ,symbol ,init ,docstring))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
60
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
61 ;; Customize options.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
62
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
63 (defgroup 5x5 nil
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
64 "5x5 - Silly little puzzle game."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
65 :group 'games
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
66 :prefix "5x5-")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
67
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
68 (defcustom 5x5-grid-size 5
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
69 "*Size of the playing area."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
70 :type 'integer
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
71 :group '5x5)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
72
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
73 (defcustom 5x5-x-scale 4
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
74 "*X scaling factor for drawing the grid."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
75 :type 'integer
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
76 :group '5x5)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
77
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
78 (defcustom 5x5-y-scale 3
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
79 "*Y scaling factor for drawing the grid."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
80 :type 'integer
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
81 :group '5x5)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
82
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
83 (defcustom 5x5-animate-delay .01
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
84 "*Delay in seconds when animating a solution crack."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
85 :type 'number
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
86 :group '5x5)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
87
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
88 (defcustom 5x5-hassle-me t
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
89 "*Should 5x5 ask you when you want to do a destructive operation?"
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
90 :type 'boolean
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
91 :group '5x5)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
92
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
93 (defcustom 5x5-mode-hook nil
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
94 "*Hook run on starting 5x5."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
95 :type 'hook
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
96 :group '5x5)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
97
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
98 ;; Non-customize variables.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
99
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
100 (defvar 5x5-grid nil
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
101 "5x5 grid contents.")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
102
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
103 (defvar 5x5-x-pos 2
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
104 "X position of cursor.")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
105
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
106 (defvar 5x5-y-pos 2
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
107 "Y position of cursor.")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
108
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
109 (defvar 5x5-moves 0
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
110 "Moves made.")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
111
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
112 (defvar 5x5-cracking nil
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
113 "Are we in cracking mode?")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
114
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
115 (defvar 5x5-buffer-name "*5x5*"
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
116 "Name of the 5x5 play buffer.")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
117
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
118 (defvar 5x5-mode-map nil
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
119 "Local keymap for the 5x5 game.")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
120
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
121 ;; Keymap.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
122
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
123 (unless 5x5-mode-map
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
124 (let ((map (make-sparse-keymap)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
125 (suppress-keymap map t)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
126 (define-key map "?" #'describe-mode)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
127 (define-key map "\r" #'5x5-flip-current)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
128 (define-key map " " #'5x5-flip-current)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
129 (define-key map [up] #'5x5-up)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
130 (define-key map [down] #'5x5-down)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
131 (define-key map [left] #'5x5-left)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
132 (define-key map [tab] #'5x5-right)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
133 (define-key map [right] #'5x5-right)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
134 (define-key map [(control a)] #'5x5-bol)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
135 (define-key map [(control e)] #'5x5-eol)
25164
8e7561d048f5 (5x5-mode-map): Bind C-p, C-n, C-b, C-f.
Karl Heuer <kwzh@gnu.org>
parents: 25160
diff changeset
136 (define-key map [(control p)] #'5x5-up)
8e7561d048f5 (5x5-mode-map): Bind C-p, C-n, C-b, C-f.
Karl Heuer <kwzh@gnu.org>
parents: 25160
diff changeset
137 (define-key map [(control n)] #'5x5-down)
8e7561d048f5 (5x5-mode-map): Bind C-p, C-n, C-b, C-f.
Karl Heuer <kwzh@gnu.org>
parents: 25160
diff changeset
138 (define-key map [(control b)] #'5x5-left)
8e7561d048f5 (5x5-mode-map): Bind C-p, C-n, C-b, C-f.
Karl Heuer <kwzh@gnu.org>
parents: 25160
diff changeset
139 (define-key map [(control f)] #'5x5-right)
25143
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
140 (define-key map [home] #'5x5-bol)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
141 (define-key map [end] #'5x5-eol)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
142 (define-key map [prior] #'5x5-first)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
143 (define-key map [next] #'5x5-last)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
144 (define-key map "r" #'5x5-randomize)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
145 (define-key map [(control c) (control r)] #'5x5-crack-randomly)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
146 (define-key map [(control c) (control c)] #'5x5-crack-mutating-current)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
147 (define-key map [(control c) (control b)] #'5x5-crack-mutating-best)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
148 (define-key map [(control c) (control x)] #'5x5-crack-xor-mutate)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
149 (define-key map "n" #'5x5-new-game)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
150 (define-key map "q" #'5x5-quit-game)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
151 (setq 5x5-mode-map map)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
152
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
153 ;; Menu definition.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
154
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
155 (easy-menu-define 5x5-mode-menu 5x5-mode-map "5x5 menu."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
156 '("5x5"
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
157 ["New game" 5x5-new-game t]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
158 ["Random game" 5x5-randomize t]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
159 ["Quit game" 5x5-quit-game t]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
160 "---"
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
161 ["Crack randomly" 5x5-crack-randomly t]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
162 ["Crack mutating current" 5x5-crack-mutating-current t]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
163 ["Crack mutating best" 5x5-crack-mutating-best t]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
164 ["Crack with xor mutate" 5x5-crack-xor-mutate t]))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
165
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
166 ;; Gameplay functions.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
167
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
168 (put '5x5-mode 'mode-class 'special)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
169
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
170 (defun 5x5-mode ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
171 "A mode for playing `5x5'
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
172
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
173 The key bindings for 5x5-mode are:
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
174
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
175 \\{5x5-mode-map}"
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
176 (kill-all-local-variables)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
177 (use-local-map 5x5-mode-map)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
178 (setq major-mode '5x5-mode
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
179 mode-name "5x5")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
180 (run-hooks '5x5-mode-hook)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
181 (setq buffer-read-only t
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
182 truncate-lines t)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
183 (buffer-disable-undo (current-buffer)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
184
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
185 ;;;###autoload
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
186 (defun 5x5 (&optional size)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
187 "Play 5x5.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
188
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
189 The object of 5x5 is very simple, by moving around the grid and flipping
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
190 squares you must fill the grid.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
191
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
192 5x5 keyboard bindings are:
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
193 \\<5x5-mode-map>
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
194 Flip \\[5x5-flip-current]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
195 Move up \\[5x5-up]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
196 Move down \\[5x5-down]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
197 Move left \\[5x5-left]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
198 Move right \\[5x5-right]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
199 Start new game \\[5x5-new-game]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
200 New game with random grid \\[5x5-randomize]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
201 Random cracker \\[5x5-crack-randomly]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
202 Mutate current cracker \\[5x5-crack-mutating-current]
25164
8e7561d048f5 (5x5-mode-map): Bind C-p, C-n, C-b, C-f.
Karl Heuer <kwzh@gnu.org>
parents: 25160
diff changeset
203 Mutate best cracker \\[5x5-crack-mutating-best]
25143
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
204 Mutate xor cracker \\[5x5-crack-xor-mutate]
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
205 Quit current game \\[5x5-quit-game]"
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
206
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
207 (interactive "P")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
208 (setq 5x5-cracking nil)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
209 (when size
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
210 (setq 5x5-grid-size size))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
211 (switch-to-buffer 5x5-buffer-name)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
212 (if (or (not 5x5-grid) (not (= 5x5-grid-size (length (aref 5x5-grid 0)))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
213 (5x5-new-game))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
214 (5x5-draw-grid (list 5x5-grid))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
215 (5x5-position-cursor)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
216 (5x5-mode))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
217
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
218 (defun 5x5-new-game ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
219 "Start a new game of `5x5'."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
220 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
221 (when (if (interactive-p) (5x5-y-or-n-p "Start a new game? ") t)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
222 (setq 5x5-x-pos (/ 5x5-grid-size 2)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
223 5x5-y-pos (/ 5x5-grid-size 2)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
224 5x5-moves 0
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
225 5x5-grid (5x5-make-move (5x5-make-new-grid) 5x5-y-pos 5x5-x-pos))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
226 (when (interactive-p)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
227 (5x5-draw-grid (list 5x5-grid))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
228 (5x5-position-cursor))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
229
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
230 (defun 5x5-quit-game ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
231 "Quit the current game of `5x5'."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
232 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
233 (kill-buffer 5x5-buffer-name))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
234
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
235 (defun 5x5-make-new-grid ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
236 "Create and return a new `5x5' grid structure."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
237 (let ((grid (make-vector 5x5-grid-size nil)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
238 (loop for y from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
239 (aset grid y (make-vector 5x5-grid-size nil)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
240 grid))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
241
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
242 (defun 5x5-cell (grid y x)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
243 "Return the value of the cell in GRID at location X,Y."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
244 (aref (aref grid y) x))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
245
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
246 (defun 5x5-set-cell (grid y x value)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
247 "Set the value of cell X,Y in GRID to VALUE."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
248 (aset (aref grid y) x value))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
249
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
250 (defun 5x5-flip-cell (grid y x)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
251 "Flip the value of cell X,Y in GRID."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
252 (5x5-set-cell grid y x (not (5x5-cell grid y x))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
253
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
254 (defun 5x5-copy-grid (grid)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
255 "Make a new copy of GRID."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
256 (let ((copy (5x5-make-new-grid)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
257 (loop for y from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
258 (loop for x from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
259 (5x5-set-cell copy y x (5x5-cell grid y x))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
260 copy))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
261
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
262 (defun 5x5-make-move (grid row col)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
263 "Make a move on GRID at row ROW and column COL."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
264 (5x5-flip-cell grid row col)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
265 (if (> row 0)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
266 (5x5-flip-cell grid (1- row) col))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
267 (if (< row (- 5x5-grid-size 1))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
268 (5x5-flip-cell grid (1+ row) col))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
269 (if (> col 0)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
270 (5x5-flip-cell grid row (1- col)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
271 (if (< col (- 5x5-grid-size 1))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
272 (5x5-flip-cell grid row (1+ col)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
273 grid)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
274
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
275 (defun 5x5-row-value (row)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
276 "Get the \"on-value\" for grid row ROW."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
277 (loop for y from 0 to (1- 5x5-grid-size) sum (if (aref row y) 1 0)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
278
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
279 (defun 5x5-grid-value (grid)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
280 "Get the \"on-value\" for grid GRID."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
281 (loop for y from 0 to (1- 5x5-grid-size) sum (5x5-row-value (aref grid y))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
282
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
283 (defun 5x5-draw-grid-end ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
284 "Draw the top/bottom of the grid"
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
285 (insert "+")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
286 (loop for x from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
287 (insert "-" (make-string 5x5-x-scale ?-)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
288 (insert "-+ "))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
289
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
290 (defun 5x5-draw-grid (grids)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
291 "Draw the grids GRIDS into the current buffer."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
292 (let ((buffer-read-only nil))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
293 (erase-buffer)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
294 (loop for grid in grids do (5x5-draw-grid-end))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
295 (insert "\n")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
296 (loop for y from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
297 (loop for lines from 0 to (1- 5x5-y-scale) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
298 (loop for grid in grids do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
299 (loop for x from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
300 (insert (if (zerop x) "| " " ")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
301 (make-string 5x5-x-scale
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
302 (if (5x5-cell grid y x) ?# ?.))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
303 (insert " | "))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
304 (insert "\n")))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
305 (loop for grid in grids do (5x5-draw-grid-end))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
306 (insert "\n")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
307 (insert (format "On: %d Moves: %d" (5x5-grid-value (car grids)) 5x5-moves))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
308
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
309 (defun 5x5-position-cursor ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
310 "Position the cursor on the grid."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
311 (goto-line (+ (* 5x5-y-pos 5x5-y-scale) 2))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
312 (goto-char (+ (point) (* 5x5-x-pos 5x5-x-scale) (+ 5x5-x-pos 1) 1)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
313
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
314 (defun 5x5-made-move ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
315 "Keep track of how many moves have been made."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
316 (incf 5x5-moves))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
317
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
318 (defun 5x5-make-random-grid ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
319 "Make a random grid."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
320 (let ((grid (5x5-make-new-grid)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
321 (loop for y from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
322 (loop for x from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
323 (if (zerop (random 2))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
324 (5x5-flip-cell grid y x))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
325 grid))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
326
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
327 ;; Cracker functions.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
328
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
329 ;;;###autoload
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
330 (defun 5x5-crack-randomly ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
331 "Attempt to crack 5x5 using random solutions."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
332 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
333 (5x5-crack #'5x5-make-random-solution))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
334
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
335 ;;;###autoload
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
336 (defun 5x5-crack-mutating-current ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
337 "Attempt to crack 5x5 by mutating the current solution."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
338 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
339 (5x5-crack #'5x5-make-mutate-current))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
340
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
341 ;;;###autoload
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
342 (defun 5x5-crack-mutating-best ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
343 "Attempt to crack 5x5 by mutating the best solution."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
344 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
345 (5x5-crack #'5x5-make-mutate-best))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
346
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
347 ;;;###autoload
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
348 (defun 5x5-crack-xor-mutate ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
349 "Attempt to crack 5x5 by xor the current and best solution and then
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
350 mutating the result."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
351 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
352 (5x5-crack #'5x5-make-xor-with-mutation))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
353
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
354 ;;;###autoload
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
355 (defun 5x5-crack (breeder)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
356 "Attempt to find a solution for 5x5.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
357
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
358 5x5-crack takes the argument BREEDER which should be a function that takes
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
359 two parameters, the first will be a grid vector array that is the current
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
360 solution and the second will be the best solution so far. The function
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
361 should return a grid vector array that is the new solution."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
362
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
363 (interactive "aBreeder function: ")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
364 (5x5)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
365 (setq 5x5-cracking t)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
366 (let* ((best-solution (5x5-make-random-grid))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
367 (current-solution best-solution)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
368 (best-result (5x5-make-new-grid))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
369 (current-result (5x5-make-new-grid))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
370 (target (* 5x5-grid-size 5x5-grid-size)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
371 (while (and (< (5x5-grid-value best-result) target)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
372 (not (input-pending-p)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
373 (setq current-result (5x5-play-solution current-solution best-solution))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
374 (if (> (5x5-grid-value current-result) (5x5-grid-value best-result))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
375 (setq best-solution current-solution
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
376 best-result current-result))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
377 (setq current-solution (funcall breeder
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
378 (5x5-copy-grid current-solution)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
379 (5x5-copy-grid best-solution)))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
380 (setq 5x5-cracking nil))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
381
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
382 (defun 5x5-make-random-solution (&rest ignore)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
383 "Make a random solution."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
384 (5x5-make-random-grid))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
385
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
386 (defun 5x5-make-mutate-current (current best)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
387 "Mutate the current solution."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
388 (5x5-mutate-solution current))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
389
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
390 (defun 5x5-make-mutate-best (current best)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
391 "Mutate the best solution."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
392 (5x5-mutate-solution best))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
393
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
394 (defun 5x5-make-xor-with-mutation (current best)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
395 "xor current and best solution then mutate the result."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
396 (let ((xored (5x5-make-new-grid)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
397 (loop for y from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
398 (loop for x from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
399 (5x5-set-cell xored y x
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
400 (5x5-xor (5x5-cell current y x)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
401 (5x5-cell best y x)))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
402 (5x5-mutate-solution xored)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
403
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
404 (defun 5x5-mutate-solution (solution)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
405 "Randomly flip bits in the solution."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
406 (loop for y from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
407 (loop for x from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
408 (if (= (random (/ (* 5x5-grid-size 5x5-grid-size) 2))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
409 (/ (/ (* 5x5-grid-size 5x5-grid-size) 2) 2))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
410 (5x5-flip-cell solution y x))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
411 solution)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
412
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
413 (defun 5x5-play-solution (solution best)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
414 "Play a solution on an empty grid. This destroys the current game in
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
415 progress because it is an animated attempt."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
416 (5x5-new-game)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
417 (loop for y from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
418 (loop for x from 0 to (1- 5x5-grid-size) do
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
419 (setq 5x5-y-pos y
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
420 5x5-x-pos x)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
421 (if (5x5-cell solution y x)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
422 (5x5-flip-current))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
423 (5x5-draw-grid (list 5x5-grid solution best))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
424 (5x5-position-cursor)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
425 (sit-for 5x5-animate-delay)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
426 5x5-grid)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
427
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
428 ;; Keyboard response functions.
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
429
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
430 (defun 5x5-flip-current ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
431 "Make a move on the current cursor location."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
432 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
433 (setq 5x5-grid (5x5-make-move 5x5-grid 5x5-y-pos 5x5-x-pos))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
434 (5x5-made-move)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
435 (unless 5x5-cracking
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
436 (5x5-draw-grid (list 5x5-grid)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
437 (5x5-position-cursor)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
438 (when (= (5x5-grid-value 5x5-grid) (* 5x5-grid-size 5x5-grid-size))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
439 (beep)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
440 (message "You win!")))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
441
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
442 (defun 5x5-up ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
443 "Move up."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
444 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
445 (unless (zerop 5x5-y-pos)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
446 (decf 5x5-y-pos)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
447 (5x5-position-cursor)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
448
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
449 (defun 5x5-down ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
450 "Move down."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
451 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
452 (unless (= 5x5-y-pos (1- 5x5-grid-size))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
453 (incf 5x5-y-pos)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
454 (5x5-position-cursor)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
455
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
456 (defun 5x5-left ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
457 "Move left."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
458 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
459 (unless (zerop 5x5-x-pos)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
460 (decf 5x5-x-pos)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
461 (5x5-position-cursor)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
462
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
463 (defun 5x5-right ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
464 "Move right."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
465 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
466 (unless (= 5x5-x-pos (1- 5x5-grid-size))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
467 (incf 5x5-x-pos)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
468 (5x5-position-cursor)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
469
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
470 (defun 5x5-bol ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
471 "Move to beginning of line."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
472 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
473 (setq 5x5-x-pos 0)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
474 (5x5-position-cursor))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
475
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
476 (defun 5x5-eol ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
477 "Move to end of line."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
478 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
479 (setq 5x5-x-pos (1- 5x5-grid-size))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
480 (5x5-position-cursor))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
481
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
482 (defun 5x5-first ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
483 "Move to the first cell."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
484 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
485 (setq 5x5-x-pos 0
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
486 5x5-y-pos 0)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
487 (5x5-position-cursor))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
488
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
489 (defun 5x5-last ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
490 "Move to the last cell."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
491 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
492 (setq 5x5-x-pos (1- 5x5-grid-size)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
493 5x5-y-pos (1- 5x5-grid-size))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
494 (5x5-position-cursor))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
495
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
496 (defun 5x5-randomize ()
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
497 "Randomize the grid."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
498 (interactive)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
499 (when (5x5-y-or-n-p "Start a new game with a random grid? ")
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
500 (setq 5x5-x-pos (/ 5x5-grid-size 2)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
501 5x5-y-pos (/ 5x5-grid-size 2)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
502 5x5-moves 0
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
503 5x5-grid (5x5-make-random-grid))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
504 (unless 5x5-cracking
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
505 (5x5-draw-grid (list 5x5-grid)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
506 (5x5-position-cursor)))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
507
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
508 ;; Support functions
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
509
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
510 (defun 5x5-xor (x y)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
511 "Boolean exclusive-or of X and Y."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
512 (and (or x y) (not (and x y))))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
513
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
514 (defun 5x5-y-or-n-p (prompt)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
515 "5x5 wrapper for y-or-n-p which respects the 5x5-hassle-me setting."
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
516 (if 5x5-hassle-me
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
517 (y-or-n-p prompt)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
518 t))
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
519
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
520 (provide '5x5)
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
521
5decc043e9bf Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
522 ;;; 5x5.el ends here