迷路を表示する

広告

このアプレットは、5秒毎に新しい迷路を作成して表示するだけのものです。

アプレット:迷路を表示する

実際に実行すると下記のような感じになります。

迷路を表示する

5秒経過すると次の迷路が表示されます。

迷路を表示する

迷路作成のアルゴリズムは「棒倒し法」です。プログラム的には特に目新しいことは行っておらず、5秒毎に迷路を作成しなおしてrepaintメソッドを呼び出して画面を更新してるだけです。

迷路作成の部分だけ参考までに記載しておきます。

int block[][];
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

public void init(){
  block = new int[21][21];
  makeMaze();
}

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;
          }
        }
      }
    }
  }
}

サンプル

下記が全てのソースファイルです。

Sample4.java

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Image;

public class Sample4 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};

  public void init(){
    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){
    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);

    g.drawImage(back, 0, 0, this);
  }

  public void run(){
    while(true){
      repaint();

      makeMaze();

      /* 5000ミリ秒待機する */
      try{
        Thread.sleep(5000);
      }catch (InterruptedException e){
      }
    }
  }
}

( Written by Tatsuo Ikura )