#ifndef __BOARD_H_INC #define __BOARD_H_INC #include "Types.h" struct Unmake { byte sq_from; byte sq_to; byte enpassant; }; class Board { public: Board(); void print() { for(char i = 7; i >= 0; i--) { for(byte j = 0; j < 16; j++) { Serial.print(field[i*16 + j], HEX); Serial.print(" "); } Serial.println(); } } unsigned long get_zobrist() { long* addr = (long*) &field[PTR_ZOBRIST]; return *addr; } byte field[128] = { W_ROOK, W_KNGT, W_BSHP, W_QUEN, W_KING, W_BSHP, W_KNGT, W_ROOK, 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, 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, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, 0, 0, 0, 0, 0, 0, 0, 0, B_ROOK, B_KNGT, B_BSHP, B_QUEN, B_KING, B_BSHP, B_KNGT, B_ROOK, 0, 0, 0, 0, 0, 0, 0, 0, }; private: const byte PTR_SIDE_AND_CASTLERIGHT = 0x08; //byte (1=side, 2,4=white castle, 8,16=black) const byte PTR_PTR_UNMAKE = 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 PTR_REVMOV = 0x19; const byte PTR_UNMAKE_START = 0x28; const byte PTR_UNMAKE_LAST = 0x7F; inline byte get_unmake() __attribute__((always_inline)) { return field[PTR_PTR_UNMAKE]; } byte next_unmake() { field[PTR_PTR_UNMAKE]++; if(get_unmake() > PTR_UNMAKE_LAST) { field[PTR_PTR_UNMAKE] = PTR_UNMAKE_START; return PTR_UNMAKE_START; } if(!(get_unmake() & 0x8)) { field[PTR_PTR_UNMAKE] += 0x8; } return get_unmake(); } byte prev_unmake() { field[PTR_PTR_UNMAKE]--; if(get_unmake() < PTR_UNMAKE_START) { field[PTR_PTR_UNMAKE] = PTR_UNMAKE_LAST; return PTR_UNMAKE_LAST; } if(!(get_unmake() & 0x8)) { field[PTR_PTR_UNMAKE] -= 0x8; } return get_unmake(); } void store_unmake(Unmake *u) { field[get_unmake()] = *(byte*)u; for(size_t i = 0; i < sizeof(u); i++) { field[next_unmake()] = *(byte*)(u+i); } } Unmake read_unmake() { Unmake u; byte* ptr = (byte*) &u; for(int i = sizeof(u) - 1; i >= 0; i++) { ptr[i] = field[prev_unmake()]; } return u; } }; Board::Board() { // Then, other data we need to store is assigned 0-fields. field[PTR_ZOBRIST+1] = 1; } #endif