FEN: more work on FEN decoding, handling field 2 and 3
This commit is contained in:
parent
22fe7bdf0b
commit
76c0c3ce8b
1 changed files with 55 additions and 11 deletions
66
Board.cpp
66
Board.cpp
|
|
@ -89,22 +89,17 @@ void Board::setupInitialPosition() {
|
|||
return;
|
||||
}
|
||||
|
||||
int setupFromFEN(std::string strFEN) {
|
||||
int Board::setupFromFEN(std::string 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;
|
||||
// ====== START OF FIELD 1 ======
|
||||
std::vector<std::string> splitField1 = split(splitFEN[0], '/');
|
||||
int rank = 0, file = 0;
|
||||
int skip = 0;
|
||||
bool wKingPlaced = false, bKingPlaced = false;
|
||||
for(auto &ranks : splitField1) {
|
||||
for(auto &sym : ranks) {
|
||||
if(skip) {
|
||||
boardGrid[rank][file] = nullptr; // remove reference
|
||||
skip--;
|
||||
file++;
|
||||
continue;
|
||||
}
|
||||
switch(sym) {
|
||||
case 'R':
|
||||
// white rook
|
||||
|
|
@ -173,17 +168,62 @@ int setupFromFEN(std::string strFEN) {
|
|||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
skip = atoi(sym);
|
||||
case '8': {
|
||||
std::string skipStr(1, 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;
|
||||
}
|
||||
default:
|
||||
// invalid character?
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
file++;
|
||||
if(file > 7) {
|
||||
file = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
|
@ -199,3 +239,7 @@ void Board::deserializeBoard(uint64_t incomingBoard) {
|
|||
// how do we then figure out what has moved?
|
||||
return;
|
||||
}
|
||||
|
||||
std::unique_ptr<Piece> &Board::getPieceAt(Square square) {
|
||||
return boardGrid[square.rank][square.file];
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue