サイコロを作ってみよう3
Javaでよく書く class という宣言文は、ひとかたまりの「プログラム」
という意味です。「ソフトウェア部品」と言ってもよいでしょう。
毎度、管理人イガジーです。
この class を上手に作っておくと、extends (継承)したり、その class を
(ブラックボックスとして)使ったりできます。
ただ、最初からリキんでも、どう書けば再利用しやすいものなのか
分からないと思うので、たくさん(小さな)プログラムを書いて、経験を
積むのが大切だと思います。
という訳で、サイコロなのですが、サイコロ自体を描画する部分を
ひとつの class にしてみることにしましょう。
package com.mltlab;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.Random;
public class Dice {
Graphics g=null;
int mgn=0; // 辺からの距離
int spc=2; // 黒丸の余白
int x0,y0;
int size;
int rsz,bsz;
int rpos0;
int p1, p2, p3;
Random rnd=new Random();
public Dice(Graphics g0) {
g=g0;
setPos(new Point(10,10),100);
}
public Dice(Graphics g0,int margin, int space) {
mgn=margin;
spc=space;
g=g0;
setPos(new Point(10,10),100);
}
public void setPos(Point p, int siz){
x0=p.x; y0=p.y;
if (mgn==0) mgn=siz/8;
size=siz;
rsz=siz/3+4;
rpos0=(siz-rsz)/2;
bsz=(siz-mgn*2)/3-spc*2;
p1=mgn+spc;
p2=(siz-bsz)/2;
p3=siz-mgn-bsz-spc;
}
public void drawSpot(int n) {
/* 1 2 3
4 5 6
7 8 9 */
g.setColor(Color.WHITE);
g.fillRoundRect(x0, y0, size, size, 20, 20);
g.setColor(Color.BLACK);
switch (n) {
case 1:
g.setColor(Color.RED);
g.fillOval(x0+rpos0, y0+rpos0, rsz, rsz);
break;
case 2:
if (rnd.nextInt(10)>5){
g.fillOval(x0+p1, y0+p1, bsz, bsz); // 1 左上
g.fillOval(x0+p3, y0+p3, bsz, bsz); // 9 右下
}else{
g.fillOval(x0+p3, y0+p1, bsz, bsz); // 3 右上
g.fillOval(x0+p1, y0+p3, bsz, bsz); // 7 左下
}
break;
case 3:
if (rnd.nextInt(10)>5){
g.fillOval(x0+p1, y0+p1, bsz, bsz); // 1 左上
g.fillOval(x0+p3, y0+p3, bsz, bsz); // 9 右下
}else{
g.fillOval(x0+p3, y0+p1, bsz, bsz); // 3 右上
g.fillOval(x0+p1, y0+p3, bsz, bsz); // 7 左下
}
g.fillOval(x0+p2, y0+p2, bsz, bsz); // 5 中央
break;
case 4:
g.fillOval(x0+p1, y0+p1, bsz, bsz); // 1 左上
g.fillOval(x0+p3, y0+p1, bsz, bsz); // 3 右上
g.fillOval(x0+p1, y0+p3, bsz, bsz); // 7 左下
g.fillOval(x0+p3, y0+p3, bsz, bsz); // 9 右下
break;
case 5:
g.fillOval(x0+p1, y0+p1, bsz, bsz); // 1 左上
g.fillOval(x0+p3, y0+p1, bsz, bsz); // 3 右上
g.fillOval(x0+p2, y0+p2, bsz, bsz); // 5 中央
g.fillOval(x0+p1, y0+p3, bsz, bsz); // 7 左下
g.fillOval(x0+p3, y0+p3, bsz, bsz); // 9 右下
break;
case 6:
g.fillOval(x0+p1, y0+p1, bsz, bsz); // 1 左上
g.fillOval(x0+p3, y0+p1, bsz, bsz); // 3 右上
g.fillOval(x0+p1, y0+p2, bsz, bsz); // 4 左中
g.fillOval(x0+p3, y0+p2, bsz, bsz); // 6 右中
g.fillOval(x0+p1, y0+p3, bsz, bsz); // 7 左下
g.fillOval(x0+p3, y0+p3, bsz, bsz); // 9 右下
break;
case 9: // for debug
g.setColor(Color.GRAY);
g.fillOval(x0+p1, y0+p1, bsz, bsz); // 1 左上
g.fillOval(x0+p2, y0+p1, bsz, bsz); // 2 中上
g.fillOval(x0+p3, y0+p1, bsz, bsz); // 3 右上
g.fillOval(x0+p1, y0+p2, bsz, bsz); // 4 左中
g.fillOval(x0+p2, y0+p2, bsz, bsz); // 5 中央
g.fillOval(x0+p3, y0+p2, bsz, bsz); // 6 右中
g.fillOval(x0+p1, y0+p3, bsz, bsz); // 7 左下
g.fillOval(x0+p2, y0+p3, bsz, bsz); // 8 中下
g.fillOval(x0+p3, y0+p3, bsz, bsz); // 9 右下
default:
break;
}
}
}
これ自体は単独で動かすものではないので
main() は存在しません。他のソースから、new で呼び出されます。
他から使われるので、public 宣言がついています。
また、深い意味はありませんが、package 宣言をしています。
これは、イガジー以外にも Dice というクラスを作っている人が
いるかもしれないから、です。
描画先が何なのか、は、この Dice クラスは関知しておらず、
与えられた Grahpics g0; を使ってサイコロを描画します。
※ Graphics とは、「筆」のようなものです。
処理は、昨日の座標計算に基づいて丸を描画するだけなのですが
2と3の目については、乱数で時々右下がりの並びにもしています。
この Dice クラスの使い方は、
Grahpcs g0=bufferedimage.getGraphics();
Dice dd=new Dice(g0); // インスタンス dd を生成
dd.setPos(new Point(10,10), 120); // 位置と大きさを指定
dd.drawSpot(6); // 目を描画(6はひとつの例)
という感じになります。
実際の使用例は、また後日。
この記事へのコメントはこちら