swiftで迷路の脱出

swift playgrouds での8番目のプログラミング。今回は迷路の脱出。

../../../_images/mazeMov2.gif

こんな迷路を作るアプリケーションを作った。gifアニメの後半で迷路からの脱出経路を描画している。

青が壁、黒は通路、赤はスタートからゴールまでの順路、黄色は行き止まり。

ゴールまで達すれば、探索は終了するので、見探索の通路が残ります。

使い方

GUIからの使い方は、以下の通り。

  1. アプリの起動
  2. コマンド+N を押すか file -> New を選ぶと、迷路作成の開始
  3. 迷路が完成すると、すぐに迷路からの脱出経路の探索を開始する

(4) スタートは左下、ゴールは右上 (4) スライダーを左右に動かすと、迷路の作成の途中結果を確認できる。

Playgroundからも実行できる。今回も本当はこちらがメイン。

import Cocoa

let maze = MazeBoard(width:20, height:20) // 20 * 20の大きさの迷路を作る
maze.doDig(MazePos(1,1))                  // (1,1)の地点から迷路を彫り始める
let resolver = MazeResolver(maze)         // 迷路の脱出機を作る
resolver.resolve(MazePos(1,1))            // (1,1)の地点(左上)から開始
resolver.DebugPrint()                     // 結果の出力

このように書くと、以下のような出力が得られる。

# # # # # # # # # # # # # # # # # # # #
# S . * * x x x x x x x x x * . . . * #
# * . * x x * * * * * * * x . . * . * #
# * . * * * * . . . . . . * . * * . . #
# * . . * . . . * * * * . * . . . * . #
# * * . * . * * *   * * . . * * . * . #
# x * . * . . *         * . * . . * . #
# . . . * * . *   * *   * . . . * * . #
# . * * * . . *   * *   * * * * * * . #
# . * * . . *     *     * * * . . . . #
# . * * . * *   * *   * *     . * * * #
# . . * . * * * * *         * . . . . #
# * . * . * . . . . * * * * * * * * . #
# * . * . . . * * . . . . . . * * * . #
# * . . * x * * * * * x * * . * . . . #
# * * . * * * . . . * x * * . * . * * #
# x * . * * * . * . * x * * . * . * * #
# x x . . . * . * . * * * * . * . .   #
# * x * * . . . * . . . . . . * * . . #
# # # # # # # # # # # # # # # # # # # #

Sがスタート地点で、G(左下)がゴール地点です。(バグでゴールを.で塗りつぶしてしまってるけど) Xは行き止まりの通路、.が順路です。何も書かれていない場所は、探索していない通路です。

resolver.resolve(MazePos(1,1))                  // (1,1)の地点から迷路を彫り始める

この部分を

resolver.resolve(MazePos(1,1), { $0.DebugPrint() } )

このように変えると、作成途中の迷路が見れる。

ソースコードの解説

面倒なので、

「関東swift勉強会2017-7」 https://cocoa-kanto.connpass.com/event/61475/

で、解説します。

参考文献とソースコード

プロジェクトファイル

  • Swift Macアプリ開発入門
    https://www.amazon.co.jp/Swift-Macアプリ開発入門―次世代iOS、macOSプログラマーのための-中山-茂/dp/487783396X これを読んで、macOSのアプリをサクサク作れるようになるとは思わないが、サンプルコードの選定が私の好みに合ってる。業務用のアプリケーションの雛型でなくて、学習用アプリケーションの雛型なのが良い感じ。

swiftで迷路の作成

swift playgrouds での7番目のプログラミング。今回は迷路の作成。そして、Playgroundsからの脱皮してアプリケーションを作った。

../../../_images/mazeMov.gif

こんな迷路を作るアプリケーションを作った。目的は、迷路を解くプログラムを作るための準備。

使い方

GUIからの使い方は、以下の通り。

  1. アプリの起動
  2. コマンド+N を押すか file -> New を選ぶと、迷路作成の開始
  3. 迷路が完成すると、ウインドウの下部のスライダーがenableになる。
  4. スライダーを左右に動かすと、迷路の作成の途中結果を確認できる。

Playgroundからも実行できる。と、いうかこちらがメイン。

import Cocoa

let maze = MazeBoard(width:20, height:20) // 20 * 20の大きさの迷路を作る
maze.doDig(MazePos(1,1))                  // (1,1)の地点から迷路を彫り始める
maze.DebugPrint()                         // 迷路を出力

このように書くと、以下のような出力が得られる。

# # # # # # # # # # # # # # # # # # # #
# S * *         * *   * * *   * * * * #
#     *   * *   * *       *           #
# *       * *         *     *   * *   #
# * * * *   * * * * * * *   *     * * #
#           *           *     *     * #
#     *   * *   * * *   * *   * *     #
#   * *   * *     * *   * *   * * *   #
#   * *       *   *       *           #
#   * * * *       *   *     * * * *   #
#           * * * *     *     *       #
# * * * *     * * * *     *   *   * * #
#       * *         * *   * * *   * * #
#   *       * * *   * *     * *       #
#   * * *       *     * *     * *   * #
#     * * * *   * *   * * *         * #
# *   *   * *         *   * * * * * * #
# *   *       * * * *       * * *     #
# *       *             *           G #
# # # # # # # # # # # # # # # # # # # #

Sがスタート地点で、Gがゴール地点です。

maze.doDig(MazePos(1,1))                  // (1,1)の地点から迷路を彫り始める

この部分を

maze.doDig(MazePos(1,1), { $0.DebugPrint() } )

このように変えると、作成途中の迷路が見れる。

ソースコードの解説

面倒なので、

「関東swift勉強会2017-7」 https://cocoa-kanto.connpass.com/event/61475/

で、解説します。

参考文献とソースコード

プロジェクトファイル

  • コンピュータアルゴリズム事典
    https://www.amazon.co.jp/Software-Technology-12-コンピュータアルゴリズム事典-奥村/dp/4874089135 Pascalで書かれてます。当初これに載っていた、「壁を伸ばす」アリゴリズムで書いていたが、「穴を掘る」アルゴリズムに変更した。しかし、進めなくなったら、分岐箇所からもう一度伸ばす考え方は同じはず。
  • Swift Macアプリ開発入門
    https://www.amazon.co.jp/Swift-Macアプリ開発入門―次世代iOS、macOSプログラマーのための-中山-茂/dp/487783396X これを読んで、macOSのアプリをサクサク作れるようになるとは思わないが、サンプルコードの選定が私の好みに合ってる。業務用のアプリケーションの雛型でなくて、学習用アプリケーションの雛型なのが良い感じ。

ソースコード用にcssを書いた

今まで、sphinxで書いたソースコードがソフト改行されていたために、読みづらかった。

ソフト改行されるのは、所定の矩形に入れるためなので、仕方がない事だと思っていた。

ググるとcssをうまく設定すると改行せずに横スクロールさせる設定があるとの事。

以下のコードを使っているcssファイルに追加するだけ。

/* ソースコードは改行しないで、スクロールさせる */

div.highlight pre {
    white-space: pre;
    word-wrap: normal
}

div.highlight {
    overflow:auto;
}

当然、Safariでしか確認していない。