Kuroda Software Service
迷路生成プログラム
  [サイトマップ]

コンテンツ内メニュー

表示モード 全項表示  部分表示



マークの色と認証の関係

一般公開

無料認証

購入認証


認証についての説明

無料アカウント作成フォーム

有料ページ購入フォーム


ほかのコンテンツトップページ

迷路生成プログラム

オブジェクト配列による迷路生成ソースコードです。

*        次のソースコードをhtaファイルとして保存し、実行してください。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

 

<head>

<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">

<title>Hello World</title>

<meta name="GENERATOR" content="Microsoft FrontPage 5.0">

<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">

</head>

 

<body>

 

<table cellpadding="8" cellspacing="8" bgcolor="Gainsboro">

  <tr>

    <td>

    <p>Width</p>

    </td>

    <td><select ID="Select1">

    <option value="10">10</option>

    <option value="12">12</option>

    <option value="14">14</option>

    <option value="16">16</option>

    <option value="18">18</option>

    <option value="20">20</option>

    <option value="22">22</option>

    <option value="24">24</option>

    <option value="26">26</option>

    <option value="28">28</option>

    <option value="30">30</option>

    </select> </td>

    <td>Height</td>

    <td><select ID="Select2">

    <option value="10">10</option>

    <option value="12">12</option>

    <option value="14">14</option>

    <option value="16">16</option>

    <option value="18">18</option>

    <option value="20">20</option>

    <option value="22">22</option>

    <option value="24">24</option>

    <option value="26">26</option>

    <option value="28">28</option>

    <option value="30">30</option>

    </select> </td>

    <td>

    <input type="button" value="Button" ID="Button1" NAME="Button1" onclick="Main(Select1.value, Select2.value)">

    </td>

  </tr>

</table>

<p></p>

<pre id="CONSOLE" style="color: white; background-color: black"></pre>

<script language="jscript">

//引数文字列を改行付きで表示

function Put(str)

{

    CONSOLE.insertAdjacentText("beforeEnd", str);

}

 

//-----------------------------------------------------------------------------

//迷路オブジェクトは幅と高さを引数に生成される

var Meiro = function(Width, Height)

{

    var Row = Width * 2 + 1;

    var Col = Height * 2 + 1;

    var Dim = new Array(Row);

    var MoguraList = new Array();

   

    //----------------------------------------------------------------------------

    //2次元配列データの初期化

    for(var y = 0; y < Row; y++)

    {

        Dim[y] = new Array(Col);

        for(var x = 0; x < Col; x++)

        {

            //一番上と一番下の配列は全部外壁

            if(y == 0 || y == Row - 1) Dim[y][x] = "◆";

            else

            {

               //一番左と一番右の配列は外壁

               if(x == 0 || x == Col - 1) Dim[y][x] = "◆";

               else

               {

                   if( y % 2 == 1 && x % 2 == 1) Dim[y][x] = "□";

                   else Dim[y][x] = "■";

               }

            }  

        }

    }

 

    //----------------------------------------------------------------------------

    //モグラオブジェクトは迷路オブジェクト内で配列参照される

    var Mogura = function(y, x)

    {

        //生成時のブロック座標を保持

        this.y = y;

        this.x = x;

       

        //自身座標を全角スペースに

        Dim[y][x] = " ";

       

        //周辺空き地を記憶する日本語で上右下左を格納

        this.Akiti;

       

        //周辺空き地を確認して配列に上下左右の文字列を保持

        this.Kakunin = function()

        {

            this.Akiti = new Array();

            //先ず隣接の壁を確認することで配列外への参照を防止していることに注意

            if(Dim[this.y - 1][this.x] == "■" && Dim[this.y - 2][this.x] == "□")

            {

               this.Akiti.push("上");

            }

            if(Dim[this.y + 1][this.x] == "■" && Dim[this.y + 2][this.x] == "□")

            {

               this.Akiti.push("下");

            }

            

            if(Dim[this.y][this.x - 1] == "■" && Dim[this.y][x - 2] == "□")

            {

               this.Akiti.push("左");

            }

            if(Dim[this.y][this.x + 1] == "■" && Dim[this.y][x + 2] == "□")

            {

               this.Akiti.push("右");

            }

            return(this.Akiti);

        }

       

        //保持している空地方向配列のインデックスを指定されて動作

        this.Hotte = function(index)

        {

            var ny = 0; var nx = 0;

            switch(this.Akiti[index])

            {

               //隣接壁を全角スペースにしてその先にある座標を新たなモグラの座標とする

               case "上":

               {

                   Dim[this.y - 1][this.x] = " ";

                   ny = this.y - 2; nx = this.x;

                   break;

               }

               case "下":

               {

                   Dim[this.y + 1][this.x] = " ";

                   ny = this.y + 2; nx = this.x;

                   break;

               }

               case "左":

               {

                   Dim[this.y][this.x - 1] = " ";

                   ny = this.y; nx = this.x - 2;

                   break;

               }

               case "右":

               {

                   Dim[this.y][this.x + 1] = " ";

                   ny = this.y; nx = this.x + 2;

                   break;

               }

            }

            //モグラオブジェクトを生成し配列に追加

            MoguraList.push(new Mogura(ny, nx));

        }  

    }

   

   

    //----------------------------------------------------------------------------

    //迷路オブジェクト作成メソッド

    this.Sakusei = function()

    {

        //初期モグラを座標1,1で生成

        MoguraList.push(new Mogura(1, 1));

       

        //モグラオブジェクトが配列に存在する間ループ

        while(MoguraList.length > 0)

        {

            //動作するモグラを決定する(この場合はランダム)

            var index1 = Math.floor(Math.random() * MoguraList.length);         

           

            //周辺空き地を確認し結果配列を取得

            var Akiti = MoguraList[index1].Kakunin();

           

            //空き地があると報告した場合ランダムに方向インデックスを指定

            if(Akiti.length > 0)

            {

               var index2 = Math.floor(Math.random() * Akiti.length);

               MoguraList[index1].Hotte(index2);     

            }

            //空き地が無いと報告した場合は配列から削除

            else MoguraList.splice(index1, 1);

        }

    }

    //----------------------------------------------------------------------------

    //配列の状態を表示

    this.Disp = function()

    {

        for(var y = 0; y < Row; y++)

        {

            for(var x = 0; x < Col; x++) Put(Dim[y][x]);

            Put("\n");

        } 

    }

 

}

function Main(Width, Height)

{

    M = new Meiro(Width, Height);

    M.Sakusei();

    M.Disp();

}

</script>

</body>

</html>


実行結果の例

 

お問い合わせ
©クロダ ソフトウェア サービス programmed by hidebou