annotate doodle/main/prog/chess.d @ 130:1bc3475624d3

Chess progress
author David Bryant <bagnose@gmail.com>
date Thu, 12 Jan 2012 18:20:58 +1030
parents 10ad5417bf07
children bc5baa585b32
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
1 //
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
2 // Notes:
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
3 // ply = half move (ie black or white's half of the move)
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
4
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
5 import std.stdio;
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
6 import std.ascii;
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
7 import std.traits;
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
8 import std.range;
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
9
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
10 enum Side {
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
11 White, Black
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
12 }
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
13
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
14 enum Name {
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
15 King, Queen, Rook, Bishop, Knight, Pawn
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
16 }
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
17
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
18 struct Piece {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
19 Side side;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
20 Name name;
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
21 }
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
22
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
23 string toString(Piece piece) {
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
24 return
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
25 [
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
26 [ "\u2654", "\u2655", "\u2656", "\u2657", "\u2658", "\u2659" ],
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
27 [ "\u265A", "\u265B", "\u265C", "\u265D", "\u265E", "\u265F" ]
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
28 ]
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
29 [piece.side][piece.name];
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
30 }
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
31
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
32 //
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
33 //
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
34 //
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
35
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
36 enum File {
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
37 _A, _B, _C, _D, _E, _F, _G, _H
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
38 }
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
39
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
40 char toChar(File f) {
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
41 return "abcdefgh"[f];
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
42 }
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
43
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
44 enum Rank {
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
45 _1, _2, _3, _4, _5, _6, _7, _8
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
46 }
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
47
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
48 char toChar(Rank r) {
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
49 return "12345678"[r];
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
50 }
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
51
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
52 struct Coord {
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
53 File file;
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
54 Rank rank;
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
55 }
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
56
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
57 string toString(in Coord coord) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
58 return toChar(coord.file) ~ "+" ~ toChar(coord.rank);
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
59 }
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
60
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
61 //
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
62 //
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
63 //
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
64
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
65 struct Board {
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
66 struct Square {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
67 this(in Side side, in Name name) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
68 occupied = true;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
69 piece = Piece(side, name);
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
70 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
71
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
72 bool occupied = false;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
73 Piece piece; // valid if occupied
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
74 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
75
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
76 this(in Square[8][8] squares_) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
77 squares = squares_;
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
78 }
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
79
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
80 Square square(Coord coord) const {
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
81 return squares[coord.file][coord.rank];
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
82 }
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
83
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
84 private:
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
85 Square * at(Coord coord) {
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
86 return &squares[coord.file][coord.rank];
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
87 }
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
88
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
89 void add(Piece piece, Coord coord) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
90 auto square = at(coord);
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
91 if (square.occupied) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
92 // error
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
93 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
94 else {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
95 square.occupied = true;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
96 square.piece = piece;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
97 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
98 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
99
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
100 void remove(Coord coord) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
101 auto square = at(coord);
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
102 if (square.occupied) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
103 square.occupied = false;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
104 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
105 else {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
106 // error
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
107 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
108 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
109
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
110 void move(Coord source, Coord dest) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
111 auto source_sq = at(source);
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
112 auto dest_sq = at(dest);
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
113
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
114 if (source_sq.occupied && !dest_sq.occupied) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
115 source_sq.occupied = false;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
116 dest_sq.occupied = true;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
117 dest_sq.piece = source_sq.piece;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
118 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
119 else {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
120 // error
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
121 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
122 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
123
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
124 Square[8][8] squares =
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
125 [
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
126 [ Square(Side.White, Name.Rook), Square(Side.White, Name.Pawn), Square(), Square(), Square(), Square(), Square(Side.Black, Name.Pawn), Square(Side.Black, Name.Rook) ],
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
127 [ Square(Side.White, Name.Knight), Square(Side.White, Name.Pawn), Square(), Square(), Square(), Square(), Square(Side.Black, Name.Pawn), Square(Side.Black, Name.Knight) ],
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
128 [ Square(Side.White, Name.Bishop), Square(Side.White, Name.Pawn), Square(), Square(), Square(), Square(), Square(Side.Black, Name.Pawn), Square(Side.Black, Name.Bishop) ],
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
129 [ Square(Side.White, Name.Queen), Square(Side.White, Name.Pawn), Square(), Square(), Square(), Square(), Square(Side.Black, Name.Pawn), Square(Side.Black, Name.Queen) ],
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
130 [ Square(Side.White, Name.King), Square(Side.White, Name.Pawn), Square(), Square(), Square(), Square(), Square(Side.Black, Name.Pawn), Square(Side.Black, Name.King) ],
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
131 [ Square(Side.White, Name.Bishop), Square(Side.White, Name.Pawn), Square(), Square(), Square(), Square(), Square(Side.Black, Name.Pawn), Square(Side.Black, Name.Bishop) ],
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
132 [ Square(Side.White, Name.Knight), Square(Side.White, Name.Pawn), Square(), Square(), Square(), Square(), Square(Side.Black, Name.Pawn), Square(Side.Black, Name.Knight) ],
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
133 [ Square(Side.White, Name.Rook), Square(Side.White, Name.Pawn), Square(), Square(), Square(), Square(), Square(Side.Black, Name.Pawn), Square(Side.Black, Name.Rook) ]
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
134 ];
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
135 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
136
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
137 void dump(in Board board) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
138 bool light_square = true;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
139
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
140 foreach_reverse(r; EnumMembers!Rank) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
141 write(toChar(r));
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
142 foreach(f; EnumMembers!File) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
143
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
144 if (light_square) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
145 write("\033[47m");
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
146 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
147 else {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
148 write("\033[40m");
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
149 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
150
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
151 Board.Square square = board.square(Coord(f, r));
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
152 if (square.occupied) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
153 write(toString(square.piece));
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
154 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
155 else {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
156 write(" ");
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
157 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
158
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
159 light_square = !light_square;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
160 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
161 writeln("\033[0m");
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
162
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
163 light_square = !light_square;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
164 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
165
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
166 write(" ");
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
167 foreach(f; EnumMembers!File) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
168 writef("%s", toChar(f));
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
169 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
170 writeln("");
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
171 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
172
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
173 //
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
174 //
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
175 //
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
176
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
177 enum KingState {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
178 Safe,
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
179 Check,
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
180 CheckMate
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
181 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
182
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
183 class Game {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
184 struct SideState {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
185 KingState kingState;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
186 bool kingMoved;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
187 bool queenRookMoved;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
188 bool kingRookMoved;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
189 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
190
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
191 struct Ply {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
192 this(Coord source_, Coord dest_) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
193 source = source_;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
194 dest = dest_;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
195 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
196
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
197 Coord source;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
198 Coord dest;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
199 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
200
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
201 @property Board board() { return _board; }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
202
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
203 struct Flags {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
204 bool check;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
205 bool mate;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
206 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
207
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
208 // Default initial pieces, white to play
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
209 this () {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
210 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
211
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
212 this (Board board, Flags whiteFlags, Flags blackFlags, Side nextPly) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
213 _board = board;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
214 _nextPly = nextPly;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
215 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
216
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
217 enum Acceptance {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
218 Normal,
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
219 Check,
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
220 Mate,
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
221 Illegal
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
222 }
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
223
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
224 Acceptance apply(in Ply ply) {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
225 /+
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
226 auto sq1 = square(update.source);
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
227 auto sq2 = square(update.dest);
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
228
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
229 if (sq1.piece == Piece.Pawn && update.dest.file != update.source.file) {
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
230 // en-passant
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
231 }
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
232 else if (sq1.piece == Piece.King && update.dest.file - update.source.file > 1) {
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
233 // castle
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
234 }
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
235 +/
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
236
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
237 return Acceptance.Normal;
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
238 }
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
239
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
240 private {
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
241 struct PieceState {
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
242 bool uncaptured;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
243 Coord coord; // valid if uncaptured
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
244 }
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
245
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
246 Board _board;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
247 Side _nextPly;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
248 SideState _whiteSideState;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
249 PieceState[8] _whitePieceState;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
250 SideState _blackSideState;
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
251 PieceState[8] _blackPieceState;
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
252 }
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
253 }
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
254
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
255 void main(string[] args) {
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
256 Board board;
128
bc4d29c7499c Chess tinkering
David Bryant <bagnose@gmail.com>
parents: 127
diff changeset
257 dump(board);
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
258
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
259 /+
129
10ad5417bf07 Checkpoint
David Bryant <bagnose@gmail.com>
parents: 128
diff changeset
260 Game game;
130
1bc3475624d3 Chess progress
David Bryant <bagnose@gmail.com>
parents: 129
diff changeset
261 +/
127
1da160a2c373 Chess checkpoint
David Bryant <bagnose@gmail.com>
parents:
diff changeset
262 }