EventRandom4.java(またはEventRandom2.java)を元にいろいろ変更して IroiroRandom1.java IroiroRandom2.java IroiroRandom3.java などと作っていき、一番の出来を IroiroRandom.javaとして保存してください。(必ず java IroiroRandom で実行できるようにしておくこと)
EventRandom4.javaから改変して IroiroRandom1.java を作る場合、4箇所の EventRandom4 を IroiroRandom1 に変えることを忘れないように。
また、IroiroRandom1.java IroiroRandom2.java IroiroRandom3.java などから一番の出来を IroiroRandom.javaとしするときにも、4箇所の IroiroRandom? を IroiroRandom に変えることを忘れないように。
元になるプログラムは EventRandom4.java として下に示してあります。今回はこの中のどんな図形をどこに描くかを示すdrawRdmと次に描く図形の色を設定するnextColorを変更することでプログラムを完成させます。
変更例をあげますが、このなかから好きなものを選ぶのではなく、必ず変更を加えてユニークな模様にしなければなりません。
これはすでに作ってあるはずですが、そうでない人はここからコピーできるようにもう一度書きました。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
public class EventRandom4 extends JFrame implements ActionListener{
JButton mybtn;
MyPanel mypnl;
public EventRandom4() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400,300);
setTitle("BufferedImageで描く");
mypnl = new MyPanel(400,300);
mybtn = new JButton("draw");
setLayout(new BorderLayout());
add(mypnl, BorderLayout.CENTER);
add(mybtn,BorderLayout.SOUTH);
mybtn.addActionListener(this);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == mybtn) {
mypnl.drawRdm();
mypnl.repaint();
}
}
public static void main(String[] args){
EventRandom4 myframe = new EventRandom4();
}
public class MyPanel extends JPanel{
Color c = new Color(0,0,0); //楕円の色と初期値
Color bc = new Color(255,255,191);
int dc = 51; //色の変化の大きさ
int dx = 50; //位置の変化の大きさ
BufferedImage buffimg;
Graphics bfg;
public MyPanel(int w,int h){
buffimg = new BufferedImage(
//getSize().width,
//getSize().height,
w,h,BufferedImage.TYPE_INT_RGB);
bfg = buffimg.createGraphics();
bfg.setColor(bc);
bfg.fillRect(0, 0, w, h);
}
@Override
public void paintComponent(Graphics myg){
super.paintComponent(myg);
myg.drawImage(buffimg, 0, 0,getSize().width, getSize().height,this);
}
public void drawRdm() {
for(int i=0; 10>i; i++){
nextColor();
int x = (int)(400*Math.random());
int y = (int)(300*Math.random());
int h = (int)(50*Math.random()+5);
bfg.fillOval(x-h/2,y-h/2,h,h);
}
}
public void nextColor(){
int r=c.getRed();
int g=c.getGreen();
int b=c.getBlue();
g = (int)(g + dc*Math.random());
if (g > 255){
g = 0;
}
c = new Color(r,g,b);
bfg.setColor(c);
}
}
}
400*Math.random()は0から400までのでたらめな数を用意します。
(int)(数式)は計算するとdoubleの数になるものを整数に変換します。
fillOvalなどは引数が整数でないとコンパイルが通りません。
このまま実行して10回ほどクリックすると、こうなります

もう一度いいますが、以下の作成例のなかから好きなものを選ぶのではなく、必ず変更を加えてユニークな模様にしなければなりません。
元になるプログラムから、IroiroRandom1.java を作ります。
まず EventRandom4.java を IroiroRandom1.java として「別名で保存」し、4箇所の EventRandom4 を IroiroRandom1 に変えて再び保存します。
この中のnextColor()の部分だけを次のように書き換えます。
public void nextColor(){
int r=c.getRed();
int g=c.getGreen();
int b=c.getBlue();
r = (int)(r + dc*Math.random());
if (r > 255){
r = 0;
}
g = (int)(g + dc*Math.random());
if (g > 255){
g = 0;
}
c = new Color(r,g,b);
bfg.setColor(c);
}
こうなります

緑だけでなく赤の成分も変化させるように nextColor() メソッドに書き加えました。さらに青も加えることもできます。
元になるプログラムのdrawRdm()の部分を次のように書き換えます。nextColor()の部分は例1のようにしても、元のままでも、青がからむようにしてもそれぞれ違いが楽しめます。
public void drawRdm() {
for(int i=0; 10>i; i++){
nextColor();
int x1 = (int)(400*Math.random());
int y1 = (int)(300*Math.random());
int x2 = (int)(400*Math.random());
int y2 = (int)(300*Math.random());
bfg.drawLine(x1,y1,x2,y2);
}
}
こうなります

円の代わりにdrawLineで線を引いています。
色を緑と青を変えるようにしました(プログラムは省略。赤と緑を参照)。あまり面白くありません。
元になるプログラムのdrawRdm()の部分を次のように書き換えます。nextColor()の部分は例1のようにしても、元のままでも、青がからむようにしてもそれぞれ違いが楽しめます。
public void drawRdm() {
for(int i=0; 10>i; i++){
nextColor();
int x1 = (int)(400*Math.random());
int y1 = (int)(300*Math.random());
int x2 = (int)(400*Math.random());
int y2 = (int)(300*Math.random());
bfg.drawLine(x1,y1,x2,y2);
bfg.drawLine(x1+1,y1,x2+1,y2);
bfg.drawLine(x1+2,y1,x2+2,y2);
bfg.drawLine(x1+3,y1,x2+3,y2);
bfg.drawLine(x1+4,y1,x2+4,y2);
bfg.drawLine(x1+5,y1,x2+5,y2);
bfg.drawLine(x1+6,y1,x2+6,y2);
bfg.drawLine(x1+7,y1,x2+7,y2);
bfg.drawLine(x1+8,y1,x2+8,y2);
}
}
こうなります

drawLineを重ねました。いまいちです。完全にランダム(偶然まかせ)はあまり面白くないのでしょう。
元になるプログラムのdrawRdm()の部分を次のように書き換えます。nextColor()の部分は例1のようにしても、元のままでも、青がからむようにしてもそれぞれ違いが楽しめます。
bfg.drawLine(x1,y1,x2,y2); nextColor(); bfg.drawLine(x1+1,y1,x2+1,y2); nextColor(); bfg.drawLine(x1+2,y1,x2+2,y2); nextColor(); bfg.drawLine(x1+3,y1,x2+3,y2); nextColor(); bfg.drawLine(x1+4,y1,x2+4,y2); nextColor(); bfg.drawLine(x1+5,y1,x2+5,y2); nextColor(); bfg.drawLine(x1+6,y1,x2+6,y2); nextColor(); bfg.drawLine(x1+7,y1,x2+7,y2); nextColor(); bfg.drawLine(x1+8,y1,x2+8,y2);
こうなります

例2-bのプログラムを少し変更し、線を描く前にいちいち色を変えます。単色の帯が連続して色が変化する帯になります。
元になるプログラムのdrawRdm()の部分を次のように書き換えます。nextColor()の部分は例1のようにしても、元のままでも、青がからむようにしてもそれぞれ違いが楽しめます。
public void drawRdm() {
dx = 20;
int x = (int)(400*Math.random());
int y = (int)(300*Math.random());
for(int i=0; 100>i; i++){
int xx = (int)(dx*Math.random()*2-dx); //-dx から dx までの値
nextColor();
x += xx;
y += xx;
int h = (int)(20*Math.random()+5);
bfg.fillOval(x-h/2,y-h/2,h,h);
}
}
こうなります

円を直線上に配置します。x,yに同じ数を加えるので右下か左上に動きます。進み具合をランダムにしています。
元になるプログラムのdrawRdm()の部分を次のように書き換えます。nextColor()の部分は例1のようにしても、元のままでも、青がからむようにしてもそれぞれ違いが楽しめます。
public void drawRdm() {
dx = 8;
int x = (int)(400*Math.random());
int y = (int)(300*Math.random());
int xx = (int)(dx*Math.random()*2-dx);
int yy = (int)(dx*Math.random()*2-dx);
for(int i=0; 100>i; i++){
nextColor();
x += (int)(xx+dx*Math.random()-dx/2);
y += (int)(yy+dx*Math.random()-dx/2);
int h = (int)(20*Math.random()+5);
bfg.fillOval(x-h/2,y-h/2,h,h);
}
}
こうなります

円を直線上に配置し、角度と進み具合をランダムにしています。
クリック数を多くするとまた印象が変わります。

ヒントだけ。線と円、四角を組み合わせたり、文字を使うという手もあります。
例の2から3まで同じnextColor()を使っています。これも変えるとまた違ったものになります。
元になるプログラムのdrawRdm()の部分を次のように書き換えます。nextColor()の部分は例1のようにしても、元のままでも、青がからむようにしてもそれぞれ違いが楽しめます。
public void drawRdm() {
int x = (int)(400*Math.random());
int y = (int)(300*Math.random());
for(int i=255; i>0; i--){
nextColor();
int h = i;
bfg.fillOval(x-h/2,y-h/2,h,h);
}
}
こうなります

円の中心をランダムに設定し、半径を255から順に1ずつ小さくして同心円を描いています。
元になるプログラムのdrawRdm()の部分を次のように書き換えます。nextColor()は使いませんので変更してもしなくても変わりません。
public void drawRdm() {
int x = (int)(400*Math.random());
int y = (int)(300*Math.random());
int rgb = (int)(3*Math.random()); // rgb=0 or 1 or 2
for(int i=255; i>0; i--){
if (rgb==0) c = new Color(255-i,0,0);
if (rgb==1) c = new Color(0,255-i,0);
if (rgb==2) c = new Color(0,0,255-i);
bfg.setColor(c);
int h = i;
bfg.fillOval(x-h/2,y-h/2,h,h);
}
}
こうなります

nextColorを使わず、半径に応じて色が明るくなるように直接色を指定します。Color(255-i,0,0)はiが小さくなると明るい赤になります。赤緑青のどれになるかはrgbの値が0,1,2のどれかになることを利用してifで判断します。
nextColor(rgb);をnextColor(rgb,255-i);にすることで色をランダムでなくiを使った色に指定しています。255-iでなくただのiにすると中央部が明るい円になります。
元になるプログラムのdrawRdm()の部分を次のように書き換えます。nextColor()は使いませんので変更してもしなくても変わりません。
public void drawRdm() {
int x = (int)((400-140)*Math.random());
int y = (int)((300-140)*Math.random());
int rgb = (int)(3*Math.random()); // rgb=0 or 1 or 2
for(int i=255; i>0; i--){
if (rgb==0) c = new Color(255-i,0,0);
if (rgb==1) c = new Color(0,255-i,0);
if (rgb==2) c = new Color(0,0,255-i);
bfg.setColor(c);
int h = (int)(i/2);
bfg.fillOval(x,y,h,h);
}
}
こうなります

例6のh=iをh = (int)(i/2) にしています。つまり大きさが半分。円の中心を合わせるための x-h/2,y-h/2 を ただの x,y にするとこの様な形ができます。