Start properly implementing make and unmake

This commit is contained in:
Quinten Kock 2020-06-16 00:58:19 +02:00
parent 3e2fca227b
commit 9389b5e5e9
2 changed files with 62 additions and 15 deletions

View File

@ -17,9 +17,6 @@ void setup() {
value = Serial.read();
b.field[0x32] = char_to_piece(value);
Move m = {0x14, 0x34, P_EMPTY};
b.make(m);
}
void loop() {
@ -27,8 +24,16 @@ void loop() {
Serial.println(F("hello"));
delay(1000);
Serial.println(b.get_zobrist());
b.print();
Serial.println(sizeof(b));
Move m = {0x14, 0x34, P_EMPTY};
Serial.println(F("Initial board"));
b.print();
b.make(m);
Serial.println(F("Board after e2e4"));
b.print();
b.unmake();
Serial.println(F("Board after unmake"));
b.print();
delay(1000);
}

64
Board.h
View File

@ -8,6 +8,7 @@
struct Unmove {
byte sq_from;
byte sq_to;
byte captured;
byte enpassant;
};
@ -16,10 +17,14 @@ class Board {
Board();
void make(Move m);
void unmove();
void unmake();
void print();
bool black_moving() {
return field[PTR_SIDE_AND_CASTLERIGHT] & 0x1;
}
unsigned long get_zobrist() {
long* addr = (long*) &field[PTR_ZOBRIST];
return *addr;
@ -36,7 +41,14 @@ class Board {
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:
// Private function defs
void next_unmove();
void prev_unmove();
void store_unmove(Unmove u);
Unmove read_unmove();
// 0x88-fill definitions
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)
@ -51,14 +63,9 @@ class Board {
// free space
static const byte PTR_UNMOVE_START = 0x28;
static const byte PTR_UNMOVE_LAST = 0x7E;
static const byte PTR_UNMOVE_LAST = 0x7F;
byte PTR_UNMOVE = PTR_UNMOVE_START;
void next_unmove();
void prev_unmove();
void store_unmove(Unmove u);
Unmove read_unmove();
};
@ -77,11 +84,47 @@ void Board::print() {
Serial.println();
}
}
void Board::make(Move m) {
Unmove u = Unmove {0xAA, 0xBB, 0xCC};
Unmove u;
u.captured = field[m.sq_to];
u.sq_from = m.sq_from;
u.sq_to = m.sq_to;
byte new_val = m.pc_prom & 0b1111;
if(new_val != P_EMPTY) {
u.sq_to |= 0x80;
} else {
new_val = field[m.sq_from];
}
field[m.sq_to] = field[m.sq_from];
field[m.sq_from] = P_EMPTY;
// TODO handle castling
// TODO handle castling rights
// TODO handle revmov clock
// TODO handle enpassant
field[PTR_SIDE_AND_CASTLERIGHT] ^= 0x01;
store_unmove(u);
Unmove u2 = read_unmove();
Serial.println(u2.sq_to, HEX);
}
void Board::unmake() {
field[PTR_SIDE_AND_CASTLERIGHT] ^= 0x01;
Unmove u = read_unmove();
if((u.sq_to & 0x80) == 0) {
// regular move
field[u.sq_from] = field[u.sq_to];
} else {
// piece was promoted
// so the source is a pawn
field[u.sq_from] = W_PAWN | black_moving() << 3;
}
field[u.sq_to] = u.captured & 0b1111;
}
void Board::next_unmove() {
@ -102,7 +145,6 @@ void Board::prev_unmove() {
PTR_UNMOVE -= 0x8;
}
}
void Board::store_unmove(Unmove u) {
byte *ub = (byte*) &u;
for(size_t i = 0; i < sizeof(u); i++) {