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
64
Board.cpp
64
Board.cpp
|
|
@ -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];
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue