4

C++でランダム迷路を作ろうとしているのですが、グリッドやセルの作り方がわからないので始められません。どうすれば作成できますか?また、ASCII 文字を使用して作成したいと考えています。どうすれば配列に格納できますか? (誰でもサンプルコードといくつかの説明を提供して、よりよく理解できるようにすることができます)

別の質問: どのようなデータ構造を学習して使用する必要がありますか? エラーのアルゴリズムまたはクラスカルのアルゴリズムを使用する予定です。

私を助けてくれてありがとう!私は初心者のプログラマーで、これについて学びたいと思っています。これは私のプロジェクトの一部であるためです。

4

3 に答える 3

7

迷路生成アルゴリズムをお探しですか(もっと)? 問題はアルゴリズムですか、それともグラフィックですか?

典型的なアルゴリズムは、迷路内の各「セル」をグラフの頂点と見なし、すべての「壁」から始めて、スパニング ツリーに対応する一連の壁を削除することによって機能します。(したがって、ランダム化するために、それらの多くはランダムな重みで開始し、最小のスパニング ツリーを見つけます。) 少なくとも小さな迷路の場合、セルを表すために特別なデータ構造は必要ありません。(x,y)各セルをペア(その座標)と考えることができます。また、グラフのエッジを格納するためのデータ構造 (隣接行列/隣接リスト)も必要(x,y)ありません。(x,y±1)(x±1,y)

いずれにせよ、スパニング ツリーがあれば、どの壁が「存在」し、どの壁が存在しないかが正確にわかり、迷路の完全な説明が得られます。迷路を描くつもりなら、どの迷路を描くべきかはわかっています。

ASCII 文字で描画するには、各行を 1 つずつ通過するだけです。「上部の壁」を描画し (--壁が と の間(x,y)にある場合は " "(x,y+1)を配置)、実際の行を描画します (|壁が と の間(x,y)にある場合は " " を配置します)。(x+1,y)存在します)。最後に下の境界を描きます。

于 2008-12-28T19:56:16.610 に答える
2

おそらく、迷路を 2 次元の char 配列に格納したいと思うでしょう。C++ では、配列を初期化するかどうかに関係なく宣言できます。

char a[30][10];  // declares a char array of 30 rows and 10 columns.

// declare an array with 3 rows and 3 columns, and provide initial values
char ticTacToeBoard[3][3] = {{'x', 'x', 'o'},
                             {'o', 'o', 'x'},
                             {'x', 'o', ' '}
                            };

迷路の壁と壁'|'の初期値を変更し、通路にスペース文字 を使用できます。どちらの初期化方法でも機能しますが、常に同じ方法で要素を使用します。上記の初期化された配列でボードをクリアする方法は次のとおりです。'-'' '

// clear the board
for (int row=0; row<3; row++) {
    for (int col=0; col<3; col++) {
        ticTacToeBoard[row][col] = ' ';
    }
}

要素の値を読み取りたい場合 (迷路をナビゲートしようとしている場合に役立ちます)、その値を設定するときと同じ添字表記を使用します。

char y = a[2][2]; // reads the character in row 2, column 2
于 2008-12-28T22:51:54.150 に答える
0

垂直壁: | 水平。壁: _

等幅フォントを使用している場合:

 _____
| |  _
|_  | |
 __ | |
|_____|

何をすべきか正確にはわかりませんが、ここから始めます。

始点と終点がグリッド上のどこにあるかを決定します。次に、任意の波線を使用して単一のパスを作成します。基本的には、このパスが最後に到達する方法がまだあることを毎回確認しながら、ランダムに移動する必要があります。次に、このパスから一定量の壁を取り除き、これらの穴から別のパスを作成します。空きスペースがなくなるまでこれを続けます。次に、おそらく、より短いパスが作成されていないことを確認します。持っている場合は、それらをブロックします。

于 2008-12-28T20:01:30.077 に答える