[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] 86/255: playing gnugo
From: |
Eric Schulte |
Subject: |
[elpa] 86/255: playing gnugo |
Date: |
Sun, 16 Mar 2014 01:02:25 +0000 |
eschulte pushed a commit to branch go
in repository elpa.
commit 2a3604910cace9f838d439a95e4c1d18cd4f9d09
Author: Eric Schulte <address@hidden>
Date: Thu May 24 18:27:13 2012 -0600
playing gnugo
---
sgf-board.el | 82 ++++++++++++++++++++++++++++++---------------------------
sgf-gnugo.el | 5 +++-
sgf-gtp.el | 40 ++++++++++++++++++++++++---
sgf-tests.el | 19 +++++++------
sgf-trans.el | 4 ++-
sgf-util.el | 21 ++++++--------
sgf.el | 2 +-
sgf2el.el | 7 +++++
8 files changed, 112 insertions(+), 68 deletions(-)
diff --git a/sgf-board.el b/sgf-board.el
index 84a5583..a66c3ba 100644
--- a/sgf-board.el
+++ b/sgf-board.el
@@ -31,6 +31,7 @@
(defvar *history* nil "Holds the board history for a GO buffer.")
(defvar *size* nil "Holds the board size.")
+(defvar *turn* nil "Holds the color of the current turn.")
(defvar *back-ends* nil "Holds the back-ends connected to a board.")
(defvar black-piece "X")
@@ -43,9 +44,6 @@
(defun board-size (board) (round (sqrt (length board))))
-(defun pos-to-index (pos size)
- (+ (car pos) (* (cdr pos) size)))
-
(defun move-type (move)
(cond
((member (car move) '(:B :W)) :move)
@@ -54,7 +52,14 @@
(defun other-color (color)
(if (equal color :B) :W :B))
-(defun apply-moves (board moves)
+(defun apply-turn-to-board (moves)
+ (let ((board (pieces-to-board (car *history*) *size*)))
+ (clear-labels board)
+ (dolist (move moves) (apply-move board move))
+ (push (board-to-pieces board) *history*)
+ (update-display (current-buffer))))
+
+(defun apply-move (board move)
(flet ((bset (val data)
(let ((data (if (listp (car data)) data (list data))))
(setf (aref board (pos-to-index (aget data :pos)
@@ -65,15 +70,14 @@
(:LB (aget data :label))
(:LW (aget data :label))
(t nil))))))
- (dolist (move moves board)
- (case (move-type move)
- (:move
- (bset (car move) (cdr move))
- (let ((color (if (equal :B (car move)) :B :W)))
- (remove-dead board (other-color color))
- (remove-dead board color)))
- (:label
- (dolist (data (cdr move)) (bset (car move) data)))))))
+ (case (move-type move)
+ (:move
+ (bset (car move) (cdr move))
+ (let ((color (if (equal :B (car move)) :B :W)))
+ (remove-dead board (other-color color))
+ (remove-dead board color)))
+ (:label
+ (dolist (data (cdr move)) (bset (car move) data))))))
(defun clear-labels (board)
(dotimes (point (length board) board)
@@ -157,7 +161,7 @@
(defun board-row-to-string (board row)
(let* ((size (board-size board))
- (label (format "%3d" (- size row)))
+ (label (format "%3d" (1+ row)))
(row-body (mapconcat
(lambda (n)
(board-pos-to-string board (cons row n)))
@@ -165,8 +169,9 @@
(concat label " " row-body label)))
(defun board-body-to-string (board)
- (mapconcat (lambda (m) (board-row-to-string board m))
- (range (board-size board)) "\n"))
+ (let ((board (transpose-array board)))
+ (mapconcat (lambda (m) (board-row-to-string board m))
+ (reverse (range (board-size board))) "\n")))
(defun board-to-string (board)
(let ((header (board-header board))
@@ -197,6 +202,7 @@
(when (sgf<-name back-end)
(rename-buffer (ear-muffs (sgf<-name back-end)) 'unique))
(set (make-local-variable '*back-ends*) (list back-end))
+ (set (make-local-variable '*turn*) :B)
(set (make-local-variable '*size*) (sgf<-size back-end))
(set (make-local-variable '*history*)
(list (board-to-pieces (make-board *size*))))
@@ -221,21 +227,25 @@
(defun sgf-board-act-move (&optional pos)
(interactive)
- (unless pos
- (setq pos
- (cons
- (char-to-num
- (aref (downcase
- (org-icompleting-read
- "X pos: "
- (mapcar #'string
- (mapcar #'num-to-char (range 1 *size*)))))
- 0))
- (1- (string-to-number
- (org-icompleting-read
- "Y pos: "
- (mapcar #'number-to-string (range 1 *size*))))))))
- (message "move: %S" pos))
+ (let* ((color (case *turn* (:B "black") (:W "white")))
+ (move (cons *turn*
+ (cons :pos
+ (cons (sgf-gtp-char-to-num
+ (aref (downcase
+ (org-icompleting-read
+ (format "[%s] X pos: " color)
+ (mapcar #'string
+ (mapcar #'sgf-gtp-num-to-char
+ (range 1 *size*)))))
+ 0))
+ (1- (string-to-number
+ (org-icompleting-read
+ (format "[%s] Y pos: " color)
+ (mapcar #'number-to-string
+ (range 1 *size*))))))))))
+ (sgf->move (car *back-ends*) move)
+ (apply-turn-to-board (list move))
+ (setf *turn* (other-color *turn*))))
(defun sgf-board-act-resign ()
(interactive)
@@ -266,14 +276,8 @@
(defun sgf-board-next (&optional count)
(interactive "p")
(dotimes (n (or count 1) (or count 1))
- (let ((board (pieces-to-board (car *history*) *size*))
- (move (sgf<-move (car *back-ends*))))
- (if move
- (push (board-to-pieces
- (apply-moves (clear-labels board) move))
- *history*)
- (error "sgf-board: no more moves"))
- (update-display (current-buffer)))))
+ (apply-turn-to-board (sgf<-turn (car *back-ends*) *turn*))
+ (setf *turn* (other-color *turn*))))
(defun sgf-board-prev (&optional count)
(interactive "p")
diff --git a/sgf-gnugo.el b/sgf-gnugo.el
index 72dcbf4..6925c28 100644
--- a/sgf-gnugo.el
+++ b/sgf-gnugo.el
@@ -31,6 +31,7 @@
;;; CODE:
(require 'sgf-util)
+(require 'sgf-gtp)
(require 'comint)
(defun sgf-gnugo-gtp-commands ()
@@ -88,7 +89,9 @@
;;; Class and interface
(defclass gnugo (gtp)
- ((buffer :initarg :buffer :accessor buffer :initform nil)))
+ ((buffer :initarg :buffer
+ :accessor buffer
+ :initform (sgf-gnugo-start-process))))
(defmethod gtp-command ((gnugo gnugo) command)
(sgf-gnugo-command-to-string gnugo command))
diff --git a/sgf-gtp.el b/sgf-gtp.el
index a198c5a..c90a05b 100644
--- a/sgf-gtp.el
+++ b/sgf-gtp.el
@@ -35,20 +35,31 @@
(require 'sgf-util)
(require 'sgf-trans)
-(defun sgf-gtp-char-to-pos (char)
+(defun sgf-gtp-char-to-num (char)
(flet ((err () (error "sgf-gtp: invalid char %s" char)))
(cond
((< char ?A) (err))
- ((< char ?I) (1+ (- char ?A)))
- ((<= char ?T) (- char ?A))
+ ((< char ?I) (- char ?A))
+ ((<= char ?T) (1- (- char ?A)))
((< char ?a) (err))
- ((< char ?i) (1+ (- char ?a)))
- ((<= char ?t) (- char ?a))
+ ((< char ?i) (- char ?a))
+ ((<= char ?t) (1- (- char ?a)))
(t (err)))))
+(defun sgf-gtp-num-to-char (num)
+ (flet ((err () (error "sgf: invalid num %s" num)))
+ (cond
+ ((< num 1) (err))
+ ((< num 9) (+ ?A (1- num)))
+ (t (+ ?A num)))))
+
(defun sgf-pos-to-gtp (pos)
(format "%c%d" (num-to-char (1+ (car pos))) (1+ (cdr pos))))
+(defun sgf-gtp-to-pos (color gtp)
+ (cons color (cons :pos (cons (sgf-gtp-char-to-num (aref gtp 0))
+ (1- (parse-integer (substring gtp 1)))))))
+
(defun sgf-to-gtp-command (element)
"Convert an sgf ELEMENT to a gtp command."
(let ((key (car element))
@@ -70,5 +81,24 @@
(defmethod sgf->move ((gtp gtp) move)
(gtp-command gtp (sgf-to-gtp-command move)))
+(defmethod sgf<-size ((gtp gtp))
+ (parse-integer (gtp-command gtp "query_boardsize")))
+
+(defmethod sgf<-name ((gtp gtp))
+ (gtp-command gtp "name"))
+
+(defmethod sgf<-comment ((gtp gtp)) nil)
+
+(defmethod sgf<-move ((gtp gtp) color)
+ (sgf-gtp-to-pos color
+ (case color
+ (:B (gtp-command gtp "genmove_black"))
+ (:W (gtp-command gtp "genmove_white")))))
+
+(defmethod sgf<-turn ((gtp gtp) color) (list (sgf<-move gtp color)))
+
+(defmethod sgf->reset ((gtp gtp))
+ (gtp-command gtp "clear_board"))
+
(provide 'sgf-gtp)
;;; sgf-gtp.el ends here
diff --git a/sgf-tests.el b/sgf-tests.el
index 761bc01..311dfda 100644
--- a/sgf-tests.el
+++ b/sgf-tests.el
@@ -139,7 +139,8 @@
" 1 . . . . . . . . . . . . . . . . . . . 1\n"
" A B C D E F G H J K L M N O P Q R S T")))
(dolist (moves rest)
- (apply-moves board moves))
+ (dolist (move moves)
+ (apply-move board move)))
(board-to-string board)
(should t)))
@@ -153,14 +154,14 @@
;;; GTP and gnugo tests
(ert-deftest sgf-test-sgf-gtp-char-to-gtp ()
- (should (= 1 (sgf-gtp-char-to-pos ?A)))
- (should (= 8 (sgf-gtp-char-to-pos ?H)))
- (should (= 9 (sgf-gtp-char-to-pos ?J)))
- (should (= 19 (sgf-gtp-char-to-pos ?T)))
- (should (= 1 (sgf-gtp-char-to-pos ?a)))
- (should (= 8 (sgf-gtp-char-to-pos ?h)))
- (should (= 9 (sgf-gtp-char-to-pos ?j)))
- (should (= 19 (sgf-gtp-char-to-pos ?t))))
+ (should (= 1 (sgf-gtp-char-to-num ?A)))
+ (should (= 8 (sgf-gtp-char-to-num ?H)))
+ (should (= 9 (sgf-gtp-char-to-num ?J)))
+ (should (= 19 (sgf-gtp-char-to-num ?T)))
+ (should (= 1 (sgf-gtp-char-to-num ?a)))
+ (should (= 8 (sgf-gtp-char-to-num ?h)))
+ (should (= 9 (sgf-gtp-char-to-num ?j)))
+ (should (= 19 (sgf-gtp-char-to-num ?t))))
(defmacro with-gnugo (&rest body)
`(let (*gnugo*)
diff --git a/sgf-trans.el b/sgf-trans.el
index a8b9ace..14689ac 100644
--- a/sgf-trans.el
+++ b/sgf-trans.el
@@ -42,10 +42,12 @@
(defgeneric sgf->resign (back-end resign) "Send RESIGN to BACK-END.")
(defgeneric sgf->undo (back-end) "Tell BACK-END undo the last
move.")
(defgeneric sgf->comment (back-end comment) "Send COMMENT to BACK-END.")
+(defgeneric sgf->reset (back-end) "Reset the current BACK-END.")
(defgeneric sgf<-size (back-end) "Get size from BACK-END")
(defgeneric sgf<-name (back-end) "Get a game name from BACK-END.")
(defgeneric sgf<-alt (back-end) "Get an alternative from
BACK-END.")
-(defgeneric sgf<-move (back-end) "Get POS from BACK-END.")
+(defgeneric sgf<-move (back-end color) "Get a pos from BACK-END.")
+(defgeneric sgf<-turn (back-end color) "Get a full turn from BACK-END.")
(defgeneric sgf<-comment (back-end) "Get COMMENT from BACK-END.")
(provide 'sgf-trans)
diff --git a/sgf-util.el b/sgf-util.el
index 89d989d..04148d7 100644
--- a/sgf-util.el
+++ b/sgf-util.el
@@ -51,18 +51,15 @@
(listp (car list))
(not (listp (caar list)))))
-(defun num-to-char (num)
- (flet ((err () (error "sgf: invalid num %s" num)))
- (cond
- ((< num 1) (err))
- ((< num 9) (+ ?A (1- num)))
- (t (+ ?A num)))))
+(defun pos-to-index (pos size)
+ (+ (car pos) (* (cdr pos) size)))
-(defun char-to-num (char)
- (cond
- ((or (< char ?A) (< ?z char))
- (error "sgf: invalid char %s" char))
- ((< char ?a) (+ 26 (- char ?A)))
- (t (- char ?a))))
+(defun transpose-array (board)
+ (let ((size (round (sqrt (length board))))
+ (trans (make-vector (length board) nil)))
+ (dotimes (row size trans)
+ (dotimes (col size)
+ (setf (aref trans (pos-to-index (cons row col) size))
+ (aref board (pos-to-index (cons col row) size)))))))
(provide 'sgf-util)
diff --git a/sgf.el b/sgf.el
index 9756110..19bf52c 100644
--- a/sgf.el
+++ b/sgf.el
@@ -92,7 +92,7 @@
(defmethod sgf<-alt ((sgf sgf)))
-(defmethod sgf<-move ((sgf sgf))
+(defmethod sgf<-move ((sgf sgf) color)
(incf (car (last (index sgf))))
(current sgf))
diff --git a/sgf2el.el b/sgf2el.el
index 401ed56..f3012fa 100644
--- a/sgf2el.el
+++ b/sgf2el.el
@@ -149,6 +149,13 @@
(car date-args)))))
(add-to-list 'sgf2el-special-properties (cons :DT #'process-date))
+(defun char-to-num (char)
+ (cond
+ ((or (< char ?A) (< ?z char))
+ (error "sgf: invalid char %s" char))
+ ((< char ?a) (+ 26 (- char ?A)))
+ (t (- char ?a))))
+
(defun process-position (position-string)
(cons (char-to-num (aref position-string 0))
(char-to-num (aref position-string 1))))
- [elpa] 80/255: splitting the sgf back end from the board interface, (continued)
- [elpa] 80/255: splitting the sgf back end from the board interface, Eric Schulte, 2014/03/15
- [elpa] 84/255: more transition, Eric Schulte, 2014/03/15
- [elpa] 82/255: organization, Eric Schulte, 2014/03/15
- [elpa] 88/255: made the *back-ends* variable singular, Eric Schulte, 2014/03/15
- [elpa] 57/255: splitting sgf.el into board test and utility files, Eric Schulte, 2014/03/15
- [elpa] 87/255: removed old variable, Eric Schulte, 2014/03/15
- [elpa] 83/255: starting to transition to generic board interface, Eric Schulte, 2014/03/15
- [elpa] 85/255: working with new set less some state-leak issues, Eric Schulte, 2014/03/15
- [elpa] 90/255: moving around major mode and key bindings, Eric Schulte, 2014/03/15
- [elpa] 91/255: adding properties to the board string, Eric Schulte, 2014/03/15
- [elpa] 86/255: playing gnugo,
Eric Schulte <=
- [elpa] 94/255: remove old variable from tests, Eric Schulte, 2014/03/15
- [elpa] 92/255: worked around stupid bug in mapconcat, Eric Schulte, 2014/03/15
- [elpa] 93/255: able to play against gnugo, Eric Schulte, 2014/03/15
- [elpa] 95/255: renaming files for go- prefix, Eric Schulte, 2014/03/15
- [elpa] 98/255: *trackers* are multiple subordinate back-ends, Eric Schulte, 2014/03/15
- [elpa] 89/255: tweaks, Eric Schulte, 2014/03/15
- [elpa] 102/255: simpler name for main go-board function, Eric Schulte, 2014/03/15
- [elpa] 100/255: automated playing with gnugo, Eric Schulte, 2014/03/15
- [elpa] 99/255: single function to play gnugo, Eric Schulte, 2014/03/15
- [elpa] 101/255: now with colors, Eric Schulte, 2014/03/15