#ifndef __BOARD_H_INC #define __BOARD_H_INC #include "Types.h" class Board { public: Board(); unsigned long get_zobrist() { long* addr = (long*) &field[PTR_ZOBRIST]; return *addr; } private: byte field[128] = { B_ROOK, B_KNGT, B_BSHP, B_QUEN, B_KING, B_BSHP, B_KNGT, B_ROOK, 0, 0, 0, 0, 0, 0, 0, 0, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, W_PAWN, W_PAWN, W_PAWN, W_PAWN, W_PAWN, W_PAWN, W_PAWN, W_PAWN, 0, 0, 0, 0, 0, 0, 0, 0, W_ROOK, W_KNGT, W_BSHP, W_QUEN, W_KING, W_BSHP, W_KNGT, W_ROOK, 0, 0, 0, 0, 0, 0, 0, 0, }; const byte PTR_SIDE_AND_CASTLERIGHT = 0x08; //byte (1=side, 2,4=white castle, 8,16=black) const byte PTR_PTR_REVMOV = 0x09; //byte (points to index) const byte PTR_W_KING = 0x0A; // byte (points to index or maybe 64-arr index) // const byte PTR_B_KING = 0x0B; (PTR_W_KING | COLOR or PTR_W_KING + COLOR) const byte PTR_ZOBRIST = 0x0C; // 4 bytes // 0x0D // 0x0E // 0x0F const byte PTR_ENPASSANT = 0x18; const byte UNMAKE_START = 0x1A; inline byte get_unmake() __attribute__((always_inline)) { return field[PTR_PTR_REVMOV]; } byte next_unmake() { field[PTR_PTR_REVMOV]++; if(get_unmake() >= 0x80) { field[PTR_PTR_REVMOV] = UNMAKE_START; return UNMAKE_START; } while(get_unmake() & 0x88) { field[PTR_PTR_REVMOV]++; } return get_unmake(); } byte prev_unmake() { field[PTR_PTR_REVMOV]--; if(get_unmake() < UNMAKE_START) { field[PTR_PTR_REVMOV] = 0x7F; return 0x7F; } while(get_unmake() & 0x88) { field[PTR_PTR_REVMOV]--; } return get_unmake(); } }; Board::Board() { // Then, other data we need to store is assigned 0-fields. field[PTR_ZOBRIST+1] = 1; } struct unmake { byte sq_from; byte sq_to; byte enpassant; #endif