私は小さな迷路ジェネレータを作成してC++を学ぼうとしています。これを容易にするために、Cell()のリストをxとyの値とともにMaze()のベクトルの中に格納します(完全性のためにいくつかの他の情報が含まれていますが、ベクトルを反復すると同じオブジェクトが返される
セルはベクトルに格納され、セルのXとYの値が決定され、セルが作成されるごとに渡されます。
問題は、各セルに同じx値とy値が設定されているように見えることです。
vector<Cell*> Maze::cells;
int Maze::width;
int Maze::height;
Maze::Maze(int w, int h)
{
/* Set width and height */
width = w;
height = h;
/* These variables keep track of our position in the maze as we generate it */
int scan_w = 0;
int scan_h = 0;
/* Continue looping until we've visited all cells */
/* Offset by one because the width starts at 1 while the scan is zero-based */
for (int i = 0; i <= (width * height); i++)
{
cells.push_back(new Cell(scan_w,scan_h));
cout << scan_w << "/" << scan_h << endl;
scan_w = (i % w);
if (scan_w == 0)
{
scan_h++;
}
}
for(int i = 0; i <= cells.size(); i++)
{
cout << "[" << cells[i]->x << ", " << cells[i]->y << "] " << &cells[i] << endl;
}
}
編集:ここではセルクラスの要部である
int Cell::x;
int Cell::y;
Cell::Cell(int location_x, int location_y)
{
x = location_x;
y = location_y;
}
このコード(簡潔にするために切り捨て)の出力である:
ここは、関連するコードであります
Maze maze = Maze(50, 25);
0/0
0/1
1/1
2/1
3/1
4/1
5/1
6/1
7/1
8/1
9/1
...
40/25
41/25
42/25
43/25
44/25
45/25
46/25
47/25
48/25
49/25
[49, 25] 0x632f30
[49, 25] 0x632f38
[49, 25] 0x632f40
[49, 25] 0x632f48
[49, 25] 0x632f50
[49, 25] 0x632f58
[49, 25] 0x632f60
[49, 25] 0x632f68
...
私の前提です:
- 出力に基づいて、scan_wとscan_hが意図したとおりにインクリメントされています(左から右、上から下へテーブルを読み取った場合と同様)。
- フロー制御のドキュメント/チュートリアルに基づいて、私の理解は、最初のforループがセルの1つの要素から次のものへ適切に移動していることです。
- documentation for vector's push_back memberに基づいて、私は、新しく作成された各セルへの参照をベクターに適切に挿入していると仮定しています。
- documentation for the [] operator for vectorsに基づいて、私はセル[0]とセル[1]にアクセスすると、私は別のオブジェクトにアクセスすることになります(これは上記のようにオブジェクトのアドレスを印刷することによって確認されます)。
私は、なぜ特定のセルがscan_wとscan_hとの位置合わせでインクリメントされるはずである場合、各セルのxとyの値がそれぞれ49と25であるのか理解できていません。
最後には、ここで私はと考え、物事のカップルです:
- ザ・ループのためには、(オブジェクトのアドレスを印刷して反証)同じオブジェクトを読み込むことができます。
- これは範囲の問題かもしれません。私はPythonに慣れているので、私の前提はスコープが同じように機能することですが、正確かどうかを知るにはC++に精通していません。
- これは、ベクトルの操作方法と関係があります([]演算子のドキュメントによって多かれ少なかれ不具合が生じます)。
- 出力が誤っている可能性があります。または、scan_インクリメントコードがバグかもしれません。これは最も可能性の高いシナリオですが、私はまだ何かを見つけることができませんでした。おそらく短い休憩と新鮮な目はここで何かを明らかにするかもしれない。
Cellクラスのコードがありません。 – koalo
他のものは別として、<=演算子は<演算子である必要があります。 –
@koaloおっとり - 追加されました! – Exsomet