あみだくじを作ってみよう3
プログラミングで、昔からよく言われるのが「コメントを書け」です。
しかし、コメントは多ければよいとも言えません。最悪なのはソースの
修正に際して、コメントが多すぎて、その修正が追いつかず、コメントが
嘘になってしまうことです。
毎度、管理人イガジーです。
だから、という訳でもありませんが、当ブログで公開している
ソースコードには、ほとんどコメントがありません。
少し反省して、これからはもう少しコメントを書くようにしたいと思っています。
さて、昨日に続いてあみだくじのソースを、さらに変数化(数式化)
してみます。
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;
import java.util.Arrays;
import java.util.Random;
public class Amida1 {
int nn=4; // 縦棒の数
int vn=6; // 横棒の本数
int x0=40; // 左余白
int y0=50; // 上余白
int xlen=60; // 横棒の長さ ... width/(nn-1)
int ylen=260; // 縦棒の長さ
int yh=40; // 横棒の間隔 ... (ylen-20)/vn
int yh2=yh/2; // 隣の横棒をずらす量
Frame f;
MyCanvas cv;
Graphics g;
Random rnd=new Random();
boolean [][] hb=new boolean[16][16];
public Amida1() {
f=new Frame("Amida");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
cv=new MyCanvas(400,500);
g=cv.b.getGraphics();
f.add(cv,BorderLayout.CENTER);
int y1=y0+ylen; // 縦棒の下端座標
g.setColor(Color.WHITE);
for (int i=0;i<nn;++i) { // 縦棒を描画
int x=xlen*i+x0;
g.drawLine(x, y0, x, y1);
}
for (int rx=0;rx<nn;++rx) { // 横棒の有無をクリア
Arrays.fill(hb[rx], false);
}
for (int n=0;n<(nn*(vn+1));++n) { // 乱数で横棒をセット
int r=rnd.nextInt(nn*vn);
int rx=r/vn;
int ry=r%vn;
hb[rx][ry]=true;
}
drawAmida(nn-1); // 横棒を描画
f.setSize(300,400);
f.setVisible(true);
}
void drawAmida(int n) {
for (int i=0;i<n;++i) {
for (int v=0;v<vn;++v) {
if (hb[i][v]) {
int x=xlen*i+x0;
int y2=v*yh+y0+yh2+(i&1)*yh2;
g.drawLine(x, y2, x+xlen, y2);
}
}
}
}
public static void main(String[] args) {
new Amida1();
}
public class MyCanvas extends Canvas{
private static final long serialVersionUID = 1L;
public BufferedImage b;
public MyCanvas(int ww,int hh) {
b=new BufferedImage(ww,hh,BufferedImage.TYPE_INT_RGB);
}
public void paint(Graphics g0) {
g0.drawImage(b,0,0,null);
}
}
}
最初に変数名の意味を示すコメントを書きました。
変数に適切な名称をつけるとコメントを少なくできますが
長すぎる変数名もうっとおしいのでコメントと変数名をうまく使い分けたいですね。
上記のソースでは、
int xlen=60; // 横棒の長さ
と、定数値を使用していますが、縦棒の本数を増やした時に
長さ(縦棒間隔)を自動調整したいので、次回は
int xlen=180/(nn-1); // 横棒の長さ
などと、nnを元に計算するようにしたいと思います。
横棒の有無は、hb[][]に乱数でtrueをセットして決めています。
for (int n=0;n<(nn*(vn+1));++n) {
は、乱数がダブル(重複する)ことを見越して
少し多めの回数、乱数を生成させて true を決めています。が、
列ごとに最低1本の横線を引くという形で、hb[][]を生成した方が
良いかもしれません(どうすれば、そうできるか考えてみてください)。
上記のようなコードでも、それらしきあみだくじを生成できるのが
面白いですね。
(追伸)
プログラミングのモニタ生徒(無料)を募集中です。
無料ですから、プログラミングのお悩みをお持ちの方(に限りませんが)
お早めにメールフォームからご連絡ください。詳しくは→こちら
この記事へのコメントはこちら