0

現在、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;
}
4

3 に答える 3

3

コードベースには、ピースの位置を表す2つの方法があります。1つはPieceオブジェクト内の「line」変数と「column」変数であり、もう1つはボードおよびVector行コンテナー内のPieceオブジェクトの順序付けです。プログラミングの基本原則はDRY(Do n't Repeat Yourself)です。あなたが今遭遇しているのと同じように、それはエラーにつながります。swapPiecesは、コンテナー内のオブジェクトをスワップしている可能性がありますが、オブジェクト変数を更新していない可能性があります。2つの表現を一貫させる(行変数と列変数を設定する)ことで、swapPiecesコードでこれにパッチを当てることができますが、長期的には、2つのうちどちらが冗長であるかを判断する方がクリーンです。

于 2013-03-18T17:57:11.380 に答える
0

はうまくいくswapPiecesようですが、あなたも電話setLineしてsetColumn、ピースが動かされたことを知らない限り。現在、これらのピースには、コンストラクターで設定された元の位置が含まれています。

于 2013-03-18T17:56:46.327 に答える
0

まず、コピーc'torが実際に呼び出されていることを確認します(実装は確認していません)。次に、board [0] [0]を取得するときは、実際のオブジェクトを取得し、そのコピーを取得しないようにしてください。

于 2013-03-18T18:10:39.567 に答える