/ inTopicNo.1)  自動迷路生成+表示

  
□投稿者/ うぇいく さん ( MAIL ) 【59.133.237.120】(2016/07/04(Mon) 23:50:16)

   
    #------------------------------------------
    #【ソフト名】「まぜまぜv」と「まぜまぜ」
    #【 作 者 】うぇいく
    #【 U R L 】
    #【連 絡 先】
    #【 転載 】 全て許可
    #【なでしこのバージョン】 ver.1.557
    #【  実行 の 注意点  】 なし
    #【   紹 介     】 迷路を生成して表示します。
    # そのまま自身のプログラムに組み込んだり、
    # 改変して組み込んだりすることも、許可です。
    # このプログラムは単に表示するだけで、
    # 遊ぶ機能はありません。
    # (印刷したり指でなぞって遊ぶことは可能)
    !変数宣言は必要
    !変数初期化は必要

    # ソースを分離した場合は、次の行が必要
    # !「まぜまぜ.nako」を取り込む

    ●MAZE表示(MAZEを{整数=16}Cで)
     Xとは整数
     Yとは整数
     Wとは整数
     MAZE_Wとは整数
     MAZE_Hとは整数
     CWとは整数
     CHとは整数
     DOMとは配列
     DOM\0は$01
     DOM\1は$02
     MAZE_WはMAZEの要素数
     MAZE_HはMAZE\0の要素数
     CWはC
     CHはC
     Xを0からMAZE_W-1まで繰り返す
      Yを0からMAZE_H-1まで繰り返す
       WはMAZE\X,Y
       もし、Xが0ならば、
        X*CW,Y*CHからX*CW,Y*CH+CHへ線
       もし、Yが0ならば、
        X*CW,Y*CHからX*CW+CW,Y*CHへ線
       もし、(AND(W,DOM\0)!=0)ならば、
        X*CW+CW,Y*CHからX*CW+CW,Y*CH+CHへ線
       もし、(AND(W,DOM\1)!=0)ならば、
        X*CW,Y*CH+CHからX*CW+CW,Y*CH+CHへ線

    MAZEとは配列
    MAZEは60,60でMAZE作成
    画面クリア
    線色は$000000
    線太さは1
    MAZEを6でMAZE表示
    # ---------------------------------------------------
    # ---------------------------------------------------
    #まぜまぜ
    # 分離した場合は、続く2行のコメントを外してください
    # !変数宣言は必要
    # !変数初期化は必要
    ●MAZE作成(MAZE_W,MAZE_Hの|MAZE_Hで)
     Xとは整数
     Yとは整数
     Cとは整数
     C0とは整数
     C1とは整数
     Wとは整数
     Dとは整数
     Nとは整数
     Aとは配列
     N1とは整数
     N2とは整数
     MAZE_WALLとは配列
     MAZE_CLUSTERとは配列
     CLUSTERとは配列
     CLUSTER_REFERERとは配列
     WALLとは配列
     不可とは整数
     MODEとは整数
     Rとは整数
     DOXとは配列
     DOYとは配列
     DOMとは配列
     DOM1とは配列
     DOX\0は1
     DOX\1は0
     DOY\0は0
     DOY\1は1
     DOM\0は$01
     DOM\1は$02
     DOM1\0は$FE
     DOM1\1は$FD
     #初期化
     Rは-1
     Cは1
     Xを0からMAZE_W-1まで繰り返す
      Yを0からMAZE_H-1まで繰り返す
       MAZE_WALL\X,Yは$03
       MAZE_CLUSTER\X,YはC
       CLUSTER\CはC
       CLUSTER_REFERER\Cは空
       CLUSTER_REFERER\CにCを配列追加
       Cに1を直接足す
     MODEは0
     WALLは空
     (R!=0)の間、
      Rは0
      不可はオン
      #ランダムな位置の壁を試行
      もし、MODEが0以上ならば、
       10回、
        XはMAZE_Wの乱数
        YはMAZE_Hの乱数
        Dは2の乱数
        不可はオフ
        もし、(X==MAZE_W-1)&&(D==0)ならば、
         不可はオン #右端の右
        もし、(Y==MAZE_H-1)&&(D==1)ならば、
         不可はオン #下端の下
        もし、(CLUSTER\(MAZE_CLUSTER\X,Y)==CLUSTER\(MAZE_CLUSTER\(X+DOX\D),(Y+DOY\D)))ならば、
         不可はオン #同一クラスタの壁
        もし、不可でなければ、
         Rは1
         MODEは0
         WALLは空
         抜ける
      #消去可能な壁の一覧を生成してからその那珂のつを選択
      もし、不可ならば、
       もし、WALLが空ならば、
        Xを0からMAZE_W-1まで繰り返す
         Yを0からMAZE_H-1まで繰り返す
          WはMAZE_WALL\X,Y
          CはCLUSTER\(MAZE_CLUSTER\X,Y)
          C0はCLUSTER\(MAZE_CLUSTER\(X+DOX\0),(Y+DOY\0))
          C1はCLUSTER\(MAZE_CLUSTER\(X+DOX\1),(Y+DOY\1))
          もし、(X!=MAZE_W-1)&&(AND(W,DOM\0)!=0)&&(C!=C0)ならば、
           Aは空
           AにXを配列追加
           AにYを配列追加
           Aに0を配列追加
           WALLにAを配列追加
          もし、(Y!=MAZE_H-1)&&(AND(W,DOM\1)!=0)&&(C!=C1)ならば、
           Aは空
           AにXを配列追加
           AにYを配列追加
           Aに1を配列追加
           WALLにAを配列追加
       違えば、
        WALL_NEWは空
        WALLを反復
         Aはそれ
         XはA\0
         YはA\1
         DはA\2
         CはCLUSTER\(MAZE_CLUSTER\X,Y)
         C0はCLUSTER\(MAZE_CLUSTER\(X+DOX\D),(Y+DOY\D))
         もし、C!=C0ならば、
          WALL_NEWにAを配列追加
        WALLはWALL_NEW
       もし、WALLの要素数が1以上ならば、
        NはWALLの要素数の乱数
        XはWALL\N,0
        YはWALL\N,1
        DはWALL\N,2
        Rは1
        もし、MODEが0ならば、
         MODEは1
        違えばもし、MODEが1ならば、
         MODEは2
        違えばもし、MODEが2ならば、
         MODEは-1
      #有効な壁が選択された場合、クラスタの結合を行う
      もし、(R!=0)ならば、
       MAZE_WALL\X,YはAND((MAZE_WALL\X,Y),DOM1\D)
       もし、Rが1ならば、
        WALLのNを配列削除
       もし、(CLUSTER\(MAZE_CLUSTER\X,Y))<(CLUSTER\(MAZE_CLUSTER\(X+DOX\D),(Y+DOY\D)))ならば、
        N1はCLUSTER\(MAZE_CLUSTER\(X+DOX\D),(Y+DOY\D))
        N2はCLUSTER\(MAZE_CLUSTER\X,Y)
       違えば、
        N1はCLUSTER\(MAZE_CLUSTER\X,Y)
        N2はCLUSTER\(MAZE_CLUSTER\(X+DOX\D),(Y+DOY\D))
       CLUSTER_REFERER\N2を反復
        CLUSTER\それはN1
       CLUSTER_REFERER\N1の0にCLUSTER_REFERER\N2を配列一括挿入
       CLUSTER_REFERER\N2は空
     それはMAZE_WALL

    ●MAZE壁正規化({参照渡し}MAZEを)
     Xとは整数
     Yとは整数
     Wとは整数
     MAZE_Wとは整数
     MAZE_Hとは整数

     MAZE_WはMAZEの要素数
     MAZE_HはMAZE\0の要素数

     Xを0からMAZE_W-1まで繰り返す
      Yを0からMAZE_H-1まで繰り返す
       WはMAZE\X,Y
       もし、Xが0ならば、
        W=OR(W,$04)
       違えば、
        もし、AND((MAZE\(X-1),Y),$01)!=0ならば、
         W=OR(W,$04)
       もし、Yが0ならば、
        W=OR(W,$08)
       違えば、
        もし、AND((MAZE\X,(Y-1)),$02)!=0ならば、
         W=OR(W,$08)
       MAZE\X,YはW
     それはMAZE
    ---------------------------------------------------
    補足。
    MAZE作成で返された配列は、X,Yで各マス目を参照できます。
    (Y,Xではありません)
    値は、下位2ビットのみが利用されます。
    その値が、$01のビットがONの場合、右側に壁があります。OFFの場合は右側は壁がありません。
    その値が、$02のビットがONの場合、下側に壁があります。OFFの場合は下側は壁がありません。
    X=0の左側と、Y=0の上側は、暗黙的に壁があるものとして扱ってください。
    それ以外のマス目の左側と上側は、隣接するマス目の右側と下側を参照してくください。

    MAZE壁正規化を行うことで、隣接するマスとの壁の情報の共有がなくなり、左側と上側の壁の情報が追加されます。
    $01が右側の壁です。
    $02が下側の壁です。
    $04が左側の壁です。
    $08が上側の壁です。

    実際のデータの参照については、まぜまぜvの表示部分を参考にしてみてください。


    ※(2016/08/19(Fri) 16:34:06 編集[投稿者])
削除キー/

コメントを記入





Name/
E-Mail/
Title/
URL/
Icon/ (画像を選択/サンプル一覧)
削除キー/ (半角8文字以内)
確認キー/ (”日本語でナデシコ”と記入)
 

Pass/

BBS CGI RSS CGI
Child Tree RSS/SPAM対応版