サイコロを作ってみよう4

 

いくら本を読んでも、読んだだけでは自転車に乗れるようにはなりません。
プログラミングも、自分で手を動かして「動いた!」「でも何か変?」などと
実践することで習得できるものだと思います。

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

そんなわけで、拙作のプログラムでも、改造してみる(色を変える)など
いじって楽しんでください。
昨日のコード(プログラム)は、それ単独では動かないので、それを
使うメインプログラムのコード例を掲載しておきます。

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.util.Random;
import com.mltlab.Dice;

public class DiceMain implements Runnable,ActionListener {
	DiceMain dicem;
	Frame f;
	MyCanvas cv;
	Graphics g;
	int dsz=100;
	Random rnd=new Random();
	boolean running=false;
	Dice dd1,dd2;

	DiceMain() {
		dicem=this;
		f=new Frame("Dice");
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent ev) {
				System.exit(0);
			}
		});
		cv=new MyCanvas(320,300);
		g=cv.b.getGraphics();
		g.setColor(new Color(0,64,0));
		g.fillRect(0, 0, cv.b.getWidth(), cv.b.getHeight());
		dd1=new Dice(g);
		dd1.setPos(new Point(20,20),120);
		dd2=new Dice(g);
		dd2.setPos(new Point(160,20),120);
		Button go=new Button("振る");
		go.addActionListener(this);
		Panel p0=new Panel();
		p0.add(go);
		dd1.drawSpot(rnd.nextInt(6)+1);
		dd2.drawSpot(rnd.nextInt(6)+1);
//		dd1.drawSpot(1);
//		dd2.drawSpot(6);
/*
// debug
		Dice0 ddd=new Dice0(g);
		int siz=80;
		int stp=siz+10;
		for (int j=0;j<2;++j) {
			for (int i=0;i<3;++i) {
				ddd.setPos(new Point(i*stp+20,j*stp+20),siz);
				ddd.drawSpot(j*3+i+1);
			}
		}
*/
		f.add(cv,BorderLayout.CENTER);
		f.add(p0,BorderLayout.SOUTH);
		f.setSize(320,300);
		f.setVisible(true);
	}

	int y0=180;
	int x0=74;
	int x1=214;

	@Override
	public void run() {
		running=true;
		for (int i=0;i<5;++i) {
			dd1.drawSpot(rnd.nextInt(6)+1);
			dd2.drawSpot(rnd.nextInt(6)+1);
			repaintwait(250);
		}
		int t=300;
		int r1=rnd.nextInt(6)+1;
		int r2=rnd.nextInt(6)+1;
		for (int i=6;i>0;--i) {
			dd1.drawSpot((r1+5+i)%6+1);
			dd2.drawSpot((r2+11-i)%6+1);
			repaintwait(t);
			t+=(7-i)*50;
		}
		dd1.drawSpot(r1);
		dd2.drawSpot(r2);
		g.setColor(Color.WHITE);
		g.drawString(Integer.toString(r1), x0, y0);
		g.drawString(Integer.toString(r2), x1, y0);
		cv.repaint();
		running=false;
	}
	void repaintwait(int wt) {
		cv.repaint();
		try {
			Thread.sleep(wt);
		} catch (InterruptedException e) {
			System.out.println("sleep Excepton!");
		}
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		if (!running) {
			g.setColor(new Color(0,64,0));
			g.fillRect(0, 0, cv.b.getWidth(), cv.b.getHeight());
		//	g.fillRect(x0-2, y0-16, 20, 20);
		//	g.fillRect(x1-2, y0-16, 20, 20);
			new Thread(dicem).start();
		}
	}


	public static void main(String[] args) {
		new DiceMain();
	}

	class MyCanvas extends Canvas{
		private static final long serialVersionUID = 1L;
		public BufferedImage b;

		public MyCanvas(int ww,int hh) {
			b=new BufferedImage(ww,hh,BufferedImage.TYPE_INT_RGB);
		}
		@Override
		public void paint(Graphics g0) {
			g0.drawImage(b,0,0,null);
		}
		@Override
		public void update(Graphics g0) {
			paint(g0);
		}
	}
}

昨日のDiceクラスのソースに
package com.mltlab;と書いているので、それに呼応して使う側には
import com.mltlab.Dice;と書いておきます。
eclipse上では、
□(default package)
– DiceMain.java (←今日のコード)
□com.mltlab
– Dice.java (←昨日のコード)
と見えているはずです。

2つのサイコロを振ることにして、
Dice dd1=new Dice(g);
Dice dd2=new Dice(g);
の2つのインスタンス(実体)を作って、それぞれを描画させています。

サイコロを振る(出目を変える)アニメーションは、run(){…} で処理していて
「振る」ボタンをクリックした時の処理 ActionListener の actionPerformed()
の中で
new Thread(dicem).start();で起動をかけています。

run()の処理は、5回2つの目を適当に乱数で表示してから
6回次第にゆっくりと目を−1(左)+1(右)に変化させています。

for (int i=6;i>0;--i) {
	dd1.drawSpot((r1+5+i)%6+1);
	dd2.drawSpot((r2+11-i)%6+1);
	repaintwait(t);
	t+=(7-i)*50;
}

がその処理です。
乱数でも良いのですが、確実に目が変化するようにしたかったので
−1/+1しています。
サイコロの大きさや位置は、
dd1.setPos(new Point(20,20),120);の部分で指定していますから、小さくしたり
大きくしてみるのも一興かと存じます。

ご質問やご意見などは、お気軽にメールフォーム
または、コメントでお寄せください。

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

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

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