# HG changeset patch # User David Bryant # Date 1323766105 -37800 # Node ID bc4d29c7499ce2744ac5ee2f92fa98c2042ecd51 # Parent 1da160a2c3738f7f2ecd6ba2e4b80c82d6154644 Chess tinkering diff -r 1da160a2c373 -r bc4d29c7499c doodle/main/prog/chess.d --- a/doodle/main/prog/chess.d Mon Dec 12 18:03:07 2011 +1030 +++ b/doodle/main/prog/chess.d Tue Dec 13 19:18:25 2011 +1030 @@ -1,15 +1,20 @@ import std.stdio; import std.traits; +import std.range; + +enum Color { + White, Black +} + +Color invert(Color c) { + return c == Color.White ? Color.Black : Color.White; +} enum Piece { King, Queen, Rook, Bishop, Knight, Pawn } -enum Color { - White, Black -} - -string unicode(Color color, Piece piece) { +string toString(Color color, Piece piece) { string[6][2] table = [ [ "\u2654", "\u2655", "\u2656", "\u2657", "\u2658", "\u2659" ], @@ -34,63 +39,111 @@ _A, _B, _C, _D, _E, _F, _G, _H } +char toChar(File f) { + char[8] table = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' ]; + return table[f]; +} + enum Rank { _1, _2, _3, _4, _5, _6, _7, _8 } +char toChar(Rank r) { + char[8] table = [ '1', '2', '3', '4', '5', '6', '7', '8' ]; + return table[r]; +} + +struct Coord { + File file; + Rank rank; +} + +struct Move { + Coord source; + Coord dest; +} + struct Board { - Square opCall(File f, Rank r) const { - return squares[f][r]; + this(Board board, Move move) { + squares = board.squares; + apply(move); + } + + Square square(Coord coord) const { + return squares[coord.file][coord.rank]; } private: + Square * square(Coord coord) { + return &squares[coord.file][coord.rank]; + } + + void apply(Move move) { + auto sq1 = square(move.source); + auto sq2 = square(move.dest); + + if (sq1.piece == Piece.Pawn && move.dest.file != move.source.file) { + // en-passant + } + else if (sq1.piece == Piece.King && move.dest.file - move.source.file > 1) { + // castle + } + else { + *sq2 = *sq1; + sq1.occupied = false; + } + } + Square[8][8] squares = [ - [ Square(Color.White, Piece.Rook), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Rook) ], + [ Square(Color.White, Piece.Rook), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Rook) ], [ Square(Color.White, Piece.Knight), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Knight) ], [ Square(Color.White, Piece.Bishop), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Bishop) ], - [ Square(Color.White, Piece.Queen), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Queen) ], - [ Square(Color.White, Piece.King), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.King) ], + [ Square(Color.White, Piece.Queen), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Queen) ], + [ Square(Color.White, Piece.King), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.King) ], [ Square(Color.White, Piece.Bishop), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Bishop) ], [ Square(Color.White, Piece.Knight), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Knight) ], - [ Square(Color.White, Piece.Rook), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Rook) ] - /* - [ 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) ], - [ 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) ], - [ Square(), Square(), Square(), Square(), Square(), Square(), Square(), Square() ], - [ Square(), Square(), Square(), Square(), Square(), Square(), Square(), Square() ], - [ Square(), Square(), Square(), Square(), Square(), Square(), Square(), Square() ], - [ Square(), Square(), Square(), Square(), Square(), Square(), Square(), Square() ], - [ 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) ], - [ 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) ], - */ + [ Square(Color.White, Piece.Rook), Square(Color.White, Piece.Pawn), Square(), Square(), Square(), Square(), Square(Color.Black, Piece.Pawn), Square(Color.Black, Piece.Rook) ] ]; } -Square[2][1] s = [ [ Square(), Square() ] ]; +void dump(in Board board) { + Color color = Color.White; -void write(in Board board) { - foreach_reverse (r; EnumMembers!Rank) { - writef("%s ", r); + foreach_reverse(r; EnumMembers!Rank) { + write(toChar(r)); foreach(f; EnumMembers!File) { - Square square = board(f, r); - if (square.occupied) { - writef("%s", unicode(square.color, square.piece)); + + if (color == Color.White) { + write("\033[47m"); } else { - writef(" "); + write("\033[40m"); + } + + Square square = board.square(Coord(f, r)); + if (square.occupied) { + write(toString(square.color, square.piece)); } + else { + write(" "); + } + + color = invert(color); } - writeln(""); + writeln("\033[0m"); + + color = invert(color); } + write(" "); foreach(f; EnumMembers!File) { - writef("%s", f); + writef("%s", toChar(f)); } writeln(""); } void main(string[] args) { Board board; - write(board); + dump(board); }