aboutsummaryrefslogtreecommitdiff
path: root/src/board
diff options
context:
space:
mode:
Diffstat (limited to 'src/board')
-rw-r--r--src/board/board.cpp42
-rw-r--r--src/board/board.hpp2
2 files changed, 44 insertions, 0 deletions
diff --git a/src/board/board.cpp b/src/board/board.cpp
index 9d0ef47..3b1383a 100644
--- a/src/board/board.cpp
+++ b/src/board/board.cpp
@@ -10,6 +10,48 @@
int PositionToIndex(Position i) { return (i.rank * 8) + i.file; }
+uint16_t CreateMove(uint8_t from, uint8_t to, PieceType promotion) {
+ if (from >= 64 || to >= 64) {
+ std::cout << "expected a valid chess piece position 0-63";
+ assert(false);
+ }
+ uint16_t move = 0;
+ bool firstPromotionFlag = false;
+ bool secondPromotionFlag = false;
+ switch (promotion) {
+ case NONEPIECE:
+ case KNIGHT:
+ firstPromotionFlag = false;
+ secondPromotionFlag = false;
+ break;
+ case QUEEN:
+ firstPromotionFlag = true;
+ secondPromotionFlag = false;
+ break;
+ case ROOK:
+ firstPromotionFlag = false;
+ secondPromotionFlag = true;
+ break;
+ case BISHOP:
+ firstPromotionFlag = true;
+ secondPromotionFlag = true;
+ break;
+ default:
+ std::cout << "unexpected promotion type";
+ assert(false);
+ exit(1);
+ }
+ if (firstPromotionFlag) {
+ move |= (1 << 1);
+ }
+ if (secondPromotionFlag) {
+ move |= (1 << 0);
+ }
+ move |= (from << 2);
+ move |= (to << 8);
+ return move;
+};
+
PieceType getPromotionTypeFromMove(uint16_t move) {
bool firstFlag = (move & (1 << 1)) != 0;
bool secondFlag = (move & (1 << 0)) != 0;
diff --git a/src/board/board.hpp b/src/board/board.hpp
index 8ef3e56..b27a9d1 100644
--- a/src/board/board.hpp
+++ b/src/board/board.hpp
@@ -38,8 +38,10 @@ struct Position {
* flag F for from position T for to position, and 00 for empty ones.
*/
+uint16_t CreateMove(uint8_t from, uint8_t to, PieceType promotion = NONEPIECE);
PieceType getPromotionTypeFromMove(uint16_t move);
uint8_t getFromValueFromMove(uint16_t move);
+uint8_t getToValueFromMove(uint16_t move);
struct Move {
Position From;