57 lines
2.0 KiB
C++
57 lines
2.0 KiB
C++
#include <vector>
|
|
#include <Rcpp.h>
|
|
|
|
#include "SchachHoernchen/Board.h"
|
|
|
|
//' Given a FEN (position) determines if its whites turn
|
|
// [[Rcpp::export(rng = false)]]
|
|
Rcpp::LogicalVector isWhiteTurn(const std::vector<Board>& positions) {
|
|
// Iterate all positions and call the static board evaluation
|
|
return Rcpp::LogicalVector(positions.begin(), positions.end(),
|
|
[](const Board& pos) { return pos.isWhiteTurn(); }
|
|
);
|
|
}
|
|
|
|
//' Check if current side to move is in check
|
|
// [[Rcpp::export(rng = false)]]
|
|
Rcpp::LogicalVector isCheck(const std::vector<Board>& positions) {
|
|
return Rcpp::LogicalVector(positions.begin(), positions.end(),
|
|
[](const Board& pos) { return pos.isCheck(); }
|
|
);
|
|
}
|
|
|
|
//' Check if the current position is a quiet position (no piece is attacked)
|
|
// [[Rcpp::export(rng = false)]]
|
|
Rcpp::LogicalVector isQuiet(const std::vector<Board>& positions) {
|
|
return Rcpp::LogicalVector(positions.begin(), positions.end(),
|
|
[](const Board& pos) { return pos.isQuiet(); }
|
|
);
|
|
}
|
|
|
|
//' Check if position is terminal
|
|
//'
|
|
//' Checks if the position is a terminal position, meaning if the game ended
|
|
//' by mate, stale mate or the 50 modes rule. Three-Fold repetition is NOT
|
|
//' checked, therefore a seperate game history is required which the board
|
|
//' does NOT track.
|
|
//'
|
|
// [[Rcpp::export(rng = false)]]
|
|
Rcpp::LogicalVector isTerminal(const std::vector<Board>& positions) {
|
|
return Rcpp::LogicalVector(positions.begin(), positions.end(),
|
|
[](const Board& pos) { return pos.isTerminal(); }
|
|
);
|
|
}
|
|
|
|
//' Check if checkmate is possible by material on the board
|
|
//'
|
|
//' Checks if there is sufficient mating material on the board, meaning if it
|
|
//' possible for any side to deliver a check mate. More specifically, it
|
|
//' checks if the pieces on the board are KK, KNK or KBK.
|
|
//'
|
|
// [[Rcpp::export(rng = false)]]
|
|
Rcpp::LogicalVector isInsufficient(const std::vector<Board>& positions) {
|
|
return Rcpp::LogicalVector(positions.begin(), positions.end(),
|
|
[](const Board& pos) { return pos.isInsufficient(); }
|
|
);
|
|
}
|