上の絵と似ていない絵を描くプログラム Kadai1108 を完成させて下さい(月 と雪ダルマが描かれればどんなものでも合格とします). プログラムはキー'q' を押すと正常終了するようにしてください.
// AWTを使うので java.awt.*を import する
import java.awt.*;
// イベント駆動関係のクラスを用いるため
import java.awt.event.*;
// 独立したウィンドウを開くので,
class Kadai1108 extends Frame{
public Kadai1108(String title){
super(title);
// GUI部品と,Event Listenerを関連づける
// KeyAdapterは,KeyListenerを実装して中身は何もないクラス
// new クラス名(){} で,「クラス名」の名前のない子クラスを定義すると同時に
// インスタンスを作る
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
int key=e.getKeyChar();
System.out.println("keyPressed("+e+","+key+")");
if(key=='q') System.exit(0);
}
});
}
public static void main(String[] args){
Kadai1108 frame=new Kadai1108("Kadai1108");
frame.setSize(400,400);
frame.setVisible(true);
}
public void paint(Graphics g){
// この部分を埋めてください.
}
}
public void paint(Graphics g){
g.setColor(Color.black); // 使う色を黒に変更する
g.fillRect(0,0,400,200); //上の方を黒くする
g.setColor(Color.gray); // 使う色を灰色に変更する
g.fillRect(0,200,400,400); //下の方を白くする
g.setColor(Color.yellow);//使う色を黄色に変更
g.fillArc(270,85,70,70,0,360);// 円(月)を描く
g.setColor(Color.white);//使う色を白に変更
g.fillArc(50,220,100,100,0,360);// 円(雪だるまの頭)を描く
g.fillArc(40,310,120,120,0,360);// 円(雪だるまの胴体)を描く
g.setColor(Color.black); // 使う色を黒に変更する
g.fillArc(82,255,9,9,0,360);// 円(雪だるまの左目)を描く
g.fillArc(107,255,9,9,0,360);// 円(雪だるまの右目)を描く
g.setColor(Color.red);//使う色を赤色に変更
g.fillArc(94,275,9,9,0,360);// 円(雪だるまの鼻)を描く
g.setColor(new Color(150,200,255));//使う色を青っぽい色に変更
g.fillArc(94,345,9,9,0,360);//胴体の模様を描く
g.fillArc(94,367,9,9,0,360);//胴体の模様を描く
g.fillArc(94,389,9,9,0,360);//胴体の模様を描く
}
// 040252I XXXXXX
//月の上に佇む雪だるまを描くプログラム。
// AWTを使うので java.awt.*を import する
import java.awt.*;
// イベント駆動関係のクラスを用いるため
import java.awt.event.*;
class Kadai1108 extends Frame{
public Kadai1108(String title){
super(title);
// GUI部品と,Event Listenerを関連づける
// KeyAdapterは,KeyListenerを実装して中身は何もないクラス
// new クラス名(){} で,「クラス名」の名前のない子クラスを定義すると同時に
// インスタンスを作る
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
int key=e.getKeyChar();
System.out.println("keyPressed("+e+","+key+")");
if(key=='q') System.exit(0);
}
});
}
public static void main(String[] args){
Kadai1108 frame=new Kadai1108("Yukidaruma");
frame.setSize(500,600);
frame.setVisible(true);
}
/* 月形を書くメソッド。始角90度,時計回りに180度に限る。
x,y 一番上の部分の座標
r 半径
h 月の膨らみ程度(-100(満月)から100(新月)まで)
(本当は,このメソッドを含むGraphicsクラスのサブクラスを作りたかったのですが,
抽象クラスが何とかというエラーが克服できそうに無いので諦めました。
Graphicsクラスのgを引数に持つという気持悪さは何とかしたいのですが。 */
public void drawMoon(Graphics g,int x,int y,int r,int h){
int xs0[] =new int[r*4];
int ys0[] =new int[r*4];
double xx=0,yy=r;
int m;
//円弧を多角形として描く。
//右側の円弧
for(m=0;m< 2*r;m++){
xs0[m]=(int)(xx+x);
ys0[m]=(int)(y+r-yy);
yy=yy-1;
xx=Math.pow(r*r-yy*yy,0.5);
}
//左側の円弧
for(;m< 4*r;m++){
xs0[m]=(int)(xx+x);
ys0[m]=(int)(y+r-yy);
yy=yy+1;
xx=Math.pow(r*r-yy*yy,0.5)*h/100;
}
//描画
g.fillPolygon(xs0,ys0,m);
}
public void paint(Graphics g){
int n;
int m;
int x,y,xx,yy;
int r;
//背景
g.setColor(new Color(0,15,0));
g.fillRect(0,0,600,600);
g.setColor(new Color(225,225,255));
//星(雪?)
for(n=0;n< 50;n++){
g.fillOval((int)(Math.random()*400),(int)(Math.random()*400),2,2);
}
//月
for(n=-100;n<=100;n=n+10){
g.setColor(new Color(205-n/2,205-n/2,180));
drawMoon(g,200,300,800,n);
}
//月面の雪
n=0;
while(n< 150){
if(n<2){
x=320;
y=330;
}else{
x=(int)(Math.random()*600-n*2)-100+n*2;
y=(int)(Math.random()*300)+200;
}
if(((x-200)*(x-200)+(y-1100)*(y-1100))<=(800*800)){
m=0;
while(m<100){
xx=(int)(Math.random()*60+x-30);
yy=(int)(Math.random()*60+y-30);
if((xx-x)*(xx-x)+(yy-y)*(yy-y)<900){
if(((xx-200)*(xx-200)+(yy-1100)*(yy-1100))<=(801*801)){
r=200+(int)(Math.random()*55);
g.setColor(new Color(r,r,255));
g.fillOval(xx,yy,3,3);
m++;
}
}
}
n++;
}
}
//雪だるまの鼻
g.setColor(new Color(200,0,0));
int xs0[]={295,310,310};
int ys0[]={260,255,265};
g.fillPolygon(xs0,ys0,3);
//雪だるま本体
for(n=0;n<5;n++){
g.setColor(new Color(205+n*10,205+n*10,255));
g.fillOval(300,240+n,40-2*n,40-2*n);
g.fillOval(295,270+2*n,50-2*n,50-2*n);
}
//雪だるまの帽子
g.setColor(new Color(100,100,210));
int xs1[]={310,330,340,300};
int ys1[]={230,230,250,250};
g.fillPolygon(xs1,ys1,4);
//雪だるまの手(箒)
g.setColor(new Color(150,100,120));
x=315;y=300;xx=320;yy=280;
g.drawLine(x,y,xx,yy);
double k;
for(k=0;k<20;k++){
g.drawLine(xx,yy,xx+(int)(30*Math.cos((0.2+k/100)*3.14)),
yy-(int)(30*Math.sin((0.2+k/100)*3.14)));
}
}
}
//XXXXXX XXXXX
//Kadai1108.java
//AWTのテストプログラム
//400x400で月と骸骨型雪だるまを表示
//'q'の入力で終了
import java.awt.*;
import java.awt.event.*;
class Kadai1108 extends Frame{
public Kadai1108(String title){
super(title);
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
int key=e.getKeyChar();
System.out.println("keyPressed("+e+","+key+")");
if(key=='q') System.exit(0);
}
});
}
public static void main(String[] args){
Kadai1108 frame=new Kadai1108("Kadai1108");
frame.setSize(400, 400);
frame.setVisible(true);
}
public void paint(Graphics g){
//背景色
g.setColor(Color.black);
g.fillRect(0, 0, 400, 400);
//月の描画
g.setColor(new Color(255, 200, 0));
g.fillOval(210, 90, 180, 180);
g.setColor(Color.black);
g.fillOval(210, 110, 140, 140);
g.setColor(Color.red);
int[] xs = {350, 330, 350};
int[] ys = {175, 185, 185};
g.fillPolygon(xs, ys, 3);
g.drawLine(348, 200, 368, 200);
g.setColor(Color.blue);
g.drawLine(348, 160, 368, 160);
//地面の描画
g.setColor( Color.gray );
g.fillRect( 0, 350, 400, 50 );
//骸骨のオブジェクトを生成し描画
Skeleton s = new Skeleton( 20, 35, g );
s.drawSkeleton();
}
}
//骸骨のクラス
class Skeleton {
int x, y;
Graphics g;
public Skeleton(int x0, int y0, Graphics g0){
x = x0;
y = y0;
g = g0;
}
public void drawSkeleton(){
g.setColor( Color.white );
g.fillRect( x, y+75, 10, 40 ); //右前腕
g.fillRect( x+160, y+75, 10, 40 ); //左前腕
g.fillRect( x+60, y+65, 50, 100 ); //体
g.fillRect( x+10, y+65, 40, 10 ); //右二の腕
g.fillRect( x+120, y+65, 40, 10 ); //左二の腕
g.fillRect( x+60, y+185, 10, 50 ); //右腿
g.fillRect( x+100, y+185, 10, 50 ); //左腿
g.fillRect( x+60, y+255, 10, 50 ); //右すね
g.fillRect( x+100, y+255, 10, 50 ); //左すね
g.fillRect( x+50, y+305, 20, 10 ); //右足
g.fillRect( x+100, y+305, 20, 10 ); //左足
g.fillOval( x+55, y, 60, 60 ); //頭
g.fillOval( x, y+115, 10, 10 ); //右手
g.fillOval( x+160, y+115, 10, 10 ); //左手
g.setColor( Color.red );
g.fillOval( x, y+65, 10, 10 ); //右肘
g.fillOval( x+160, y+65, 10, 10 ); //左肘
g.fillOval( x+50, y+65, 10, 10 ); //右肩
g.fillOval( x+110, y+65, 10, 10 ); //左肩
g.fillOval( x+60, y+170, 10, 10 ); //右足のつけね
g.fillOval( x+100, y+170, 10, 10 ); //左足のつけね
g.fillOval( x+60, y+240, 10, 10 ); //右膝
g.fillOval( x+100, y+240, 10, 10 ); //左膝
g.setColor( Color.black );
g.fillOval( x+65, y+10, 18, 18 ); //右目
g.fillOval( x+87, y+10, 18, 18 ); //左目
int[] xs = { x+80, x+85, x+90 };
int[] ys = { y+35, y+30, y+35 };
g.fillPolygon(xs, ys, 3); //鼻
g.drawLine( x+85, y+50, x+85, y+60 ); //口
g.drawLine( x+75, y+50, x+75, y+57 );
g.drawLine( x+95, y+50, x+95, y+57 );
}
}
解答例(2)に「本当は,このメソッドを含むGraphicsクラスのサブクラスを作 りたかったのですが, 抽象クラスが何とかというエラーが克服できそうに無い ので諦めました。Graphicsクラスのgを引数に持つという気持悪さは何とかし たいのですが。」とありましたが,Graphicsクラスのサブクラスを作成したと しても,paintの引数として渡ってくるgとそのクラスとの間の関係は親子関係 ではなく兄弟になってしまうので,解決することはできません.gを引数とし て引き回すのは面倒かもしれませんが,慣れてください.