最近、私はしばしば、クラスメートがコンピュータールームで迷路ゲームをしているのを見ます。とても面白いです。また、Javaを使用してアルゴリズムを書き、ランダム生成のMAZEを実装しています。実際、それはグラフの深さ最初のトラバーサルアルゴリズムです。基本的なアイデアは、迷路のすべてのポイントには4つの壁があるということです。
1.任意のポイントからアクセスを開始します(私のアルゴリズムはポイント(0,0)から開始するように固定されています)、4つの方向のうちのランダムな方向(アクセス可能なポイントにアクセスするたびに、そのポイントのその方向の壁を削除します)、アクセスポイントはこの方向にアクセスし続けます。
2。訪問された各ポイントは、アクセスとして識別されます。ポイントが特定の方向にアクセスすると、最初にアクセスされたポイントにアクセスされたか、境界に触れるかどうかを判断します。ポイントの4つの方向すべてにアクセスされているか、アクセスできない場合は、前のポイントに戻ります。前のポイントはプロセスを継続します。
この方法で移動した後、各ポイントが訪問されたことが確認できます。さらに、各アクセスの方向はランダムであるため、多くの異なるトラバーサル状況が形成されます。同時に、2つのポイントの間のパスは一意であり、異なる迷路を形成し、初期ポイントからエンドポイントまでのユニークなパスのみがあります。これは、グラフの深さトラバーサルアルゴリズムの特性によって決定されます。アルゴリズムの実装では、主なことはスタックを使用することです。初めて、最初に最初のポイントをスタックに押し込みます。ポイントにアクセスするたびに、ポイントがスタックに押し込まれ、スタックの上部のポイントに4つの方向にランダムにアクセスし、新しいポイントにアクセスし、新しいポイントにアクセスし、このポイントの4つの方向がスタックから引き出してから、スタックの上部のポイントの4つの方向にアクセスします。スタック出口のすべてのポイントがすべて成功するまで成功します。これは再帰プロセスです。このアルゴリズムは、再帰的な方法によって自然に実装できます。ただし、ここでこれを行いますが、アレイをスタックとして手動で実装します。ハハ~~そんなに言った後、私が表現したいことが表現されているかどうかはわかりません。しかし、私の特定のコード設計は十分に書かれていないと感じており、改善と最適化が不足している場所がまだたくさんあります。アルゴリズムの演習になるだけです。以下は、2つの重要なクラスのコアコードです。プレゼンテーションレイヤーのコードに関しては、それらは非常に些細なものであるため、それらを投稿しません。
これがレンダリングです:
迷路クラス:
//著者:Zhongzw //メール:[email protected]パッケージcn.zhongzw.model; java.util.arraylistをインポートします。 java.util.randomをインポートします。パブリッククラスMazemodel {private int width = 0;プライベートINT HEIGHT = 0;プライベートランダムrnd = new Random(); public mazemodel(){this.width = 50; //迷路幅this.height = 50; //迷路の高さ} public int getWidth(){return width; } public void setWidth(int width){this.width = width; } public int getheight(){return height; } public void setheight(int height){this.height = height; } public mazemodel(int width、int height){super(); this.width = width; this.height = height; } public ArrayList <MazePoint> getMaze(){arrayList <MazePoint> Maze = new ArrayList <MazePoint>(); for(int h = 0; h <height; h ++){for(int w = 0; w <width; w ++){mazepoint = new mazepoint(w、h); Maze.Add(ポイント); }} return createmaze(迷路); } private arraylist <mazepoint> createmaze(arraylist <mazepoint>迷路){int top = 0; int x = 0; int y = 0; ArrayList <MazePoint> Team = new ArrayList <MazePoint>(); team.add(maze.get(x + y *幅)); while(top> = 0){int [] val = new int [] {-1、-1、-1、-1}; int times = 0;ブールフラグ= false; mazepoint pt =(mazepoint)team.get(top); x = pt.getx(); y = pt.gety(); pt.visted = true; ro1:while(times <4){int dir = rnd.nextint(4); if(val [dir] == dir)継続; else val [dir] = dir; switch(dir){case 0://左if((x -1)> = 0 && maze.get(x -1 + y * width).visted == false){maze.get(x + y * width).setLeft(); Maze.get(x -1 + y * width).setright(); Team.Add(Maze.get(x -1 + y *幅));トップ++; flag = true; RO1を破る; } 壊す;ケース1://右if((x + 1)<width && maze.get(x + 1 + y * width).visted == false){maze.get(x + y * width).setright(); Maze.get(x + 1 + y * width).setLeft(); Team.Add(Maze.get(x + 1 + y *幅));トップ++; flag = true; RO1を破る; } 壊す;ケース2:// if((y -1)> = 0 && maze.get(x +(y -1) * width).visted == false){maze.get(x + y * width).setup(); Maze.get(x +(y -1) * width).setdown(); Team.Add(Maze.get(x +(y -1) * width));トップ++; flag = true; RO1を破る; } 壊す;ケース3://以下のif((y + 1)<height && maze.get(x +(y + 1) * width).visted == false){maze.get(x + y * width).setdown(); Maze.get(x +(y + 1) * width).setup(); Team.Add(Maze.get(x +(y + 1) * width));トップ++; flag = true; RO1を破る; } 壊す; } times += 1; } if(!flag){team.remove(top);トップ - = 1; }}迷路を返します。 }}
迷路
//著者:Zhongzw //メール:[email protected]パッケージcn.zhongzw.model; Java.util。*をインポートします。 java.lang。*をインポートします。パブリッククラスMazePoint {private int left = 0; private int right = 0; private int up = 0; private int down = 0;プライベートint x;プライベートインストY;パブリックブールの目撃された。 public Mazepoint(int x、int y){this.x = x; this.y = y; } public int getLeft(){return left; } public void setLeft(){this.left = 1; } public int getRight(){return right; } public void setright(){this.right = 1; } public int getup(){return up; } public void setup(){this.up = 1; } public int getDown(){return; } public void setDown(){this.down = 1; } public int getX(){return x; } public void setx(int x){this.x = x; } public int gety(){return y; } public void sety(int y){this.y = y; }}
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。