我正在製作一個象棋遊戲並嘗試向矢量添加有效位置。我正在製作的具體作品是騎士,而根據騎士在棋盤上的位置,我已經硬編碼的一些位置不在棋盤上。我的座標系對行使用A-H,對列使用0-8。C++使用find_first_not_of(char *)去除矢量元素
我定義了有效字符(A-H和0-8)的字符數組,並且我使用find_first_not_of來標識並刪除無效的座標對。例如:
有效期:A1
無效:3 - 刪除此
問:爲什麼我的函數刪除一些座標對是無效的,不適合的模式,但不是別人?例如,使用位置A2作爲輸入,@ 4和@ 0被成功刪除。但是剩餘的可用位置是C3,C1,B4,?3,B0,?1。
如果輸入是H2,那麼F3,F1,G0,G4是可用的位置,並且J3,J1,I4,I0被成功移除,只給出期望結果的有效位置。
問題:由於刪除無效位置的方法相同,我的某些時間和其他時間的輸出正確。
父類Piece.cpp:
char Piece::valids[16] = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'0', '1', '2', '3', '4', '5', '6', '7'
};
void Piece::removeInvalids(vector<string>& v)
{
for (short i = 0; i < v.size(); i++)
{
string s = v.at(i);
size_t found = s.find_first_not_of(valids);
if (found != string::npos)
{
cout << v.at(i) << endl;
swap(v.at(i), v.back());
v.pop_back();
}
}
}
兒童類Knight.h:
vector<string> getAvailPositions(Piece **all)
{
vector<string> v;
stringstream ss;
ss << static_cast<char>(position[0] + 2)
<< static_cast<char>(position[1] + 1);
v.push_back(ss.str());
stringstream ss2;
ss2 << static_cast<char>(position[0] + 2)
<< static_cast<char>(position[1] - 1);
v.push_back(ss2.str());
stringstream ss3;
ss3 << static_cast<char>(position[0] + 1)
<< static_cast<char>(position[1] + 2);
v.push_back(ss3.str());
stringstream ss4;
ss4 << static_cast<char>(position[0] - 1)
<< static_cast<char>(position[1] + 2);
v.push_back(ss4.str());
stringstream ss5;
ss5 << static_cast<char>(position[0] + 1)
<< static_cast<char>(position[1] - 2);
v.push_back(ss5.str());
stringstream ss6;
ss6 << static_cast<char>(position[0] - 1)
<< static_cast<char>(position[1] - 2);
v.push_back(ss6.str());
stringstream ss7;
ss7 << static_cast<char>(position[0] - 2)
<< static_cast<char>(position[1] - 1);
v.push_back(ss7.str());
stringstream ss8;
ss8 << static_cast<char>(position[0] - 2)
<< static_cast<char>(position[1] + 1);
v.push_back(ss8.str());
removeInvalids(v);
return v;
}
請讓我知道是否應該做出這個帖子的任何更改爲您更好地幫助我, 謝謝。
我建議使用位置的整數座標(例如從1到8的行和從1到8的列)而不是字符。這樣,您可以輕鬆計算板外位置並更輕鬆地編碼運動。爲了輸出位置並移動到用戶,您可以將這些轉換爲A-H和1-8作爲字符串。 – Gerriet
你可以包括你的位置數組和你的valids字符串嗎?編輯:我看到'valids'現在在那裏。 –
串位置;在Piece.h中。該變量的值將始終爲A0-H7。我在編輯中添加了valids數組到OP中。 –