現在、n-パズルを C++ でコーディングしていますが、何らかの理由でボードの要素を交換することはできません。説明させてください。「ピース」クラス(クラスのいくつかのメソッド)があります:
Piece::Piece(int l, int c, int n):
line(l),
column(c),
number(n)
{
}
int Piece::getLine()
{
return line;
}
int Piece::getColumn() const
{
return column;
}
int Piece::getNumber() const
{
return number;
}
void Piece::setLine(const int new_line)
{
this -> line = new_line;
}
void Piece::setColumn(const int new_column)
{
this -> column = new_column;
}
void Piece::setNumber(const int new_number)
{
this -> number = new_number;
}
ゲームが実行される Board クラスもあります。Board は、タイプ「Piece」のベクトルのベクトルです。ボードは次のコードで作成されています。
for(size_t i = 0; i < this -> width; i++)
{
vector<Piece> row;
for(size_t j = 0; j < this -> height; j++)
{
row.push_back(Piece(i, j, ((j == this -> width - 1) && (i == this -> height - 1) ? 0 : i * this -> width + j + 1)));
}
board.push_back(row);
}
ここまでは何も問題ありません。問題は、ボードの 2 つの要素を交換したい場合です。3x3 のゲームがあるとします。次のコードを実行すると、結果が間違っています
swapPieces(board[0][0], board[1][0]);
swapPieces(board[1][0], board[2][0]);
cout << board[0][0] << "\t" << board[0][0].getLine() << endl;
パズルは正しいです:
4 2 3
7 5 6
1 8 0
しかし、board [0][0].getLine() を実行すると、出力は 1 になり、これがピースの初期位置です。何が間違っているのか本当にわかりません。誰かが私に手を差し伸べてくれたら幸いです:)
編集: swapPieces が追加されました:
void Board::swapPieces(Piece &p1, Piece &p2)
{
Piece p = p1;
p1 = p2;
p2 = p;
}