- Home ›
- Applet(アプレット)入門 ›
- アプレットサンプル ›
- HERE
迷路を作成し自動で解く
広告
前回のサンプルで自動で迷路を作成しましたが、今度は作成した後ゴールするまで自動的に解いていきます。ゴールしたらまた新しい地図を作成します。
実際に実行すると下記のような感じになります。
迷路を解くためのアルゴリズムは一番簡単な「左側添え走法」です(正式な名前は知りません)。左側に手を付きながら迷路を進むというものです。
private void move(){ /* まず左に行けるかどうかチェック */ int leftd = marud + 1; if (leftd == 4){ leftd = 0; } int left = block[maruy + dy[leftd]][marux + dx[leftd]]; if (left == 0){ marud = leftd; oldx = marux; oldy = maruy; marux += dx[marud]; maruy += dy[marud]; return; } /* 次に現在の進行方向に行けるかチェック */ int next = block[maruy + dy[marud]][marux + dx[marud]]; while(next == 1){ /* 行けなければ右へ右へと向きを変えて行けるかどうかチェック */ marud--; if (marud == -1){ marud = 3; } next = block[maruy + dy[marud]][marux + dx[marud]]; } oldx = marux; oldy = maruy; marux += dx[marud]; maruy += dy[marud]; }
また今回は現在の状態を表す変数を1つ用意して、迷路作成の初期状態か、迷路を解いている途中の状態か、でpaintメソッド内の処理やrunメソッド内の処理を分けています。
迷路作成ステージ 迷路解決ステージ (ゴールするまで繰り返し) 迷路作成ステージ 迷路解決ステージ (ゴールするまで繰り返し)
このように現在の状態を表す変数を1つ用意することで、1つのpaintメソッド内で様々な描画処理を分けることができます。
サンプル
下記が全てのソースファイルです。
import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Dimension; import java.awt.Image; public class Sample5 extends Applet implements Runnable{ Thread thread = null; Dimension size; Image back; Graphics buffer; int block[][]; int dx[] = {0, 1, 0, -1}; int dy[] = {1, 0, -1, 0}; int stage; int marux; /* 迷路を解く人 */ int maruy; int marud; /* 向き 0~3 */ int oldx; /* 1つ前の位置 */ int oldy; public void init(){ stage = 0; marux = 1; maruy = 1; marud = 0; oldx = 1; oldy = 1; size = getSize(); back = createImage(size.width, size.height); buffer = back.getGraphics(); block = new int[21][21]; makeMaze(); thread = new Thread(this); thread.start(); } private void makeMaze(){ /* 全体をクリア */ for (int i = 0 ; i < 21 ; i++){ for (int j = 0 ; j < 21 ; j++){ block[i][j] = 0; } } /* 外枠をセット */ for (int i = 0 ; i < 21 ; i++){ block[0][i] = 1; block[20][i] = 1; block[i][0] = 1; block[i][20] = 1; } /* 基準点をセット */ for (int i = 1 ; i <= 9 ; i++){ for (int j = 1 ; j <= 9 ; j++){ block[i * 2][j * 2] = 1; } } /* 迷路作成 */ for (int i = 1 ; i <= 9 ; i++){ for (int j = 1 ; j <= 9 ; j++){ if (i == 1){ int d = (int)(Math.random() * 4); block[i * 2 + dx[d]][j * 2 + dy[d]] = 1; }else{ boolean flag = true; while(flag){ int d = (int)(Math.random() * 3); if (block[i * 2 + dx[d]][j * 2 + dy[d]] == 0){ block[i * 2 + dx[d]][j * 2 + dy[d]] = 1; flag = false; } } } } } } public void update(Graphics g){ paint(g); } public void paint(Graphics g){ if (stage == 0){ buffer.setColor(Color.black); buffer.fillRect(0, 0, size.width, size.height); for (int i = 0 ; i < 21 ; i++){ for (int j = 0 ; j < 21 ; j++){ if (block[i][j] == 1){ buffer.setColor(Color.white); buffer.fillRect(j * 15, i * 15, 15, 15); buffer.setColor(Color.blue); buffer.drawRect(j * 15 + 1, i * 15 + 1, 13, 13); } } } buffer.setColor(Color.red); buffer.fillRect(15 + 1, 15 + 1, 13, 13); buffer.setColor(Color.blue); buffer.fillRect(15 * 19 + 1, 15 * 19 + 1, 13, 13); stage = 1; }else if (stage == 1){ buffer.setColor(new Color(34, 139, 34)); buffer.fillRect(oldx * 15 + 1, oldy * 15 + 1, 13, 13); buffer.setColor(Color.green); buffer.fillRect(marux * 15 + 1, maruy * 15 + 1, 13, 13); } g.drawImage(back, 0, 0, this); } public void run(){ while(true){ if (stage == 0){ makeMaze(); /* 迷路作成 */ marux = 1; /* スタート地点を初期化 */ maruy = 1; marud = 0; oldx = 1; oldy = 1; repaint(); /* 2000ミリ秒待機する */ try{ Thread.sleep(2000); }catch (InterruptedException e){ } }else if (stage == 1){ /* 迷路を解いている途中 */ repaint(); /* 300ミリ秒待機する */ try{ Thread.sleep(300); }catch (InterruptedException e){ } move(); if ((marux == 19) && (maruy == 19)){ /* ゴールに着いたら地図初期化へ */ stage = 0; } } } } private void move(){ /* まず左に行けるかどうかチェック */ int leftd = marud + 1; if (leftd == 4){ leftd = 0; } int left = block[maruy + dy[leftd]][marux + dx[leftd]]; if (left == 0){ marud = leftd; oldx = marux; oldy = maruy; marux += dx[marud]; maruy += dy[marud]; return; } /* 次に現在の進行方向に行けるかチェック */ int next = block[maruy + dy[marud]][marux + dx[marud]]; while(next == 1){ /* 行けなければ右へ右へと向きを変えて行けるかどうかチェック */ marud--; if (marud == -1){ marud = 3; } next = block[maruy + dy[marud]][marux + dx[marud]]; } oldx = marux; oldy = maruy; marux += dx[marud]; maruy += dy[marud]; } }
( Written by Tatsuo Ikura )