#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: static const byte PTR_SIDE_AND_CASTLERIGHT = 0x08; //byte (1=side, 2,4=white castle, 8,16=black) // CAN FILL 0x09 static 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) static const byte PTR_ZOBRIST = 0x0C; // 4 bytes // 0x0D // 0x0E // 0x0F static const byte PTR_ENPASSANT = 0x18; static const byte PTR_REVMOV = 0x19; // free space static const byte PTR_UNMOVE_START = 0x28; static const byte PTR_UNMOVE_LAST = 0x7E; byte PTR_UNMOVE = PTR_UNMOVE_START; void next_unmove() { PTR_UNMOVE++; if(PTR_UNMOVE > PTR_UNMOVE_LAST) { panic(F("Unmove stack overflow")); } if(!(PTR_UNMOVE & 0x8)) { PTR_UNMOVE += 0x8; } } void prev_unmove() { PTR_UNMOVE--; if(PTR_UNMOVE < PTR_UNMOVE_START) { panic(F("Unmaking from empty stack")); } if(!(PTR_UNMOVE & 0x8)) { PTR_UNMOVE -= 0x8; } } void store_unmove(Unmove u) { byte *ub = (byte*) &u; for(size_t i = 0; i < sizeof(u); i++) { next_unmove(); field[PTR_UNMOVE] = ub[i]; } } Unmove read_unmove() { Unmove u; byte* ptr = (byte*) &u; for(int i = sizeof(u) - 1; i >= 0; i--) { ptr[i] = field[PTR_UNMOVE]; prev_unmove(); } return u; } }; Board::Board() { // Then, other data we need to store is assigned 0-fields. field[PTR_ZOBRIST+1] = 1; } #endif