所以我正在閱讀一個 .txt 檔案,其中包含許多國際象棋動作。我能夠從檔案中讀取資料并將該行插入到字串中。
一個單一的國際象棋移動示例如下所示:
1. e4 e5
我撰寫了以下函式來決議單個棋步:
void parseSingleChessMove(string move)
{
this->moveNumber = stoi(move.substr(0, move.find(".")));
this->move[0] = move.substr(move.find_first_of(" ") 1, move.find_last_of(" ")-move.find_first_of(" ")-1);
this->move[1] = move.substr(move.find_last_of(" ") 1);
}
我正在決議字串并將其存盤在自定義的移動類中,因此使用了“this”運算子。此功能完美運行并存盤單個國際象棋移動的每個領域。move[0] 存盤第一個移動,而 move[1] 存盤第二個移動,而 moveNumber 資料成員存盤移動的數字。
我正在創建一個 Move 類的陣列,以便按順序存盤國際象棋比賽的每一個移動。然而,一套完整的國際象棋走法可能如下所示:
1. Nf3 Nf6 2. c4 c6 3. g3 g6 4. b3 Bg7 5. Bb2 O-O 6. Bg2 d5 7. O-O Bf5 8. d3
Nbd7 9. Nd4 e6 10. h3 h5
我很難弄清楚如何從一系列國際象棋移動中將這些單獨的移動存盤在移動類陣列中。
主要問題是僅在找到移動編號之前讀取字串。然后我需要獲取一個移動子串(類似于4. b3 Bg7然后使用上述函式決議這個單一的國際象棋移動,以便我可以存盤 moveNumber=4, move[0]="b3" 和 move[1]="Bg7"最后將其存盤到陣列型別 Move Class 的相應索引中。然后重復此操作,直到所有移動都被一一存盤,我們到達字串的末尾。
編輯:這是我的類定義:
class MoveNode {
public:
array<string, 2> move;
int moveNumber;
void parseSingleChessMove(string move)
{
this->moveNumber = stoi(move.substr(0, move.find(".")));
this->move[0] = move.substr(move.find_first_of(" ") 1, move.find_last_of(" ")-move.find_first_of(" ")-1);
this->move[1] = move.substr(move.find_last_of(" ") 1);
}
}
我將所有的動作存盤在這個陣列中:
MoveNode *setofMoves = new MoveNode[totalMoves];
uj5u.com熱心網友回復:
您可以為此使用正則運算式:
- 重復搜索的模式是:
(\d )\.一個或多個數字(我們將要捕獲),后跟一個點;然后是\s ([^\s] )一個或多個空格,然后是一個或多個非空格(我們捕獲后者);我們重復這個模式兩次,每次移動一次;最后(:?\s |$),一個或多個空格 (\s) 或 (|) 是運算式( ) 的結尾,$因為輸入行可能以第二次移動結束,而我們不捕獲這一組(:?)。
我們使用std::regex來存盤模式,將其全部包裝在 中R"()",以便我們可以撰寫原始運算式。 - 該
while回圈做了幾件事情:它會搜索與下一場比賽regex_search,提取捕獲組(移動號碼,移動0和1移動),并更新輸入線,以便在下次搜索將開始在當前一個結束。matches是一個陣列,其第一個元素matches[0]是line匹配整個模式的部分,接下來的元素對應于模式的捕獲組。
[演示]
#include <iostream> // cout
#include <regex> // regex_search, smatch
int main() {
std::string line{"1. Nf3 Nf6 2. c4 c6 3. g3 g6 4. b3 Bg7 5. Bb2 O-O 6. Bg2 d5 7. O-O Bf5 8. d3 Nbd7 9. Nd4 e6 10. h3 h5"};
std::regex pattern{R"((\d )\.\s ([^\s] )\s ([^\s] )(:?\s |$))"};
std::smatch matches{};
while (std::regex_search(line, matches, pattern))
{
std::cout
<< "moveNum=" << matches[1] << ", "
<< "move[0]=" << matches[2] << ", "
<< "move[1]=" << matches[3] << "\n";
line = matches.suffix();
}
}
// Outputs:
// moveNum=1, move[0]=Nf3, move[1]=Nf6
// moveNum=2, move[0]=c4, move[1]=c6
// moveNum=3, move[0]=g3, move[1]=g6
// moveNum=4, move[0]=b3, move[1]=Bg7
// moveNum=5, move[0]=Bb2, move[1]=O-O
// moveNum=6, move[0]=Bg2, move[1]=d5
// moveNum=7, move[0]=O-O, move[1]=Bf5
// moveNum=8, move[0]=d3, move[1]=Nbd7
// moveNum=9, move[0]=Nd4, move[1]=e6
// moveNum=10, move[0]=h3, move[1]=h5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/395887.html
下一篇:沒有標簽的antlr4節點
