blob: 65c11b7196dc6126ea01eb1b551d509a551b1ff5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Routines for manipulating chess plies
;;
;; $Revision$
;;; Commentary:
;; A ply is the differential between two positions. Or, it is the
;; coordinate transformations applied to one position in order to
;; arrive at the following position. It is also informally called "a
;; move".
;;
;; A ply is represented in Lisp using a cons cell of the form:
;;
;; (BASE-POSITION .
;; (FROM-COORD1 TO-COORD1 [FROM-COORD2 TO-COORD2] [KEYWORDS]))
;;
;; The KEYWORDS indicate special actions that are not really chess
;; moves:
;;
;; :promote PIECE ; promote pawn to PIECE on arrival
;; :resign ; a resignation causes the game to end
;; :stalemate
;; :repetition
;; :perpetual
;; :check ; check is announced
;; :checkmate
;; :draw ; a draw was offered and accepted
;; :draw-offered ; a draw was offered but not accepted
;;
;; A ply may be represented in ASCII by printing the FEN string of the
;; base position, and then printing the positional transformation in
;; algebraic notation. Since the starting position is usually known,
;; the FEN string is optional. A ply may be represented graphically
;; by moving the chess piece(s) involved. It may be rendered verbally
;; by voicing which piece is to move, where it will move to, and what
;; will happen a result of the move (piece capture, check, etc).
;;
;; Plies may be sent over network connections, postal mail, e-mail,
;; etc., so long as the current position is maintained at both sides.
;; Transmitting the base position's FEN string along with the ply
;; offers a form of confirmation during the course of a game.
;;; Code:
(require 'chess-pos)
(require 'chess-standard)
(defgroup chess-ply nil
"Routines for manipulating chess plies."
:group 'chess)
(defsubst chess-ply-pos (ply)
(car ply))
(defsubst chess-ply-set-pos (ply position)
(setcar ply position))
(defsubst chess-ply-changes (ply)
(cdr ply))
(defsubst chess-ply-set-changes (ply changes)
(setcdr ply changes))
(defun chess-ply-next-pos (ply)
(apply 'chess-pos-move (chess-pos-copy (chess-ply-pos ply))
(chess-ply-changes ply)))
(defsubst chess-ply-create (position &rest changes)
(cons position changes))
(defun chess-legal-plies (position &optional search-func)
"Return a list of all legal plies in POSITION."
(let (plies)
(dotimes (rank 8)
(dotimes (file 8)
(let* ((to (chess-rf-to-index rank file))
(piece (chess-pos-piece position to)))
(when (or (eq piece ? )
(if (chess-pos-side-to-move position)
(> piece ?a)
(< piece ?a)))
(dolist (candidate (funcall (or search-func
chess-standard-search)
position to t))
(push (chess-ply-create position candidate to)
plies))))))
plies))
(provide 'chess-ply)
;;; chess-ply.el ends here
|