hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
アルゴリズム/迷路 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

迷路

棒倒し法

  1. 壁を作る
  2. その壁から棒を倒したようにランダム4方向に壁を作る
  3. そのときすでに壁があった場合
    • あきらめる(ここでは上書きしてます)
    • 違う方向に倒す
file棒倒し法.as
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#define size 51            ;Size
#define i 5            ;Bold
 
#const size_2 size*size
#const sc size*i
#const pl (size/2)*(size/2)
/////////////////////////////////////////////
//0が上 1が下 2が右 3が左
/////////////////////////////////////////////
    screen 0,sc,sc,1
    cls
    x=i:y=i
    dim pll,pl
    randomize
    repeat pl
        rnd e,4
        pll.cnt=e
    loop
/////////////////////////////////////////////
*main
    
        gosub *wall
    
    stop
/////////////////////////////////////////////
*wall
    repeat pl
        gosub *go
        if x>=sc:y+=i*2:x=i
        color 0,0,0
        boxf x,y,x+i,y+i
        color 0,0,0
        boxf x+xx,y+yy,x+i+xx,y+i+yy
        x+=i*2
    loop
    return
/////////////////////////////////////////////
*go
    if pll.cnt=0:xx=0:yy=i
    if pll.cnt=1:xx=0:yy=-i
    if pll.cnt=2:xx=i:yy=0
    if pll.cnt=3:xx=-i:yy=0
    return
  • アルゴリズム無視でまず表示。次は掘られた所は掘らず、他を掘るようにすれば完成。 -- Charlotte 2005-05-15 20:21:21 (日)
  • アルゴリズムとしてこれでもいいようです。 -- Charlotte 2005-05-17 20:15:53 (火)

穴堀り法

  1. ランダムな方向に毎回2マス掘る
  2. 2マス先が掘られていたらその方向は掘ることができない
  3. どの方向にも掘れない場合掘れる所まで戻る

穴掘り法についての考察
考察

kz3版ver.2

バグ有り版ver2からバグを取ったものver2.1になります。変更履歴を一掃しました。

filemaze_dighole2.1.as
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
!
-
|
!
-
|
!
-
|
!
 
-
|
|
!
 
 
 
 
-
|
|
!
-
|
|
!
-
|
|
!
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    ;穴掘り法kz3
    #packopt name "maze_dighole2.1" ;一応追加
    #module
    #deffunc dimmix val
        mref array,16
        mref pval,1024
        mx=pval.2
        p=mx
        repeat mx
            rnd r,p
            p--
            tmp=array.r
            array.r=array.p
            array.p=tmp
        loop
        return
    #global
 
    #const  _mclass     51  ;迷路の大きさ
    #const  _bold       5   ;道の太さ
    #const  _wall       0
    #const  _start      5
    #const  _btop       1
    #const  _bright     2
    #const  _bbottom    3
    #const  _bleft      4
    #const  _ftop       0
    #const  _fright     1
    #const  _fbottom    2
    #const  _fleft      3
    #const  _digok      1
;-------------------------------------------------------------------
    screen 0,_mclass*_bold*2+_bold,_mclass*_bold*2+_bold,1
    cls 4
 
    dim maze,_mclass*_mclass
    mdig=0
    sdigx=_bold : sdigy=_bold
    
    maze.mdig=_start
    color 255,255,255
    boxf sdigx,sdigy,sdigx+_bold-1,sdigy+_bold-1
 
    dim way,4
    repeat 4
        way.cnt=cnt
    loop
    
    randomize
*dighole
    repeat
        dimmix way
        digno=0
        repeat 4
            await 1
 
            pmdig=mdig
            if way.cnt=_ftop{
                if (pmdig/_mclass)=0 : continue : else : mdig-=_mclass
            }
            if way.cnt=_fright{
                if (pmdig\_mclass)=(_mclass-1) : continue : else : mdig++
            }
            if way.cnt=_fbottom{
                if (pmdig/_mclass)=(_mclass-1) : continue : else : mdig+=_mclass
            }
            if way.cnt=_fleft{
                if (pmdig\_mclass)=0 : continue : else : mdig--
            }
 
            if (maze.mdig)!_hole{
                mdig=pmdig
                continue
            }
 
            sdigx=(pmdig\_mclass)*_bold*2+_bold
            sdigy=(pmdig/_mclass)*_bold*2+_bold
 
            if way.cnt=_ftop{
                maze.mdig=_bbottom
                boxf sdigx,sdigy-(_bold*2),sdigx+_bold-1,sdigy-1
            }
            if way.cnt=_fright{
                maze.mdig=_bleft
                boxf sdigx,sdigy,sdigx+(_bold*3)-1,sdigy+_bold-1
            }
            if way.cnt=_fbottom{
                maze.mdig=_btop
                boxf sdigx,sdigy,sdigx+_bold-1,sdigy+(_bold*3)-1
            }
            if way.cnt=_fleft{
                maze.mdig=_bright
                boxf sdigx-(_bold*2),sdigy,sdigx-1,sdigy+_bold-1
            }
            title "掘削中"
            digno=_digok
            break
        loop
 
        if digno=_digok:continue
    
        title "後退中"
        if maze.mdig=_start     :break
        if maze.mdig=_btop      :mdig-=_mclass  :continue
        if maze.mdig=_bright    :mdig++         :continue
        if maze.mdig=_bbottom   :mdig+=_mclass  :continue
        if maze.mdig=_bleft     :mdig--
    loop
    title "完成"
    stop

[hsp3]版です。

こちらはver2.1の進行具合をタイトルで表示をグラフィカルに直したものです。

  • ん?穴が開くところがあります。 -- Charlotte 2005-05-28 16:39:30 (土)
  • 速度的には完璧かとw -- Charlotte 2005-05-28 16:43:35 (土)
  • ver2はただいまバグがあるようです・・・デバッグ中なり;; -- kz3 2005-05-28 17:11:46 (土)
  • デバッグ完了いたしやした!!!´ロ`;; -- kz3 2005-05-28 18:24:21 (土)
    • 変更履歴を一掃し、正式版としてUPです。 -- kz3 2005-05-28 18:37:10 (土)
  • おつです。完璧ですね。 -- Charlotte 2005-05-28 19:13:34 (土)
    • 赤くなる方はおもしろいですね。 -- Charlotte 2005-05-28 19:30:19 (土)
    • こういう迷路(ジャンボ迷路とか)を解く場合、行き止まりから分岐点までを塗りつぶしていくんです。 -- kz3 2005-05-28 19:40:13 (土)
    • そうすると最終的に残るのはゴールまでの一本の道になるんです^^ -- kz3 2005-05-28 19:40:50 (土)
  • モジュールdimmixはこちら? -- kz3 2005-05-29 18:13:03 (日)
  • 重大なミス発見。_holeが定義されていないorz未定義=0で_wallと一致。運で動いていました;; -- kz3 2005-05-29 19:39:16 (日)
  • _wallでなかったら掘れないので戻る、これで意味が通ったと思います。失礼しました。 -- kz3 2005-05-29 19:40:04 (日)
  • _holeが未定義というか、初登場の変数名=0と解釈された模様。 -- kz3 2005-05-29 19:41:10 (日)
  • hsp3版をアップしたのは誰かな?内容の同じものは2.61か3.xどちらか一方でいいと思いますが、手を加えたようでしたら自分の名前を添えていただけると助かります [ojigi] -- kz3
  • ULしたのは私、ellerです [ojigi] 。手直しなしではHSP3で実行できなかったので、HSP2を知らない方に有益であると思いULしました。手を加えているのはシャッフルアルゴリズムのみですので、特にコメントなどは追加していません。 -- eller
  • 参考になるかわからないけど、見つけたのでUP -- Charlotte
    • ソースは読む気にならないので・・・穴掘り法かさえわからない。-- Charlotte
    • 宝を探し当てるかのように人のソースを読むのが楽しいkz3です。読みます!--kz3 2005-05-31 10:50:32 (火)
    • ・・・javascriptオフにしてたから気づくのに時間かかりました・・・javascriptですか!;;--kz3 2005-05-31 09:23:10 (火)
    • 楽しくなんかない。。。--kz3 2005-05-31 09:55:34 (火)
    • javaでもアルゴリズム自体は同じだからそこら辺考慮の上のUPでした。 --Charlotte
    • いや、教えていただいたのは嬉しいです;;でもArray("00010101000...のこれは2進数か?を見た段階で・・・ダウン。
file穴掘り法.as
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
!
-
|
|
|
!
 
 
 
 
-
|
|
|
!
-
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
#define size 51            ;Size
#define i 5            ;Bold
 
#const hsize size*size
////////////////////////////////////////////////////////
*in
    
    ws=size*i : screen 0,ws,ws,1
    cls 4
    x=2 : y=2 :ch=1
    rnn=0,0,0,0
    randomize
    dim mero,hsize
*soto
    repeat size                    ;Wall
        a=cnt
        b=(size-1)*size+cnt
        c=size*cnt
        d=(size-1)+(size*cnt)
        gosub *to
        await
    loop
*start
    color 255,255,255
    boxf x*i,y*i,x*i+i,y*i+i
    z=(size*y)+x
    mero.z=1
 
*main
    repeat
        gosub *rndo
        if ch=1:gosub *engine:else:gosub *engine_2
        gosub *draw
    await 5
    loop
 
///////////////////////////////////////////////////////////////////////////
//サブルーチン1階層
 
*to
    mero.a=1:mero.b=1:mero.c=1:mero.d=1
    return
*rndo
    rnd rn,4
     xx=x,x:yy=y,y
    if rn=0:yy-=2:yy.1-=1                    ;Up
    if rn=1:yy+=2:yy.1+=1                    ;Down
    if rn=2:xx-=2:xx.1-=1                    ;Left
    if rn=3:xx+=2:xx.1+=1                    ;Right
    return
*engine
    en=(size*yy)+xx
    enn=(size*yy.1)+xx.1
    if mero.en=1 {                        ;もう掘った
        yy=y,y:xx=x,x
        rnn.rn=1
        gosub *check
    }
    else{                            ;まだ掘ってない
        mero.en=1:mero.enn=1 
        y=yy : x=xx
        rnn=0,0,0,0
    }
    return
*engine_2
    en=(size*yy)+xx
    enn=(size*yy.1)+xx.1
    if mero.enn=0 {                        ;戻れない
        yy=y,y:xx=x,x
        rnn=0,0,0,0
        
    }
    else{                            ;戻れる
        y=yy : x=xx
        rnn.rn=1
        ch=ch*-1
        ;gosub *check
    }
*draw
    boxf xx*i,yy*i,xx*i+i,yy*i+i
    boxf xx.1*i,yy.1*i,xx.1*i+i,yy.1*i+i
    return
/////////////////////////////////////////////////////////////////////////////////
*check
    repeat 4
        if rnn.cnt=1:ii++:else:ii=0
        if ii=4:ch=ch*-1:ii=0
    loop
    return
  • この迷路をもっと高速化したいのですが・・・どなたか突っ込みお願いします。 -- Charlotte 2005-05-14 16:36:44 (土)
  • まだ頭が悪くてのろのろしてますw -- Charlotte 2005-05-14 18:41:32 (土)
  • んん・・・なんかちゃんと迷路が作られないですが^^; -- kz3 2005-05-28 10:37:37 (土)
  • コメントが消えてたので作りました;; -- Charlotte 2005-05-28 11:44:22 (土)
  • 迷路また作り直すかな・・・ -- Charlotte 2005-05-28 11:47:28 (土)

  • Size,Bold共にCharlotteさんと同設定ですが速度はいかに!? -- kz3 2005-05-28 10:54:17 (土)
  • 棒倒し法勉強中です^^;棒倒しの方が早い秘訣はどこに・・・ -- kz3 2005-05-28 10:55:08 (土)
  • UPしたソースで最終実行確認完了。--kz3 2005-05-28 11:09:50 (土)
    • ソースの芸術的構造とコンピューターが描き出す芸術に酔いしれました^^;--kz3 2005-05-28 11:09:50 (土)
  • 速い!でも102行ここには敵いません;; -- Charlotte 2005-05-28 11:36:15 (土)
    • 早すぎorz何故早いのかここのを解読中です。--kz3 2005-05-28 12:08:25 (土)
    • ここのアルゴリズムについての続きはながくなりそうなのでこちらで。--kz3 &new{2005-05-28 13:47:43 (土)];
  • 棒倒し法は、ただ壁作ってそこから一方に倒すだけです。単純で迷路としておもしろくない;; -- Charlotte 2005-05-28 11:38:08 (土)
  • 自分の場合上書きしちゃっていいですよw明らかにこっちの方がいいですから。 -- Charlotte 2005-05-28 11:48:33 (土)
    • いやいや、「アルゴリズム次第で速度が違うんですよー」と比較できるので、載せてあるとアルゴリズムの勉強にもなるので、載せてください;; --kz3 2005-05-28 12:00:31 (土)
  • じゃあもういちど戻すかな;; -- Charlotte 2005-05-28 12:02:07 (土)
  • ・・・回答が早い・・・爆。さては見てますね^^; -- kz3 2005-05-28 12:02:59 (土)
  • 見てますw -- Charlotte 2005-05-28 12:04:12 (土)
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:38:46 (2436d)