あみだくじを作ってみよう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());
}
これで、まずまず使えるあみだくじができたと思います。
次回は、あみだをたどる処理をアニメーション的にしてみましょう。
ご意見、ご質問などは、遠慮なくメールフォームからご連絡ください。
この記事へのコメントはこちら