view 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 source

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);
}