changeset 128:bc4d29c7499c

Chess tinkering
author David Bryant <bagnose@gmail.com>
date Tue, 13 Dec 2011 19:18:25 +1030
parents 1da160a2c373
children 10ad5417bf07
files doodle/main/prog/chess.d
diffstat 1 files changed, 85 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- 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);
 }