FEN: more work on FEN decoding, handling field 2 and 3

This commit is contained in:
A.M. Rowsell 2025-08-29 04:16:20 -04:00
commit 76c0c3ce8b
Signed by untrusted user who does not match committer: amr
GPG key ID: E0879EDBDB0CA7B1

View file

@ -89,22 +89,17 @@ void Board::setupInitialPosition() {
return; return;
} }
int setupFromFEN(std::string strFEN) { int Board::setupFromFEN(std::string strFEN) {
std::vector<std::string> splitFEN = split(strFEN, ' '); std::vector<std::string> splitFEN = split(strFEN, ' ');
if(splitFEN.size() != 6) // a valid FEN *must* contain 6 fields if(splitFEN.size() != 6) // a valid FEN *must* contain 6 fields
return -1; return -1;
// ====== START OF FIELD 1 ======
std::vector<std::string> splitField1 = split(splitFEN[0], '/'); std::vector<std::string> splitField1 = split(splitFEN[0], '/');
int rank = 0, file = 0; int rank = 0, file = 0;
int skip = 0; int skip = 0;
bool wKingPlaced = false, bKingPlaced = false; bool wKingPlaced = false, bKingPlaced = false;
for(auto &ranks : splitField1) { for(auto &ranks : splitField1) {
for(auto &sym : ranks) { for(auto &sym : ranks) {
if(skip) {
boardGrid[rank][file] = nullptr; // remove reference
skip--;
file++;
continue;
}
switch(sym) { switch(sym) {
case 'R': case 'R':
// white rook // white rook
@ -173,17 +168,62 @@ int setupFromFEN(std::string strFEN) {
case '5': case '5':
case '6': case '6':
case '7': case '7':
case '8': case '8': {
case '9': std::string skipStr(1, sym);
skip = atoi(sym); skip = atoi(skipStr.c_str());
skip--; // fix off by 1 error
do {
boardGrid[rank][file] = nullptr; // remove reference
file = (file < 8) ? file + 1 : 0;
} while(--skip);
break; break;
}
default: default:
// invalid character? // invalid character?
return -1; return -1;
break;
} }
file++; file++;
if(file > 7) {
file = 0;
break;
}
} }
rank++; rank++;
if(rank > 7)
break;
}
// ======= END OF FIELD 1 ======
// ======= START OF FIELD 2 ======
std::string w = "w";
std::string b = "b";
if(splitFEN[1] == w)
playerTurn = PL_WHITE;
else if(splitFEN[1] == b)
playerTurn = PL_BLACK;
else {
// invalid FEN
return -1;
}
// ====== END OF FIELD 2 ======
// ====== START OF FIELD 3 ======
std::string k = "k", K = "K", q = "q", Q = "Q";
if(splitFEN[2] == "-") {
// nobody can castle, either side
// locate Kings and set appropriate variables
// canCastleKS, canCastleQS
}
if(splitFEN[2].find(k) != std::string::npos) {
// black king can castle kingside
}
if(splitFEN[2].find(K) != std::string::npos) {
// white king can castle kingside
}
if(splitFEN[2].find(q) != std::string::npos) {
// black king can castle queenside
}
if(splitFEN[2].find(Q) != std::string::npos) {
// white king can castle queenside
} }
return 0; return 0;
} }
@ -199,3 +239,7 @@ void Board::deserializeBoard(uint64_t incomingBoard) {
// how do we then figure out what has moved? // how do we then figure out what has moved?
return; return;
} }
std::unique_ptr<Piece> &Board::getPieceAt(Square square) {
return boardGrid[square.rank][square.file];
}