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 }