第13回 考える楽しさ、習う楽しさ「2.迷路を作ろう まずは下準備など」

13−2 迷路を作ろう まずは下準備など

一言に迷路といっても、いろいろなパターンがありますが、今回は、こんな迷路を作ろうと思います。

    

縦、横がそれぞれ外壁を含めて25x25ブロックで、目安として左上をスタートとして右下のゴールに向かって進むような迷路です。
別段、正解がいくつあっても構わない、という大らかな気持ちで作りましょう。

さて、実際のプログラムの流れとしては、

    「変数などを準備する」
    「迷路のデータを作成する」
    「迷路を描画する」

このような3つの手順が考えられますが、できるだけ、見た目で迷路ができる様子がわかるように、次の手順で作ってみました。

    「変数などを準備する」
    「迷路のデータを作りながら描画する」

少なくとも、迷路が「成長する」様子を眺めたほうが楽しいですから、このように楽しみながら試すのも、必要ですね(笑)

次に、もう少し具体的な話ですが、迷路のデータは maze(x,y) (x=1〜25、y=1〜25)という2次元の配列変数を使うことにしましょう。
それぞれの意味ですが、

    maze(i,j)=0  :何もない
    maze(i,j)=1  :ブロック
    maze(i,j)=2  :外壁

としておきます。
25x25ブロックの迷路ですから、Palmの画面を考えると、1ブロックが5x5ピクセル程度なら、全体が125x125ピクセルになり、十分に収まりそうです。
左上の横位置は、160-125 = 35、この半分で 17、上位置は同様に 160-125 = 35で、上のタイトルバーを考慮して、下に5ピクセルくらい空けて 30としておきましょう。
そうすると、maze(i,j)の位置のブロックは、四角く塗りつぶすコマンド FillRectangle を使って、

    FillRectangle (i-1) * 5 + 17, (j-1) * 5 + 30, 5, 5, 0, nsbNormal

このように表せます。
壁があるところが maze(i,j)=1 ですから、ブロックを描く部分とセットにしてサブルーチン化しておくのが便利そうですね。
そこで、迷路を考える前に、予め、必要と思われる部分をサブルーチン化しておくことにしましょう。
新しいモジュールを1つ追加して、そこに次のようなコードを書いておきます。

    Sub Put_Block(Qx as Integer, Qy as Integer)

        maze(Qx,Qy)=1
FillRectangle (Qx-1) * 5 + 17, (Qy-1) * 5 + 30, 5, 5, 0, nsbNormal End Sub

これで、プログラム中から、

	Call Put_Block(15,15)

とするだけで、(15,15)の位置にブロックが描かれ、maze(15,15)には、1 が代入されます。
ただ、配列変数maze(i,j)は、このサブルーチン内でも参照しますから、この配列変数はグローバル変数として定義しなければなりません。
そこで、スタートアップに

    Sub Project_Startup()
    
        Global maze(25,25) as Integer
    
    End Sub

と忘れずに入れておきましょう。

ブロックを置く処理の他には、初期設定もサブルーチン化しておきましょう。
まず、迷路の外壁は、どの場合でも存在しますから、これは、最初から描いてあっても問題ないですね。
ということで、1コマずつ使って描くより、大きな四角を描いて、中を白四角で消すというやり方で、外壁を一気に描いてみました。
ちなみに、1つ1つ描いていたら、遅くて大変だったという裏話も付け加えておきます。

    Sub init_Maze()

        Dim i as Integer
        Dim j as Integer
    
        FillRectangle 17,30,125,125,0,nsbNormal
        FillRectangle 22,35,115,115,0,nsbInverted
    
        For i=2 to 24
            For j=2 to 24
                maze(i,j)=0
            Next
        Next
        
        For i=1 to 25
            maze(i,1)=2
            maze(1,i)=2
            maze(i,25)=2
            maze(25,i)=2
        Next
        
    End Sub

まぁ、この2つがあれば、色々と試せるでしょう。
ということで、迷路を描く下準備が整いました。
後は、適当にボタンを配置して、そこイベントに「迷路を作成する」ルーチンを記述することになります。

    Sub object1005()

        Call init_Maze()

        'ここに迷路を作成するルーチンを記述する。

    End Sub

ちょっと駆け足でしたが、下準備の部分は、それほど内容には関係ありませんので、これ以上の説明はしません。
必要な部分は、自分で考えてみてください。

前へ     目次へ     次へ

第13回 考える楽しさ、習う楽しさ「2.迷路を作ろう まずは下準備など」