迷路を生成してみよう4
継承(extends)のメリットというのは、実際に作って使ってみないと
わかりにくいものだと思います。
毎度、管理人イガジーです。
この例などもそうですが、処理の中核部分を流用して、
入出力部分を変えるプログラムをいくつか作ってみるのが良いでしょう。
という訳で、今回はテキスト(■)表示の迷路をグラフィックに
extendsしてみることにしましょう。
次のような↓迷路が表示されるようになります。
元にするのは、昨日の class MazeT1 です。
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
public class MazeG1 extends MazeT1 {
final int cwidth=400, cheight=400;
Frame f0=new Frame("MazeG1");
MyCanvas cv=new MyCanvas(cwidth,cheight);
MazeG1(int ynn, int xnn){
super();
f0.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
f0.add(cv,BorderLayout.CENTER);
f0.setSize(cwidth,cheight);
generate(ynn,xnn);
f0.setVisible(true);
}
@Override
void dispmz(int [][]zz){
int ofs=16;
int step=6;
cv.g.setColor(Color.WHITE);
for (int y=0;y<yn;++y) {
for (int x=0;x<xn;++x) {
if (zz[y][x]==wall) {
// System.out.print("■");
int x0=x*step+ofs;
int y0=y*step+ofs;
if (x<(xn-1)) {
if (zz[y][x+1]==wall) cv.g.drawLine(x0,y0, x0+step,y0);
}
if (y<(yn-1)) {
if (zz[y+1][x]==wall) cv.g.drawLine(x0,y0, x0,y0+step);
}
}
// else if (zz[y][x]==making) System.out.print("●");
// else System.out.print(" ");
}// for x
// System.out.println();
} // for y
}
public static void main(String[] args) {
new MazeG1(20,18);
}
class MyCanvas extends Canvas {
private static final long serialVersionUID = 1L;
BufferedImage bi;
Graphics g;
MyCanvas(int ww, int hh) {
bi=new BufferedImage(ww,hh,BufferedImage.TYPE_INT_RGB);
g=bi.getGraphics();
}
@Override
public void update(Graphics g0) {
paint(g0);
}
@Override
public void paint(Graphics g0) {
g0.drawImage(bi,0,0,null);
}
}
}
class MyCanvas の部分は、グラフィックを使う場合のお決まりのパターンです。
Frameに関しても、これまでに多用しているお決まりパターンです。
このプログラム固有の処理は、MazeT1 の 表示部分 dispmz() を
Override している部分です。
迷路の内部データ zz[][] を調べて、迷路の壁をグラフィックで描画しています。
迷路を生成する処理は、generate(ynn,xnn); なのですが、MazeG1 には
その処理(メソッドの中身)は存在しません。中身は、MazeT1 にあるのです。
※ この MazeG1.java は、MazeT1.java と同じ場所に置いておきます。
継承(extends)とは、MazeT1 に MazeG1 がかぶさっているイメージで
FrameやCanvasなどの GUI 部分を追加し、
表示部分 dispmz() を新たに置き換えて(Overrideして)、
中核部分generate() は、MazeT1 のものをそのまま使っているのです。
迷路生成のロジックを変更する場合は、MazeT1 のgenerate()を
修正すれば、MazeG1 は何もしなくてもそれに追随できるのです。
継承(extends)のメリットを体感して頂ければ幸いです。
この記事へのコメントはこちら