ArduChess/ArduChess.ino

152 lines
2.7 KiB
C++

#pragma GCC optimize ("-O3")
#include <Arduino.h>
#include "Config.h"
#include "Board.h"
#include "Move.h"
#include "Movegen.h"
#include "Types.h"
unsigned int pseudo_perft(byte depth) {
// only checks pseudolegality
// but, it should work overall
if(depth == 0) return 1;
Serial.print(F("Start a PERFT "));
Serial.print(depth);
Serial.println('-');
print();
unsigned int move_count = 0;
Movegen gen;
Move m;
do {
m = gen.next_move();
//make(m);
move_count += pseudo_perft(depth-1);
//unmake();
} while (m.sq_from != 255);
return move_count - 1;
}
void perft_test() {
for(byte i = 0; i < 2; i++) {
Serial.print(F("Perft "));
Serial.print(i);
Serial.print(F(": "));
Serial.println(pseudo_perft(i));
}
}
void debug_movegen() {
Movegen gen = Movegen();
Move m;
do {
DEBUG("start movegen");
m = gen.next_move();
Serial.print(F("FROM "));
Serial.print(m.sq_from, HEX);
Serial.print(F(" TO "));
Serial.print(m.sq_to, HEX);
Serial.print(F(" PROMOTE "));
Serial.println(m.pc_prom);
if(m.sq_from != 255) {
DEBUG("make");
make(m);
print();
DEBUG("unmake");
unmake();
DEBUG("unmake done");
}
} while (m.sq_from != 255);
}
void debug_castle() {
print();
make({0x06, 0x25, P_EMPTY}); print();
make({0x76, 0x55, P_EMPTY}); print();
make({0x16, 0x26, P_EMPTY}); print();
make({0x63, 0x43, P_EMPTY}); print();
make({0x05, 0x16, P_EMPTY}); print();
make({0x62, 0x42, P_EMPTY}); print();
make({0x04, 0x06, P_EMPTY}); print();
unmake(); print();
unmake(); print();
unmake(); print();
unmake(); print();
unmake(); print();
unmake(); print();
unmake(); print();
}
void debug_ep() {
print();
make({0x14, 0x34, P_EMPTY});
print();
make({0x64, 0x54, P_EMPTY});
print();
make({0x34, 0x44, P_EMPTY});
print();
make({0x63, 0x43, P_EMPTY});
print();
make({0x44, 0x53, P_EMPTY});
print();
unmake();
print();
unmake();
print();
unmake();
print();
unmake();
print();
unmake();
print();
}
void bench() {
int startTime = micros();
make({0x14, 0x34, P_EMPTY});
make({0x64, 0x54, P_EMPTY});
make({0x34, 0x44, P_EMPTY});
make({0x63, 0x43, P_EMPTY});
make({0x44, 0x53, P_EMPTY});
unmake();
unmake();
unmake();
unmake();
unmake();
make({0x06, 0x25, P_EMPTY});
make({0x76, 0x55, P_EMPTY});
make({0x16, 0x26, P_EMPTY});
make({0x63, 0x43, P_EMPTY});
make({0x05, 0x16, P_EMPTY});
make({0x62, 0x42, P_EMPTY});
make({0x04, 0x06, P_EMPTY});
unmake();
unmake();
unmake();
unmake();
unmake();
unmake();
unmake();
int elapsed = micros() - startTime;
Serial.print(elapsed);
Serial.println(F(" microseconds"));
}
void setup() {
// put your setup code here, to run once:
board_init();
Serial.begin(115200);
bench();
}
void loop() {
// put your main code here, to run repeatedly:
}