Mercurial > projects > doodle
comparison doodle/main/prog/chess.d @ 128:bc4d29c7499c
Chess tinkering
author | David Bryant <bagnose@gmail.com> |
---|---|
date | Tue, 13 Dec 2011 19:18:25 +1030 |
parents | 1da160a2c373 |
children | 10ad5417bf07 |
comparison
equal
deleted
inserted
replaced
127:1da160a2c373 | 128:bc4d29c7499c |
---|---|
1 import std.stdio; | 1 import std.stdio; |
2 import std.traits; | 2 import std.traits; |
3 import std.range; | |
4 | |
5 enum Color { | |
6 White, Black | |
7 } | |
8 | |
9 Color invert(Color c) { | |
10 return c == Color.White ? Color.Black : Color.White; | |
11 } | |
3 | 12 |
4 enum Piece { | 13 enum Piece { |
5 King, Queen, Rook, Bishop, Knight, Pawn | 14 King, Queen, Rook, Bishop, Knight, Pawn |
6 } | 15 } |
7 | 16 |
8 enum Color { | 17 string toString(Color color, Piece piece) { |
9 White, Black | |
10 } | |
11 | |
12 string unicode(Color color, Piece piece) { | |
13 string[6][2] table = | 18 string[6][2] table = |
14 [ | 19 [ |
15 [ "\u2654", "\u2655", "\u2656", "\u2657", "\u2658", "\u2659" ], | 20 [ "\u2654", "\u2655", "\u2656", "\u2657", "\u2658", "\u2659" ], |
16 [ "\u265A", "\u265B", "\u265C", "\u265D", "\u265E", "\u265F" ] | 21 [ "\u265A", "\u265B", "\u265C", "\u265D", "\u265E", "\u265F" ] |
17 ]; | 22 ]; |
32 | 37 |
33 enum File { | 38 enum File { |
34 _A, _B, _C, _D, _E, _F, _G, _H | 39 _A, _B, _C, _D, _E, _F, _G, _H |
35 } | 40 } |
36 | 41 |
42 char toChar(File f) { | |
43 char[8] table = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' ]; | |
44 return table[f]; | |
45 } | |
46 | |
37 enum Rank { | 47 enum Rank { |
38 _1, _2, _3, _4, _5, _6, _7, _8 | 48 _1, _2, _3, _4, _5, _6, _7, _8 |
39 } | 49 } |
40 | 50 |
51 char toChar(Rank r) { | |
52 char[8] table = [ '1', '2', '3', '4', '5', '6', '7', '8' ]; | |
53 return table[r]; | |
54 } | |
55 | |
56 struct Coord { | |
57 File file; | |
58 Rank rank; | |
59 } | |
60 | |
61 struct Move { | |
62 Coord source; | |
63 Coord dest; | |
64 } | |
65 | |
41 struct Board { | 66 struct Board { |
42 Square opCall(File f, Rank r) const { | 67 this(Board board, Move move) { |
43 return squares[f][r]; | 68 squares = board.squares; |
69 apply(move); | |
70 } | |
71 | |
72 Square square(Coord coord) const { | |
73 return squares[coord.file][coord.rank]; | |
44 } | 74 } |
45 | 75 |
46 private: | 76 private: |
77 Square * square(Coord coord) { | |
78 return &squares[coord.file][coord.rank]; | |
79 } | |
80 | |
81 void apply(Move move) { | |
82 auto sq1 = square(move.source); | |
83 auto sq2 = square(move.dest); | |
84 | |
85 if (sq1.piece == Piece.Pawn && move.dest.file != move.source.file) { | |
86 // en-passant | |
87 } | |
88 else if (sq1.piece == Piece.King && move.dest.file - move.source.file > 1) { | |
89 // castle | |
90 } | |
91 else { | |
92 *sq2 = *sq1; | |
93 sq1.occupied = false; | |
94 } | |
95 } | |
96 | |
47 Square[8][8] squares = | 97 Square[8][8] squares = |
48 [ | 98 [ |
49 [ Square(Color.White, Piece.Rook), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Rook) ], | 99 [ Square(Color.White, Piece.Rook), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Rook) ], |
50 [ Square(Color.White, Piece.Knight), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Knight) ], | 100 [ Square(Color.White, Piece.Knight), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Knight) ], |
51 [ Square(Color.White, Piece.Bishop), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Bishop) ], | 101 [ Square(Color.White, Piece.Bishop), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Bishop) ], |
52 [ Square(Color.White, Piece.Queen), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Queen) ], | 102 [ Square(Color.White, Piece.Queen), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Queen) ], |
53 [ Square(Color.White, Piece.King), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.King) ], | 103 [ Square(Color.White, Piece.King), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.King) ], |
54 [ Square(Color.White, Piece.Bishop), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Bishop) ], | 104 [ Square(Color.White, Piece.Bishop), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Bishop) ], |
55 [ Square(Color.White, Piece.Knight), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Knight) ], | 105 [ Square(Color.White, Piece.Knight), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Knight) ], |
56 [ Square(Color.White, Piece.Rook), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Rook) ] | 106 [ Square(Color.White, Piece.Rook), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Rook) ] |
57 /* | |
58 [ Square(Color.White, Piece.Rook), Square(Color.White, Piece.Knight), Square(Color.White, Piece.Bishop), Square(Color.White, Piece.King), Square(Color.White, Piece.Queen), Square(Color.White, Piece.Bishop), Square(Color.White, Piece.Knight), Square(Color.White, Piece.Rook) ], | |
59 [ Square(Color.White, Piece.Pawn), Square(Color.White, Piece.Pawn), Square(Color.White, Piece.Pawn), Square(Color.White, Piece.Pawn), Square(Color.White, Piece.Pawn), Square(Color.White, Piece.Pawn), Square(Color.White, Piece.Pawn), Square(Color.White, Piece.Pawn) ], | |
60 [ Square(), Square(), Square(), Square(), Square(), Square(), Square(), Square() ], | |
61 [ Square(), Square(), Square(), Square(), Square(), Square(), Square(), Square() ], | |
62 [ Square(), Square(), Square(), Square(), Square(), Square(), Square(), Square() ], | |
63 [ Square(), Square(), Square(), Square(), Square(), Square(), Square(), Square() ], | |
64 [ Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Pawn) ], | |
65 [ Square(Color.Black, Piece.Rook), Square(Color.Black, Piece.Knight), Square(Color.Black, Piece.Bishop), Square(Color.Black, Piece.King), Square(Color.Black, Piece.Queen), Square(Color.Black, Piece.Bishop), Square(Color.Black, Piece.Knight), Square(Color.Black, Piece.Rook) ], | |
66 */ | |
67 ]; | 107 ]; |
68 } | 108 } |
69 | 109 |
70 Square[2][1] s = [ [ Square(), Square() ] ]; | 110 void dump(in Board board) { |
111 Color color = Color.White; | |
71 | 112 |
72 void write(in Board board) { | 113 foreach_reverse(r; EnumMembers!Rank) { |
73 foreach_reverse (r; EnumMembers!Rank) { | 114 write(toChar(r)); |
74 writef("%s ", r); | |
75 foreach(f; EnumMembers!File) { | 115 foreach(f; EnumMembers!File) { |
76 Square square = board(f, r); | 116 |
77 if (square.occupied) { | 117 if (color == Color.White) { |
78 writef("%s", unicode(square.color, square.piece)); | 118 write("\033[47m"); |
79 } | 119 } |
80 else { | 120 else { |
81 writef(" "); | 121 write("\033[40m"); |
82 } | 122 } |
123 | |
124 Square square = board.square(Coord(f, r)); | |
125 if (square.occupied) { | |
126 write(toString(square.color, square.piece)); | |
127 } | |
128 else { | |
129 write(" "); | |
130 } | |
131 | |
132 color = invert(color); | |
83 } | 133 } |
84 writeln(""); | 134 writeln("\033[0m"); |
135 | |
136 color = invert(color); | |
85 } | 137 } |
86 | 138 |
139 write(" "); | |
87 foreach(f; EnumMembers!File) { | 140 foreach(f; EnumMembers!File) { |
88 writef("%s", f); | 141 writef("%s", toChar(f)); |
89 } | 142 } |
90 writeln(""); | 143 writeln(""); |
91 } | 144 } |
92 | 145 |
93 void main(string[] args) { | 146 void main(string[] args) { |
94 Board board; | 147 Board board; |
95 write(board); | 148 dump(board); |
96 } | 149 } |