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

 

プロトタイピング(試作)では、書いたコードが最終的にはボツになる
という事がよくあります。ですから、主たる処理に力をそそぎ、
エラー処理などはあとまわしにした方が良いと思います。

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

Javaの場合は、少々無茶をしてもVM(バーチャルマシーン)が
実行時エラーを検出して止めてくれますし、Eclipseから実行させて
いれば、強制停止もできるので安心です。

さて、昨日の続きで、あみだくじを下からたどる機能追加をした例を
示します。

void trace(int k,boolean up) {
	int y2,x,yt,j,ye;
	int i=k;
	if (i>=nn) i=nn-1;
	y2=x=0;
	g.setColor(Color.CYAN);
	yt=y0;ye=y1;
	if (up) {
		yt=y1;ye=y0;
		g.setColor(Color.YELLOW);
	}
	for (int j2=0;j2<vn*2;++j2) {
		j=j2;
		if (up) {
			j=vn*2-j2-1;
		}
		y2=j*yh2+y0+yh2;
		x=i*xlen+x0;
		if (up) {
			g.fillRect(x-1, y2, 3, yt-y2);
		}else{
			g.fillRect(x-1, yt, 3, yh2);
		}
		yt=y2;
		if ((i&1)==0) { // 偶数(A,C,E,...)なら
			if ((j&1)==0) { // 上段(ずらしていない方)
//				if (i<(nn-1)){
					if (hb[i][j/2]) { // 右に横棒あり?
						g.fillRect(x, yt-1, xlen, 3);
						++i;
					}
//				}
			}else{ // 下段(ずらしている方)
				if (i>0) {
					if (hb[i-1][j/2]) { // 左に棒あり?
						g.fillRect(x-xlen, yt-1, xlen, 3);
						--i;
					}
				}
			}
		}else{ // 奇数(B,D,F,...)なら
			if ((j&1)==0) { // 上段
				if (i>0) { // 左端でなければ左を見る
					if (hb[i-1][j/2]) { // 左に棒あり?
						g.fillRect(x-xlen, yt-1, xlen, 3);
						--i;
					}
				}
			}else{ // 下段なら右を見る
//				if (i<(nn-1)) {
					if (hb[i][j/2]) { // 右に棒あり?
						g.fillRect(x, yt-1, xlen, 3);
						++i;
					}
//				}
			}
		}// endif 奇数の棒
		cv.repaint();
	}// for j
	x=i*xlen+x0;
	if (up) g.fillRect(x-1,ye,3,yh2);
	else g.fillRect(x-1,yt,3,ye-yt);
}

メソッドの引数に up を追加し true なら下から上に、
false なら上から下にたどるようにしました。
元々の j を j2 にして、下からたどる時用に j を計算してから
従来の処理に渡しています。一部、固有の処理を if (up)などで
分けて行なっています。

さて、実際にあみだくじをたどる場合に、どうやって棒を指定するか
ですが、やはり直接棒をクリックするのが自然ですね。
マウスクリックの処理には、MouseListener あるいは MouseAdapter を
MyCanvasに組み込みます。
Y座標(縦)の判定は、棒の上側(y0から20ドットくらい上まで)の範囲か、
あるいは、棒の下側(y1から20ドットくらい下まで)の範囲か、を調べます。
X座標(横)の判定は、左余白(x0)を除外して、線幅(xlen)で座標を割り
どの線に近いかを得た上で、棒の左右8ドット範囲内かどうかを判定します。
具体的なコード例は次のような感じです。

class ClickHand extends MouseAdapter {
	@Override
	public void mouseClicked(MouseEvent me) {
		if (!gened) return;
		int cky=-1;
		int ckx=-1;

		int y=me.getY();
		if ((y>(y0-20))&&(y<y0)) cky=0; // 棒の上(アルファベット)
		else if ((y>y1)&&(y<(y1+20))) cky=1; // 棒の下(数字)

		int x=me.getX();
		int x2=(x-x0+8)/xlen;
		int x3=x2*xlen+8+x0;
		if ((x>(x0-8))&&(x<x3)) ckx=x2;
		if ((cky>=0)&&(ckx>=0)) {
			drawAmida(nn-1);
			trace(ckx,(cky==1));
		}
	}
}

これをMyCanvasのコンストラクタで登録します。

public MyCanvas(int ww,int hh) {
	b=new BufferedImage(ww,hh,BufferedImage.TYPE_INT_RGB);
	this.addMouseListener(new ClickHand());
}

これで、まずまず使えるあみだくじができたと思います。
次回は、あみだをたどる処理をアニメーション的にしてみましょう。

ご意見、ご質問などは、遠慮なくメールフォームからご連絡ください。

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

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

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

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