X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/f6f3366160e26ff5984f287e60616ec9f90acfa3..52f8337d7129eebc1bebcd07b61f3e0ec3a6bbc2:/lisp/play/gomoku.el diff --git a/lisp/play/gomoku.el b/lisp/play/gomoku.el index bb77c5a33e..6d73e2ccb6 100644 --- a/lisp/play/gomoku.el +++ b/lisp/play/gomoku.el @@ -1,7 +1,6 @@ ;;; gomoku.el --- Gomoku game between you and Emacs -;; Copyright (C) 1988, 1994, 1996, 2001, 2002, 2003, 2004, 2005, 2006, -;; 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +;; Copyright (C) 1988, 1994, 1996, 2001-2012 Free Software Foundation, Inc. ;; Author: Philippe Schnoebelen ;; Maintainer: FSF @@ -90,16 +89,16 @@ One useful value to include is `turn-on-font-lock' to highlight the pieces." ;; look rectangular, but spacings SHOULD be at least 2 (MUST BE at least 1). (defconst gomoku-square-width 4 - "*Horizontal spacing between squares on the Gomoku board.") + "Horizontal spacing between squares on the Gomoku board.") (defconst gomoku-square-height 2 - "*Vertical spacing between squares on the Gomoku board.") + "Vertical spacing between squares on the Gomoku board.") (defconst gomoku-x-offset 3 - "*Number of columns between the Gomoku board and the side of the window.") + "Number of columns between the Gomoku board and the side of the window.") (defconst gomoku-y-offset 1 - "*Number of lines between the Gomoku board and the top of the window.") + "Number of lines between the Gomoku board and the top of the window.") (defvar gomoku-mode-map @@ -162,7 +161,7 @@ One useful value to include is `turn-on-font-lock' to highlight the pieces." (defface gomoku-O '((((class color)) (:foreground "red" :weight bold))) - "Face to use for Emacs' O." + "Face to use for Emacs's O." :group 'gomoku) (defface gomoku-X @@ -174,7 +173,7 @@ One useful value to include is `turn-on-font-lock' to highlight the pieces." '(("O" . 'gomoku-O) ("X" . 'gomoku-X) ("[-|/\\]" 0 (if gomoku-emacs-won 'gomoku-O 'gomoku-X))) - "*Font lock rules for Gomoku.") + "Font lock rules for Gomoku.") (put 'gomoku-mode 'front-sticky (put 'gomoku-mode 'rear-nonsticky '(intangible))) @@ -278,7 +277,7 @@ Other useful commands:\n ;; its contents as a set, i.e. not considering the order of its elements. The ;; highest score is given to the "OOOO" qtuples because playing in such a ;; qtuple is winning the game. Just after this comes the "XXXX" qtuple because -;; not playing in it is just loosing the game, and so on. Note that a +;; not playing in it is just losing the game, and so on. Note that a ;; "polluted" qtuple, i.e. one containing at least one X and at least one O, ;; has score zero because there is no more any point in playing in it, from ;; both an attacking and a defending point of view. @@ -299,15 +298,15 @@ Other useful commands:\n ;; these values will change (hopefully improve) the strength of the program ;; and may change its style (rather aggressive here). -(defconst nil-score 7 "Score of an empty qtuple.") -(defconst Xscore 15 "Score of a qtuple containing one X.") -(defconst XXscore 400 "Score of a qtuple containing two X's.") -(defconst XXXscore 1800 "Score of a qtuple containing three X's.") -(defconst XXXXscore 100000 "Score of a qtuple containing four X's.") -(defconst Oscore 35 "Score of a qtuple containing one O.") -(defconst OOscore 800 "Score of a qtuple containing two O's.") -(defconst OOOscore 15000 "Score of a qtuple containing three O's.") -(defconst OOOOscore 800000 "Score of a qtuple containing four O's.") +(defconst gomoku-nil-score 7 "Score of an empty qtuple.") +(defconst gomoku-Xscore 15 "Score of a qtuple containing one X.") +(defconst gomoku-XXscore 400 "Score of a qtuple containing two X's.") +(defconst gomoku-XXXscore 1800 "Score of a qtuple containing three X's.") +(defconst gomoku-XXXXscore 100000 "Score of a qtuple containing four X's.") +(defconst gomoku-Oscore 35 "Score of a qtuple containing one O.") +(defconst gomoku-OOscore 800 "Score of a qtuple containing two O's.") +(defconst gomoku-OOOscore 15000 "Score of a qtuple containing three O's.") +(defconst gomoku-OOOOscore 800000 "Score of a qtuple containing four O's.") ;; These values are not just random: if, given the following situation: ;; @@ -320,7 +319,7 @@ Other useful commands:\n ;; you want Emacs to play in "a" and not in "b", then the parameters must ;; satisfy the inequality: ;; -;; 6 * XXscore > XXXscore + XXscore +;; 6 * gomoku-XXscore > gomoku-XXXscore + gomoku-XXscore ;; ;; because "a" mainly belongs to six "XX" qtuples (the others are less ;; important) while "b" belongs to one "XXX" and one "XX" qtuples. Other @@ -334,26 +333,26 @@ Other useful commands:\n ;; we just have to set up a translation table. (defconst gomoku-score-trans-table - (vector nil-score Xscore XXscore XXXscore XXXXscore 0 - Oscore 0 0 0 0 0 - OOscore 0 0 0 0 0 - OOOscore 0 0 0 0 0 - OOOOscore 0 0 0 0 0 + (vector gomoku-nil-score gomoku-Xscore gomoku-XXscore gomoku-XXXscore gomoku-XXXXscore 0 + gomoku-Oscore 0 0 0 0 0 + gomoku-OOscore 0 0 0 0 0 + gomoku-OOOscore 0 0 0 0 0 + gomoku-OOOOscore 0 0 0 0 0 0) "Vector associating qtuple contents to their score.") ;; If you do not modify drastically the previous constants, the only way for a -;; square to have a score higher than OOOOscore is to belong to a "OOOO" +;; square to have a score higher than gomoku-OOOOscore is to belong to a "OOOO" ;; qtuple, thus to be a winning move. Similarly, the only way for a square to -;; have a score between XXXXscore and OOOOscore is to belong to a "XXXX" +;; have a score between gomoku-XXXXscore and gomoku-OOOOscore is to belong to a "XXXX" ;; qtuple. We may use these considerations to detect when a given move is -;; winning or loosing. +;; winning or losing. -(defconst gomoku-winning-threshold OOOOscore +(defconst gomoku-winning-threshold gomoku-OOOOscore "Threshold score beyond which an Emacs move is winning.") -(defconst gomoku-loosing-threshold XXXXscore +(defconst gomoku-losing-threshold gomoku-XXXXscore "Threshold score beyond which a human move is winning.") @@ -380,7 +379,7 @@ Other useful commands:\n best-square square score-max score) (aset gomoku-score-table square -1))) ; no: kill it ! - ;; If score is equally good, choose randomly. But first check freeness: + ;; If score is equally good, choose randomly. But first check freedom: ((not (zerop (aref gomoku-board square))) (aset gomoku-score-table square -1)) ((zerop (random (setq count (1+ count)))) @@ -394,10 +393,10 @@ Other useful commands:\n ;;; ;; At initialization the board is empty so that every qtuple amounts for -;; nil-score. Therefore, the score of any square is nil-score times the number +;; gomoku-nil-score. Therefore, the score of any square is gomoku-nil-score times the number ;; of qtuples that pass through it. This number is 3 in a corner and 20 if you ;; are sufficiently far from the sides. As computing the number is time -;; consuming, we initialize every square with 20*nil-score and then only +;; consuming, we initialize every square with 20*gomoku-nil-score and then only ;; consider squares at less than 5 squares from one side. We speed this up by ;; taking symmetry into account. ;; Also, as it is likely that successive games will be played on a board with @@ -421,7 +420,7 @@ Other useful commands:\n (setq gomoku-score-table (copy-sequence gomoku-saved-score-table)) ;; No, compute it: (setq gomoku-score-table - (make-vector gomoku-vector-length (* 20 nil-score))) + (make-vector gomoku-vector-length (* 20 gomoku-nil-score))) (let (i j maxi maxj maxi2 maxj2) (setq maxi (/ (1+ gomoku-board-width) 2) maxj (/ (1+ gomoku-board-height) 2) @@ -872,7 +871,7 @@ If the game is finished, this command requests for another game." (t (setq score (aref gomoku-score-table square)) (gomoku-play-move square 1) - (cond ((and (>= score gomoku-loosing-threshold) + (cond ((and (>= score gomoku-losing-threshold) ;; Just testing SCORE > THRESHOLD is not enough for ;; detecting wins, it just gives an indication that ;; we confirm with GOMOKU-FIND-FILLED-QTUPLE. @@ -929,11 +928,7 @@ If the game is finished, this command requests for another game." "Display a message asking for Human's move." (message (if (zerop gomoku-number-of-human-moves) "Your move? (Move to a free square and hit X, RET ...)" - "Your move?")) - ;; This may seem silly, but if one omits the following line (or a similar - ;; one), the cursor may very well go to some place where POINT is not. - ;; FIXME: this can't be right!! --Stef - (save-excursion (set-buffer (other-buffer)))) + "Your move?"))) (defun gomoku-prompt-for-other-game () "Ask for another game, and start it." @@ -1048,11 +1043,11 @@ If the game is finished, this command requests for another game." (insert-char ?\n gomoku-square-height)) (or (eq (char-after 1) ?.) (put-text-property 1 2 'point-entered - (lambda (x y) (if (bobp) (forward-char))))) + (lambda (_x _y) (if (bobp) (forward-char))))) (or intangible (put-text-property point (point) 'intangible 2)) (put-text-property point (point) 'point-entered - (lambda (x y) (if (eobp) (backward-char)))) + (lambda (_x _y) (if (eobp) (backward-char)))) (put-text-property (point-min) (point) 'category 'gomoku-mode)) (gomoku-goto-xy (/ (1+ n) 2) (/ (1+ m) 2)) ; center of the board (sit-for 0)) ; Display NOW