Mercurial > projects > doodle
diff doodle/main/prog/chess.d @ 127:1da160a2c373
Chess checkpoint
author | David Bryant <bagnose@gmail.com> |
---|---|
date | Mon, 12 Dec 2011 18:03:07 +1030 |
parents | |
children | bc4d29c7499c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doodle/main/prog/chess.d Mon Dec 12 18:03:07 2011 +1030 @@ -0,0 +1,96 @@ +import std.stdio; +import std.traits; + +enum Piece { + King, Queen, Rook, Bishop, Knight, Pawn +} + +enum Color { + White, Black +} + +string unicode(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 +} + +enum Rank { + _1, _2, _3, _4, _5, _6, _7, _8 +} + +struct Board { + Square opCall(File f, Rank r) const { + return squares[f][r]; + } + +private: + 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) ] + /* + [ 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[2][1] s = [ [ Square(), Square() ] ]; + +void write(in Board board) { + foreach_reverse (r; EnumMembers!Rank) { + writef("%s ", r); + foreach(f; EnumMembers!File) { + Square square = board(f, r); + if (square.occupied) { + writef("%s", unicode(square.color, square.piece)); + } + else { + writef(" "); + } + } + writeln(""); + } + + foreach(f; EnumMembers!File) { + writef("%s", f); + } + writeln(""); +} + +void main(string[] args) { + Board board; + write(board); +}