|
|
| はじめに |
|---|
| 私が最初に作った本格的なプログラムが高校生のころに作った迷路ゲームでした。 迷路の中に実際にいるような立体表示で、迷路のなかを歩き回って出口にたどりつくという単純でありがちなゲームでしたが、 迷路を作成するロジックも自分でいろいろ研究して考えたものです。 そこで、第1回はこの迷路を作るプログラムを製作しようと思います。 |
| どんな迷路をつくるか | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
図1に示すような迷路を作成します。迷路の特徴は ・全体が長方形の平面、プログラムではサイズを指定できるようにします。 ・通路と壁の幅は同じ長さ。厚さが2つ分以上の通路や壁は存在しません。 ・通路のどの地点からどの地点まででも到達するルートが1つだけあります。 言い換えれば、スタートとゴールを通路上のどの地点にも設定できます。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 迷路の作り方 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 私が自分で名付けた方法ですが、穴掘り法を使用します。
簡単に説明しますと、通路を掘り進みながら迷路を作成していきます。 具体的には以下に示す手順で作成します。
手順は非常に簡単です。本当にこれだけで迷路が作れるでしょうか。 それでは次からは実際にプログラムを作っていきます。 | ||||||||||
| プログラムの仕様 | ||||||||
|---|---|---|---|---|---|---|---|---|
|
使用する開発ツールはVC++6.0で、言語はC++を使用します。 プログラムはWindowsのコマンドラインアプリケーションとして作成します。 プログラムの簡単な仕様を表1に示します。
|
||||||||
| 入出力部分の作成 |
|---|
|
最初に、入力(引数の受け取り)と出力(迷路の表示)の機能のみを実現したプログラムを作成します。
入出力部分を最初に作るのは、結果を見ながらプログラミングが出来てデバッグに便利だからです。 実際に迷路作成を行うのは CMaze クラスで、迷路全体(マップ)のサイズを渡してオブジェクトを生成すると 同時に迷路も作成します。迷路の内容呼び出しには Get メンバ関数を位置を指定して呼び出すことによって 指定位置のキャラクタを受け取ります。迷路作成は Make メンバ関数で行っていますが、現時点では マップの初期化(壁キャラクタで全体を埋める)しか行っていないため、プログラムを実行しても 壁キャラクタだけの迷路が表示されます。 ここからは最新のソースと実行ファイルもアップしますので、興味のある方はダウロードしてください。 |
| CMaze クラスの定義 | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 既にスケルトンは出来ていますが、ここで CMaze (迷路作成)クラスに構築すべきメンバを上げてみることに します。表2がそのメンバリストです。 | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||
| CMaze クラスの実装 |
|---|
CMaze クラスの主なメンバについて解説します。
この二つの定数配列は、上下左右のマスへの相対座標を格納しています。例えば、上のマスへはX座標は変化無しでY座標は−1(Y軸は下方向を+としています)ですので aryStepX[0] = 0 aryStepY[0] = -1 となっています。 上下左右のマス判定や移動に使用します。
このメンバ関数は、穴掘り可能な方向を全てみつけて配列に設定し、見つかった数をかえします。 上下左右のマスへの相対位置を格納したテーブルを利用することにより、別々に判定することなく 繰り返し処理で全ての方向を判定することができます。 相対位置を2倍しているのは、壁の厚みを考慮して2マス先を判定するためです。 リターン値は見つかった数で、0ならば穴掘り可能な方向はないということです。
GetNextStep と同様に繰り返し処理で上下左右位置のマーカーを探しています。マーカーが複数見つかることはありえないので、見つかった時点でその方向をリターン値にして 終了します。マーカーが見つからなかった場合はリターン値が4になります。
迷路作成の本体部分です。基本的に、前述の”迷路の作り方”で説明した手順をソースコードに
しているだけなので、読み比べるとなにをしているか理解しやすいと思います。穴掘りの方向決定には乱数を使用しています。 以上でプログラムは完成です。 |
| プログラムの実行 |
|---|
|
コンソールアプリケーションなので、DOSモードまたはDOS窓で実行します。 実行例
D:\IMaze>imaze 41 15
Maze size : 41 x 15
#########################################
#.#.......#.....#.......#.......#.......#
#.#.#####.###.#.###.###.###.#.#.#.#####.#
#.#.#.....#...#.....#.#...#.#.#.#.#...#.#
#.#.#.#####.#########.###.###.#.###.#.#.#
#.#.#.#...#.....#.........#...#.....#...#
#.#.#.###.#.###.###.#######.###########.#
#...#...#.....#...#...#.....#.....#.....#
#######.###.#####.###.#.###.#####.#.#####
#.....#...#.#.....#...#.#...#.....#.#...#
###.#.###.#.#.#####.#####.###.#####.#.###
#...#.#...#.#...#...#...#.#.#...#...#...#
#.#####.#######.#.###.#.#.#.#.#.#.#####.#
#...............#.....#...#...#.........#
#########################################
|
| 最後に |
|---|
|
今回は特にバグらしいものも見つからなかったので、これで一応完成ということになります。 ただ、キャラクタ表現に多少不満が残ります。HTMLのテーブルタグで体裁を整えて表示を しようかと考え、IMaze の出力をCSV形式にしてそれをHTMLに変換するという方法を考えましたが、 いずれにしろキャラクタ表現ではそれほど期待できないでしょう。 そこでセルの色設定で迷路を表現するテーブルタグを出力するようにしました。最新のプログラムソース と実行ファイルはページ一番下の「最新バージョン」にあります。 CSVファイルをHTMLテーブルタグに変換するアイデアは捨てがたいので、次回の公開プログラミングで 取り上げることにします。 |