]> code.delx.au - gnu-emacs/blobdiff - lisp/play/snake.el
Update copyright year to 2015
[gnu-emacs] / lisp / play / snake.el
index 7716ab6bb77d38a8895de55bdb29a50cb81e8875..d42ba44b6301ef78d05f6fa80bea15b5f1fb6dbf 100644 (file)
@@ -1,7 +1,6 @@
 ;;; snake.el --- implementation of Snake for Emacs
 
-;; Copyright (C) 1997, 2001, 2002, 2003, 2004, 2005,
-;;   2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+;; Copyright (C) 1997, 2001-2015 Free Software Foundation, Inc.
 
 ;; Author: Glynn Clements <glynn@sensei.co.uk>
 ;; Created: 1997-09-10
@@ -26,8 +25,7 @@
 
 ;;; Code:
 
-(eval-when-compile
-  (require 'cl))
+(eval-when-compile (require 'cl-lib))
 
 (require 'gamegrid)
 
@@ -175,27 +173,28 @@ and then start moving it leftwards.")
 ;; ;;;;;;;;;;;;; keymaps ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defvar snake-mode-map
-  (make-sparse-keymap 'snake-mode-map))
+  (let ((map (make-sparse-keymap 'snake-mode-map)))
 
-(define-key snake-mode-map "n"         'snake-start-game)
-(define-key snake-mode-map "q"         'snake-end-game)
-(define-key snake-mode-map "p"         'snake-pause-game)
+    (define-key map "n"                'snake-start-game)
+    (define-key map "q"                'snake-end-game)
+    (define-key map "p"                'snake-pause-game)
 
-(define-key snake-mode-map [left]      'snake-move-left)
-(define-key snake-mode-map [right]     'snake-move-right)
-(define-key snake-mode-map [up]                'snake-move-up)
-(define-key snake-mode-map [down]      'snake-move-down)
+    (define-key map [left]     'snake-move-left)
+    (define-key map [right]    'snake-move-right)
+    (define-key map [up]               'snake-move-up)
+    (define-key map [down]     'snake-move-down)
+    map))
 
 (defvar snake-null-map
-  (make-sparse-keymap 'snake-null-map))
-
-(define-key snake-null-map "n"         'snake-start-game)
+  (let ((map (make-sparse-keymap 'snake-null-map)))
+    (define-key map "n"                'snake-start-game)
+    map))
 
 ;; ;;;;;;;;;;;;;;;; game functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defun snake-display-options ()
   (let ((options (make-vector 256 nil)))
-    (loop for c from 0 to 255 do
+    (dotimes (c 256)
       (aset options c
            (cond ((= c snake-blank)
                   snake-blank-options)
@@ -214,7 +213,7 @@ and then start moving it leftwards.")
 (defun snake-update-score ()
   (let* ((string (format "Score:  %05d" snake-score))
         (len (length string)))
-    (loop for x from 0 to (1- len) do
+    (dotimes (x len)
       (gamegrid-set-cell (+ snake-score-x x)
                         snake-score-y
                         (aref string x)))))
@@ -224,12 +223,12 @@ and then start moving it leftwards.")
                        snake-buffer-height
                        snake-space)
   (let ((buffer-read-only nil))
-    (loop for y from 0 to (1- snake-height) do
-         (loop for x from 0 to (1- snake-width) do
-               (gamegrid-set-cell x y snake-border)))
-    (loop for y from 1 to (- snake-height 2) do
-         (loop for x from 1 to (- snake-width 2) do
-               (gamegrid-set-cell x y snake-blank)))))
+    (dotimes (y snake-height)
+      (dotimes (x snake-width)
+        (gamegrid-set-cell x y snake-border)))
+    (cl-loop for y from 1 to (- snake-height 2) do
+             (cl-loop for x from 1 to (- snake-width 2) do
+                      (gamegrid-set-cell x y snake-blank)))))
 
 (defun snake-reset-game ()
   (gamegrid-kill-timer)
@@ -248,8 +247,8 @@ and then start moving it leftwards.")
     (dotimes (i snake-length)
       (gamegrid-set-cell x y snake-snake)
       (setq snake-positions (cons (vector x y) snake-positions))
-      (incf x snake-velocity-x)
-      (incf y snake-velocity-y)))
+      (cl-incf x snake-velocity-x)
+      (cl-incf y snake-velocity-y)))
   (snake-update-score))
 
 (defun snake-update-game (snake-buffer)
@@ -267,8 +266,8 @@ Argument SNAKE-BUFFER is the name of the buffer."
              (= c snake-snake))
          (snake-end-game)
        (cond ((= c snake-dot)
-              (incf snake-length)
-              (incf snake-score)
+              (cl-incf snake-length)
+              (cl-incf snake-score)
               (snake-update-score))
              (t
               (let* ((last-cons (nthcdr (- snake-length 2)
@@ -280,7 +279,7 @@ Argument SNAKE-BUFFER is the name of the buffer."
                                    (if (= (% snake-cycle 5) 0)
                                        snake-dot
                                      snake-blank))
-                (incf snake-cycle)
+                (cl-incf snake-cycle)
                 (setcdr last-cons nil))))
        (gamegrid-set-cell x y snake-snake)
        (setq snake-positions
@@ -354,21 +353,13 @@ Argument SNAKE-BUFFER is the name of the buffer."
 
 (put 'snake-mode 'mode-class 'special)
 
-(defun snake-mode ()
-  "A mode for playing Snake.
-
-Snake mode keybindings:
-   \\{snake-mode-map}
-"
-  (kill-all-local-variables)
+(define-derived-mode snake-mode special-mode "Snake"
+  "A mode for playing Snake."
 
   (add-hook 'kill-buffer-hook 'gamegrid-kill-timer nil t)
 
   (use-local-map snake-null-map)
 
-  (setq major-mode 'snake-mode)
-  (setq mode-name "Snake")
-
   (unless (featurep 'emacs)
     (setq mode-popup-menu
          '("Snake Commands"
@@ -383,9 +374,7 @@ Snake mode keybindings:
   (setq gamegrid-use-glyphs snake-use-glyphs-flag)
   (setq gamegrid-use-color snake-use-color-flag)
 
-  (gamegrid-init (snake-display-options))
-
-  (run-mode-hooks 'snake-mode-hook))
+  (gamegrid-init (snake-display-options)))
 
 ;;;###autoload
 (defun snake ()
@@ -412,5 +401,4 @@ Snake mode keybindings:
 
 (provide 'snake)
 
-;; arch-tag: 512ffc92-cfac-4287-9a4e-92890701a5c8
 ;;; snake.el ends here