あみだくじを作ってみよう2

 

プログラミングでは、変数を使って数式化(一般化)しますが
最初から変数を用意して数式を書こうと頑張るのは大変です。

毎度、管理人イガジーです。

まずは、ベタの数値で書き下してみるのが良いでしょう。
例えば、あみだくじの縦棒を何本か描く場合には、まず

g.setColor(Color.WHITE);
g.drawLine(40, 50, 40, 310);
g.drawLine(100,50,100, 310);
g.drawLine(160,50,160, 310);

などと書いて、動かしてみます。
それから、数式にしてループ化(抽象化)すれば良いのです。

x座標は、40→100→160 で、初期値は40、差(=幅)は60です。
数式にすると、x=60*i+40; (i=0,1,2)ということになります。
y座標は、始点50で、終点310 ですね。
あとで、全体をずらしたくなるかもしれないので始点、終点も
変数にしておきましょう。すると、次のように書けますね。

int nn=3;
int y0=50;
int y1=y0+260;
for (int i=0;i<nn;++i) {
	int x=60*i+40;
	g.drawLine(x, y0, x, y1);
}

最初のnnを4や5にしてループの効果を体験してください。
y0 も、30 や 80 にすると全体をずらせる事がわかりますね。

さて、あみだで肝心なのは、横棒です。横棒を描く/描かないを
2次元の配列 boolean [][] hb で持ち、この添字は次のような
対応関係としましょう。
amida-horizonbar
乱数で、hb[][]に true をセットし、trueであれば、横棒を引くことにします。
横棒は、互い違いになるように

for (int i=0;i<n;++i) {
	for (int v=0;v<6;++v) {
		int x0=40+60*i;
		int y2=v*40+y0+20+(i&1)*20;
		g.drawLine(x0, y2, x0+60, y2);
	}
}

と、y座標に(i&1)*20 を 加算します。
iが奇数の時にだけ、20を加算するという意味です。
40とか60、20 といったマジックナンバー(あとで何の数値なのか
分からなくなるもの)が多数ありますが、今は気にしないでおきます。
(40は、横方向のオフセット、60は、縦棒と縦棒の間隔、
20は、横棒の間隔ですが、後ほど変数にするつもりです。)

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)