Я кодирую клетчатую настольную игру, в которой доска представляет собой двумерный вектор, в котором содержится объект Square
, а Square
содержит Piece
.Используя вложенный цикл for, я инициализирую новый объект Square
в каждом слоте в векторе 8x8 - но когда я добавляю Piece
к одному Square
, он добавляет Piece
к каждому отдельному Square
.Я думаю, что, так или иначе, каждый слот в векторе указывает только на один Square
, хотя я каждый раз инициализирую новый Square
.
Я пробовал это с двумернымвектор объектов Square
, а также вектор Square
указателей.В настоящее время я использую вектор указателей: vector<vector<Square*>> _board;
// initializing an empty board
_board = {{},{},{},{},{},{},{},{}};
// adding a new Square to each of the 8x8 slots
string colorAlternator = WHITE;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
_board[i].push_back(new Square(colorAlternator, make_tuple(i,j)));
if (colorAlternator == WHITE) {
colorAlternator = BLACK;
} else {
colorAlternator = WHITE;
}
}
}
// placing a piece
/* placePiece() is a function of Square
* (p2Pieces.at(0) is a piece being pulled from elsewhere)
*/
_board[0][1]->placePiece(*p2Pieces.at(0));
В другой функции, называемой view()
, она выводит визуализацию платы (извините, моя не элегантная реализация, она будет исправлена с помощьюв ближайшее время цикл for!):
for (int i = 7; i >= 0; i--)
{
cout << BORDER << endl;
cout << i + 1 << " " << "| "
<< board[i][0]->displayToken() << " | "
<< board[i][1]->displayToken() << " | "
<< board[i][2]->displayToken() << " | "
<< board[i][3]->displayToken() << " | "
<< board[i][4]->displayToken() << " | "
<< board[i][5]->displayToken() << " | "
<< board[i][6]->displayToken() << " | "
<< board[i][7]->displayToken() << " | " << i + 1 << endl;
}
Это должно печатать каждые Square
как пустые, за исключением того, который я поместил в Piece
- но он печатает каждый Square
как содержащийPiece
Я только что добавил.
Есть идеи, что заставляет каждый слот в векторе связываться с одним и тем же Square
?(Или это даже то, что происходит?)
обновление: вот реализация для placePiece()
, displayToken()
и поддерживающий метод containsPiece()
в классе Square
:
Piece* _piece;
void Square::placePiece(Piece &piece) {
_piece = &piece;
}
bool Square::containsPiece() {
return _piece != nullptr;
}
string Square::displayToken() {
string displayStr = " ";
if (containsPiece()) {
displayStr = _piece->getToken();
}
return displayStr;
}