サイコロを作ってみよう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);
の部分で指定していますから、小さくしたり
大きくしてみるのも一興かと存じます。
ご質問やご意見などは、お気軽にメールフォーム
または、コメントでお寄せください。
この記事へのコメントはこちら