Mercurial > projects > doodle
view 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 |
line wrap: on
line source
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 } string toString(Color color, Piece piece) { string[6][2] table = [ [ "\u2654", "\u2655", "\u2656", "\u2657", "\u2658", "\u2659" ], [ "\u265A", "\u265B", "\u265C", "\u265D", "\u265E", "\u265F" ] ]; return table[color][piece]; } struct Square { this(Color color_, Piece piece_) { occupied = true; color = color_; piece = piece_; } bool occupied = false; Color color; Piece piece; } enum File { _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 { 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.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.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) ] ]; } void dump(in Board board) { Color color = Color.White; foreach_reverse(r; EnumMembers!Rank) { write(toChar(r)); foreach(f; EnumMembers!File) { if (color == Color.White) { write("\033[47m"); } else { 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("\033[0m"); color = invert(color); } write(" "); foreach(f; EnumMembers!File) { writef("%s", toChar(f)); } writeln(""); } void main(string[] args) { Board board; dump(board); }