サイコロを作ってみよう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はひとつの例)

という感じになります。

実際の使用例は、また後日。

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

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

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

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