11/11の課題について


問題のポイント


解答例(1)

/**********************************************************
  月と雪だるま                     
***********************************************************/

import java.awt.*;       //AWTを使うためにインポート
import java.awt.event.*; //イベント用にインポート
import java.util.*;      //乱数のためにインポート

class Kadai1111 extends Frame{

    Random r=new Random(); //雪の描画用に乱数を宣言する

    public Kadai1111(String title){
	super(title);
	addKeyListener(
            new KeyAdapter(){
		    public void keyPressed(KeyEvent e){ //何かキーが押されたときに呼び出される
	            int key=e.getKeyChar();
	            if(key=='q') System.exit(0); //qを押したら終了
	        }
            }
        );
    }

    public static void main(String[] args){
	Kadai1111 frame=new Kadai1111("Kadai1111");
	frame.setSize(400,400); //ウインドウのサイズを400,400にする
	frame.setVisible(true); //ウインドウを見せる
    }

    public void paint(Graphics g){
	g.setColor(Color.black); //黒色
	g.fillRect(0,0,400,400); //全体を塗り潰す

	//月の描画
	g.setColor(new Color(220,220,100)); //薄い黄色
	g.fillOval(75,75,50,50);
	g.setColor(Color.black);
	g.fillOval(100,100,30,30);

	//雪原(背面)の描画
	for (int i=0;i< 200;i++){
	    g.setColor(new Color(i+55,i+55,i+55)); //グラデーション
	    g.drawLine(0,i+200,400,i+200);
	}

	//雪の描画
	g.setColor(Color.white); //白色
	for (int i=0;i< 300;i++){ //乱数を使って雪の座標を決める
	    int snowX=r.nextInt(400);
	    int snowY=r.nextInt(400);
	    int snowR=r.nextInt(5)+1;
	    g.fillOval(snowX,snowY,snowR,snowR);
	}

	//雪だるま下の描画
	for (int i=1;i<=20;i++){
	    g.setColor(new Color(i*3+195, i*3+195, i*3+195)); //グラデーション
	    g.fillOval(200-(int)((25-i)*2.5*.8), 300-(int)((25-i)*2.5*.8), (int)((25-i)*2.5*2), (int)((25-i)*2.5*2));
	}

	//雪だるま上の描画
	for (int i=1;i<=20;i++){
	    g.setColor(new Color(i*3+195, i*3+195, i*3+195)); //グラデーション
	    g.fillOval(200-(int)((25-i)*2*.8), 220-(int)((25-i)*2*.8), (int)((25-i)*2*2), (int)((25-i)*2*2));
	}

	//顔の描画
	g.setColor(new Color(250,200,150)); //オレンジ
	int[] xs={170,195,200,202,200,195};
	int[] ys={241,231,234,241,249,252};
	g.fillPolygon(xs,ys,6); //鼻の描画
	g.setColor(Color.black); //黒色
	g.fillArc(180,210,10,20,20,320); //左目の描画
        g.fillArc(210,210,10,20,20,320); //右目の描画
    }
}
コメント

解答例(2)

// XXXX XXXX
// 11/11の課題 雪だるまと月
// 線対称な雪だるま2体を並べ、月にはグラデーションをかけてみました。
// 傾いた楕円を簡単に描く方法がわからなかったので、ベジェ曲線を使いました。
// 木を描画するメソッドを作り、背後に大量に並べる予定でしたが、あえなく時間切れに。

// AWTを使うので java.awt.*を import する
import java.awt.*;
// Graphics2を用いるため
import java.awt.geom.*;
// イベント駆動関係のクラスを用いるため
import java.awt.event.*;

// 独立したウィンドウを開くので,Frameクラスのサブクラスにする
class Kadai1111 extends Frame{

	public Kadai1111(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);
			}
		});
	}
	int r;
	public float x(float xx){
	return r*xx + 355f;
	}
	public int ix(float xx){
	return (int)x(xx);
	}
	public void paint(Graphics g){
		//Grapchis2Dを保存
	 	Graphics2D g2 = (Graphics2D)g;

		// 背景塗りつぶし
		g.setColor(new Color(30,20,90));
		g.fillRect(0,0,600,130);
		g.setColor(new Color(90,110,150));
		g.fillRect(0,130,600,430);
		
		// 雪だるま2体描画		
		for(r=-1;r<=1;r=r+2){
			
			// ボディ
			g.setColor(Color.white);
			g.fillOval(ix(100)-75,258,150,150);
			g.fillOval(ix(100)-60,168,120,120);
			// 腕
			GeneralPath arm = new GeneralPath(); 
			arm.moveTo(x(0),277.7f); 
			arm.lineTo(x(50.2f),302.3f); 
			arm.lineTo(x(45.5f),311.8f); 
			arm.lineTo(x(-4.6f),287.2f); 
			arm.closePath(); 
			g2.setColor(new Color(130,80,40)); 
			g2.fill(arm);
			// 鼻
			GeneralPath nose = new GeneralPath();
			nose.moveTo(x(30.0f),204.9f);
			nose.lineTo(x(42.7f),214.9f);
			nose.lineTo(x(46.1f),203.6f);
			nose.closePath();
			g2.setColor(Color.black);
			g2.fill(nose);
			// 目
			GeneralPath eye = new GeneralPath();
			eye.moveTo(x(62.3789f),201.4912f);
			eye.curveTo(x(61.3252f),204.6484f,x(58.9043f),206.6846f,x(56.9736f),206.04f);
			eye.curveTo(x(55.0439f),205.3955f,x(54.333f),202.3125f,x(55.3877f),199.1563f);
			eye.curveTo(x(56.4414f),196f,x(58.8623f),193.9639f,x(60.792f),194.6094f);
			eye.curveTo(x(62.7227f),195.2529f,x(63.4336f),198.3359f,x(62.3789f),201.4912f);
			eye.closePath();
			g2.setColor(Color.black);
			g2.fill(eye);
			// バケツここから
			// 側面
			GeneralPath bucket1 = new GeneralPath();
			bucket1.moveTo(x(114.6f),138.8f);
			bucket1.lineTo(x(156.1f),157.0f);
			bucket1.lineTo(x(150.1f),194.8f);
			bucket1.lineTo(x(90.8f),168.7f);
			bucket1.closePath();
			g2.setColor(new Color(80-r*70,10,80+r*70));
			g2.fill(bucket1);
			// 上面
			GeneralPath bucket2 = new GeneralPath();
			bucket2.moveTo(x(149.9395f),195.3574f);
			bucket2.curveTo(x(148.2129f),199.291f,x(133.5107f),196.6367f,x(117.1035f),189.4307f);
			bucket2.curveTo(x(100.6963f),182.2246f,x(88.7959f),173.1953f,x(90.5225f),169.2637f);
			bucket2.curveTo(x(92.25f),165.3291f,x(106.9512f),167.9834f,x(123.3604f),175.1885f);
			bucket2.curveTo(x(139.7666f),182.3945f,x(151.668f),191.4238f,x(149.9395f),195.3574f);
			bucket2.closePath();
			g2.setColor(new Color(80-r*70,10,80+r*70));
			g2.fill(bucket2);
			// 下面
			GeneralPath bucket3 = new GeneralPath();
			bucket3.moveTo(x(156.0068f),157.3721f);
			bucket3.curveTo(x(157.2334f),154.5791f,x(148.9102f),148.2256f,x(137.418f),143.1777f);
			bucket3.curveTo(x(125.9238f),138.1299f,x(115.6133f),136.2998f,x(114.3867f),139.0938f);
			bucket3.curveTo(x(113.1602f),141.8857f,x(121.4814f),148.2412f,x(132.9775f),153.2891f);
			bucket3.curveTo(x(144.4697f),158.3369f,x(154.7813f),160.165f,x(156.0068f),157.3721f);
			bucket3.closePath();
			g2.setColor(new Color(80-r*70,10,80+r*70));
			g2.fill(bucket3);
			// バケツここまで
		}
		
		// 月
		int i;
		for(i=16;i>=1;i--){
			g.setColor(new Color(248-3*i,(int)(240-2.5*i),224-i*4));
			g.fillOval((int)(40-1.25*i),(int)(20-0.625*i),5*i,5*i);
		}
	}
	public static void main(String[] args){
		Kadai1111 frame=new Kadai1111("Kadai1111");
		frame.setSize(600,430);
		frame.setVisible(true);
	}
}
コメント
講義で扱っていなかった Graphics2D クラスをうまく使っていますね.なお,「傾いた楕円を簡単に描く」には, 以下のように Graphics2Dクラスのオブジェクトの座標系に対して transform を呼び出して回転変換を加えてから楕円を描くと描くことができます.試してみてください.
// AWTを使うので java.awt.*をimport
import java.awt.*;
// AffineTransformを使うので java.awt.geom.*をimport
import java.awt.geom.*;

class Test extends Frame{
    Test(){
	// Frameクラスのコンストラクタ呼び出し
	super("Test");
	// ウィンドウのサイズを 400 x 400 に設定 
	setSize(400,400);
	// ウィンドウを画面に表示
	setVisible(true);
    }
    public static void main(String[] args){
	new Test();
    }
    public void paint(Graphics g){
	// cast演算子を使って,GraphicsクラスからGraphics2Dクラスにダウンキャスト
	Graphics2D g2=(Graphics2D)g;
	// 座標系を45度(π/4)回転させる
	g2.transform(AffineTransform.getRotateInstance(Math.PI/4));
	// (100,0)から幅100,高さ50で描いた楕円が原点を中心に45度傾いて描画される
	g2.drawOval(100,0,100,50);
    }
}

解答例(3)

// ===============================================
//  Kadai1111 "Snow Man"
//    for 11 Nov., 2003  PROGRAMMING I ( T.Tanaka )
//
//  Copyright(c) Jun Hatori, all rights reserved.
// ===============================================
//
//  XXXXX XXXX ---
//  *
//  * 月と雪だるまを描画するJAVAプログラムです。
//  * Graphicsクラスに含まれていない陰影のついた円を描く
//  * 関数、fill3DOvalを作ることによって、ソフトな印象を
//  * もった絵を描くことができました。
//  *

import java.awt.*;
import java.awt.event.*;

class Kadai1111 extends Frame {
  // ウィンドウのサイズ(タイトルバーを含む)
  static final int SIZE= 400;
  static final int X = SIZE, Y = SIZE;

  // 雪の個数
  static final int SNOW_NUMBER = 300;

  // fill3DOvalの陰影の強さ(0:なし, 1:線形, ...)
  static final int SHADE_STRENGTH = 20;

  // *
  // * Kadai1111のコンストラクタ
  // *   String title: ウィンドウのタイトル
  // *
  // *   外部からのnewは不可
  // *
  Kadai1111(String title) {
    super(title);
    addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent e){
	int key = e.getKeyChar();
	if(key == 'q') System.exit(0);
      }
    });
    addWindowListener(new WindowListener() {
      public void windowActivated(WindowEvent e) {}
      public void windowClosed(WindowEvent e) {}
      public void windowClosing(WindowEvent e) { dispose(); }
      public void windowDeactivated(WindowEvent e) {}
      public void windowDeiconified(WindowEvent e) {}
      public void windowIconified(WindowEvent e) {}
      public void windowOpened(WindowEvent e) {}
    });
  }

  // * アプリケーションのエントリポイント
  public static void main(String[] args) {
    Kadai1111 frame = new Kadai1111("Kadai1111");
    frame.setSize(X, Y);
    frame.setVisible(true);
  }

  // * 画像の描画
  public void paint(Graphics g) {
    // 空
    for(int n = 0; n <= Y*.7; n++) {
      g.setColor(new Color(0, 0, (int)(255 * (1 - n / (Y*.7)))));
      g.drawLine(0, n, X, n);
    }

    // 雪面
    for(int n = 0; n <= Y*.3; n++) {
      int c = (int)(255 * Math.pow(n / (Y*.3), .7));
      g.setColor(new Color(c, c, c));
      g.drawLine(0, (int)(n + Y*.7), X, (int)(n + Y*.7));
    }

    // 雪だるま
    fill3DOval(g, (int)(X*.55), (int)(Y*.50), (int)(SIZE*.30), (int)(SIZE*.30));
    fill3DOval(g, (int)(X*.60), (int)(Y*.32), (int)(SIZE*.20), (int)(SIZE*.20));
    g.setColor(new Color(96, 96, 96));
    fill3DOval(g, (int)(X*.63), (int)(Y*.40), (int)(SIZE*.04), (int)(SIZE*.04));
    fill3DOval(g, (int)(X*.73), (int)(Y*.40), (int)(SIZE*.04), (int)(SIZE*.04));
    fill3DOval(g, (int)(X*.69), (int)(Y*.45), (int)(SIZE*.02), (int)(SIZE*.02));

    // 月
    g.setColor(new Color(255, 255, 96));
    g.fillArc((int)(X*.10), (int)(Y*.10), (int)(X*.12),
              (int)(Y*.12), 240, 180);

    // 雪
    for(int n = 0; n < SNOW_NUMBER; n++) {
      int r = (int)((1 + Math.random()) * SIZE/120);
      int x = (int)(Math.random() * X);
      int y = (int)(Math.random() * Y);
      int c = (int)(239 + Math.random() * 16);
      g.setColor(new Color(c, c, c));
      fill3DOval(g, (int)(x - r/2), (int)(y - r/2), r, r);
    }
  }

  // * 陰影付の円を描画
  void fill3DOval(Graphics g, int x, int y, int xlen, int ylen) {
    Color c = g.getColor();
    int len = Math.max(xlen, ylen);
    int c_r, c_g, c_b;

    g.fillOval(x, y, xlen, ylen);

    x += xlen / 2;
    y += ylen / 2;

    for(float n = 0; n <= len / 2; n += 1.1 - n/len*2) {
      c_r = (int)(c.getRed() * (1 - .3*Math.pow(n / (len / 2), SHADE_STRENGTH)));
      c_g = (int)(c.getGreen() * (1 - .3*Math.pow(n / (len / 2), SHADE_STRENGTH)));
      c_b = (int)(c.getBlue() * (1 - .3*Math.pow(n / (len / 2), SHADE_STRENGTH)));
      // 周辺部にいくにしたがって、陰影が現れる
      g.setColor(new Color(c_r, c_g, c_b));
      g.drawOval((int)(x - n), (int)(y - n), (int)(n*2), (int)(n*2));
    }

    g.setColor(c);
  }
}

解答例(4)

//名前:XXX
//学生証番号:XXXX
//説明↓
//月(青い円)を雪だるまの頭と見立てた絵を描くプログラム。
//星、雪にランダム要素を持たせて起動するごとに変わるようにしている。

//AWTを使うので java.awt.*を import する
import java.awt.*;
//イベント駆動関係のクラスを用いるため
import java.awt.event.*;
//ランダム要素に必要
import java.util.*;

//独立したウィンドウを開くので,Frameクラスのサブクラスにする
class Kadai1111 extends Frame{
 
  public Kadai1111(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+")");
	//qを入力するとプログラムを抜ける。
	if(key=='q') System.exit(0);
      }
    });
  }
  public static void main(String[] args){
      Kadai1111 frame=new Kadai1111("Kadai1111");
      frame.setSize(400,400);
      frame.setVisible(true);
  }

  public void paint(Graphics g){
      //乱数の元となるオブジェクトを作成
      Random r=new Random();

      //背景の設定
      g.setColor(Color.black);
      g.fillRect(0,0,400,400);
      g.setColor(Color.gray);
      g.fillRect(0,251,400,400);

      //星をランダムに作成
      //画面上部にのみ作成
      g.setColor(Color.yellow);
      for(int i=0;i<=25;i++){
	  //1-400までの乱数を作成
	  int starx=r.nextInt(399)+1;
	  //1-200までの乱数を作成
	  int stary=r.nextInt(199)+1;
	  g.fillOval(starx,stary,5,5);
      }

      //だるま部分
      g.setColor(Color.white);
      g.fillOval(125,175,150,150);
      g.setColor(Color.black);
      g.drawArc(125,175,150,150,315,270);
      g.setColor(Color.cyan);
      g.fillOval(160,95,80,80);

      //リボン部分
      g.setColor(Color.red);
      int[] ribbonx={180,180,200,220,220,200};
      int[] ribbony={190,220,210,220,190,200};
      g.fillPolygon(ribbonx,ribbony,6);

      //棒部分
      g.setColor(Color.green);
      int[] stick1x={160,155,135,140};
      int[] stick1y={210,215,155,150};
      g.fillPolygon(stick1x,stick1y,4);
      int[] stick2x={240,245,265,260};
      g.fillPolygon(stick2x,stick1y,4);

      //サングラス部分
      g.setColor(Color.black);
      int[] sunglassesx={155,140,260,245,220,200,180};
      int[] sunglassesy={125,120,120,125,140,125,140};
      g.fillPolygon(sunglassesx,sunglassesy,7);
      g.setColor(Color.white);
      g.drawPolygon(sunglassesx,sunglassesy,7);

      //手袋部分
      g.setColor(Color.red);
      int[] hand1x={145,149,134,130};
      int[] hand1y={145,157,172,160};
      g.fillPolygon(hand1x,hand1y,4);
      g.fillOval(95,110,54,54);
      int[] hand2x={255,251,266,270};
      g.fillPolygon(hand2x,hand1y,4);
      g.fillOval(251,110,54,54);

      //雪を降らせる。
      //こっちは画面全体
      g.setColor(Color.white);
      for(int j=0;j<=50;j++){
	  //1-400までの乱数を作成
	  int snowx=r.nextInt(399)+1;
	  //1-400までの乱数を作成
	  int snowy=r.nextInt(399)+1;
	  g.fillOval(snowx,snowy,5,5);
      }
 
  }
}


解答例(5)

  //XXXX
  //XXXXXX
  //雪だるまと月の絵
  //林の中にある雪だるまを遠近感を感じられるように描いた
  // AWTを使うので java.awt.*を import する
import java.awt.*;
  // イベント駆動関係のクラスを用いるため
import java.awt.event.*;

  // 独立したウィンドウを開くので,Frameクラスのサブクラスにする
class Kadai1111 extends Frame{

  // この中で, 表示する際に必要なインスタンス変数を宣言しておく
  // int x=100,y=100;

  public Kadai1111(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){
    Kadai1111 frame=new Kadai1111("Kadai1111");
    frame.setSize(400,400);
    frame.setVisible(true);    
  }
  public void paint(Graphics g){

    // インスタンス変数にしたがって描画するコードを書く
     
      //背景の色を決める
       //空の色は青
      g.setColor(Color.blue);
      g.fillRect(0,0,400,240);
       //地面の色はが積もっているように見えるように白
      g.setColor(Color.white);
      g.fillRect(0,240,400,400);
      
      //月を描く
      g.setColor(Color.yellow);
      g.fillOval(50,30,50,50);
      
      //背景の道を遠近感がでるように描く
      g.setColor(new Color(200,100,20));
      int[] xs0={50,280,370,390};
      int[] ys0={400,280,280,400};
      g.fillPolygon(xs0,ys0,4);
      g.drawArc(267,260,20,20,290,145);
      g.drawArc(290,240,80,85,5,90);
      g.drawLine(335,240,145,240);
      g.drawLine(275,260,140,250);
      g.fillRect(130,240,210,15);
      int[] xs1={140,330,350,275};
      int[] ys1={250,240,260,260};
      g.fillPolygon(xs1,ys1,4);
      g.fillRect(288,255,72,32);
      g.fillArc(290,240,80,85,5,90);
      g.fillRect(275,258,15,5);
      g.fillRect(280,262,10,2);
      g.fillRect(285,275,10,10);
      g.fillRect(286,269,5,1);
     
      //雪だるまを描く
      g.setColor(Color.white);
       //胴体の一部が頭部にかぶるように胴体を描く
      g.setColor(Color.white);
      g.fillOval(85,230,100,100);
      g.setColor(Color.white);
      g.setColor(Color.black);
      g.drawOval(85,230,100,100);
       //頭部を描く
      g.setColor(Color.white);
      g.fillOval(100,170,70,70);   
       //腕を胴体の途中から生えているように見えるように描く
      g.setColor(new Color(220,100,20));
      g.drawLine(100,260,65,200);
      g.drawLine(170,260,205,200);     
      //頭に載っているバケツを描く
      g.setColor(Color.red);
      g.fill3DRect(120,146,30,25,false);
       //石の目を描く
      g.setColor(Color.gray);
      g.fillOval(120,190,10,16);
      g.fillOval(145,190,10,16);       
       //葉っぱの口を描く
      g.setColor(new Color(0,100,0));
      g.fillOval(125,220,22,10);

      //木を遠近感がでるように近いものほど大きく、明るく描く
      g.setColor(new Color(100,50,0));
      g.fillRect(10,0,30,380);
      int[] xs2={40,100,180,190,110,40};
      int[] ys2={100,75,0,0,85,115};
      g.fillPolygon(xs2,ys2,6);

      g.setColor(new Color(80,35,0));
      g.fillRect(380,160,13,105);

      g.setColor(new Color(50,20,0));
      g.fillRect(365,175,8,70);
      g.fillRect(350,185,5,55);
      
      g.setColor(new Color(120,60,0));
      int[] xs3={400,350,270,250,330,215,160,145,200,400};
      int[] ys3={145,125,0,0,125,80,0,0,90,180};
      g.fillPolygon(xs3,ys3,10);
  }
}


解答例(6)

//XXXX
//XXXX
//
//AWTを使うのでjava.awt.*のimportを行う
import java.awt.*;
//イベント駆動関係のクラスを用いるために必要
import java.awt.event.*;
//独立したウィンドウを開くので、Frameクラスのサブクラスにする
class Kadai1111 extends Frame{
//表示する際に必要なインスタンス変数を宣言する
    int x=600,y=100;
    int a=150,b=300;
    int c=125,d=390;
    int e=170,f=325;
    int h=210,i=325;
    int j=182,k=340;
    int l=214,m=340;
    int n=190,o=380;
  public Kadai1111(String title){
      super(title);
//GUI部品と、Event Listenerを関連づけるKeyAdapterは、KeyListnerを
//実装して中身は何もないクラス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){
    Kadai1111 frame=new Kadai1111("Kadai1111");
    frame.setSize(800,600);
    frame.setVisible(true);    
  }
    public void paint(Graphics g){
//背景の色を濃紫色に染める
      g.setColor(new Color(50,50,100));
      g.fillRect(0,0,800,600);
//(0,0)から幅800,高さ400の部分を黒色に染める
      g.setColor(Color.black);
      g.fillRect(0,0,800,400);
//黄色の円形の月を描く
      g.setColor(Color.yellow);
      g.fillOval(x,y,150,150);
//雪だるまの上の円を描く
      g.setColor(Color.white);
      g.fillOval(a,b,100,100);
//雪だるまの下の円を描く
      g.setColor(Color.white);
      g.fillOval(c,d,160,160);
//雪だるまの左眉(長方形)を描く
      g.setColor(Color.red);
      g.fillRect(e,f,25,10);
//雪だるまの右眉を描く
      g.setColor(Color.red);
      g.fillRect(h,i,25,10);
//雪だるまの左目(円)を描く
      g.setColor(Color.red);
      g.fillOval(j,k,8,8);
//雪だるまの右目を描く
      g.setColor(Color.red);
      g.fillOval(l,m,8,8);
//雪だるまの口(文字の"へ")を描く
      g.setFont(new Font("Courier",Font.BOLD,30));
      g.drawString("へ",n,o);

 }
}
コメント
口に「へ」の文字を使っているのがポイントですね.

解答例(7)

// 名前 : XXXX
// 学生証番号 : XXXXX
// 説明 : AWTにより月と雪だるまを描画するプログラム

// AWTを使うので java.awt.*を import する
import java.awt.*;
// イベント駆動関係のクラスを用いるため
import java.awt.event.*;
// Randomクラスを使うために必要
import java.util.*;

// 独立したウィンドウを開くので,Frameクラスのサブクラスにする
class Kadai1111 extends Frame{

    // この中で, 表示する際に必要なインスタンス変数を宣言しておく
    // (x1,y1)が月, (x2,y2)が雪だるまの座標を表す
    int x1=60,y1=45,x2=230,y2=200;
    int i;

    public Kadai1111(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){
	Kadai1111 frame=new Kadai1111("Kadai1111");
	frame.setSize(400,400);
	frame.setVisible(true);    
    }
    public void paint(Graphics g){

	// インスタンス変数にしたがって描画するコードを書く
	// 夜の空
	g.setColor(new Color(25,25,112));
	g.fillRect(0,0,400,400);

	// 一面の雪にやや丸い地平線
	g.setColor(new Color(245,255,250));
	g.fillOval(-600,220,1600,360);

	// 三日月
	g.setColor(new Color(255,255,204));
	g.fillOval(x1,y1,46,46);
	g.setColor(new Color(25,25,112));
	g.fillOval(x1-29,y1-29,69,69);

	// 雪だるまの影
	g.setColor(new Color(245,245,245));
	g.fillOval(x2+37,y2+75,100,50);

	// 雪だるま(下)
	g.setColor(new Color(255,250,250));
	g.fillOval(x2,y2,100,100);

	// 雪だるま(上)
	g.fillOval(x2+10,y2-65,80,80);

	// "口"
	g.setColor(Color.black);
	g.fillRect(x2+32,y2-18,19,3);

	// "鼻(小枝)"
	g.setColor(new Color(128,0,0));
	int[] xs0={x2+15,x2+15,x2+40,x2+40};
	int[] ys0={y2-28,y2-25,y2-25,y2-31};
	g.fillPolygon(xs0,ys0,4);

	// "帽子(バケツ)"
	g.setColor(Color.red);
	int[] xs1={x2+35,x2+85,x2+83,x2+53};
	int[] ys1={y2-63,y2-45,y2-74,y2-84};
	g.fillPolygon(xs1,ys1,4);

	// Randomに雪を降らせる
	// 乱数の元となるオブジェクトを作成
	Random r=new Random();
	for(i=0;i< 1500;i++){
	    // sx = (x座標の目安)
	    int sx=r.nextInt(800)+1;
	    // sy = (y座標の目安)
	    int sy=r.nextInt(800)+1;
	    // ss = (雪の大きさ)
	    int ss=r.nextInt(5)+3;
	    g.setColor(Color.white);
	    g.fillOval(sx-200,sy-200,ss,ss);
	    g.setColor(new Color(230,230,250));
	    g.drawOval(sx-200,sy-200,ss,ss);
	}

	// 雪だるまの"目"
	g.setColor(Color.black);
	g.fillOval(x2+30,y2-45,6,6);
	g.fillOval(x2+50,y2-45,6,6);
    }
}
コメント
雪を半径の違う2つの円で表したり,影をつけたりなど,細かいところで工夫をしています.

解答例(8)

//氏名 XXXX
//学生番号 XXXX
//絵を書くプログラム

 // AWTを使うので java.awt.*を import する
import java.awt.*;
  // イベント駆動関係のクラスを用いるため
import java.awt.event.*;
//雪をつくるRandom の関数を導入する
import java.util.*;
  // 独立したウィンドウを開くので,Frameクラスのサブクラスにする
class Kadai1111 extends Frame{

  // この中で, 表示する際に必要なインスタンス変数を宣言しておく
     public Kadai1111(String title){
    super(title);
      // GUI部品と,Event Listenerを関連づける
      // KeyAdapterは,KeyListenerを実装して中身は何もないクラス
      // new クラス名(){} で,「クラス名」の名前のない子クラスを定義すると同時に
      // インスタンスを作る
    addKeyListener(new KeyAdapter(){
      public void keyPressed(KeyEvent e){
       if(e.getKeyChar()=='q') System.exit(0);
      }
    });
  }
  public static void main(String[] args){
    Kadai1111 frame=new Kadai1111("Kadai1111");
    frame.setSize(400,400);
    frame.setVisible(true);   
  }
  public void paint(Graphics g){
    // インスタンス変数にしたがって描画するコードを書く
    //黒い空を長方形として描く
    g.setColor(Color.black);
    g.fillRect(0,0,400,200);
    //灰色の地を長方形として描く
    g.setColor(Color.lightGray);
    g.fillRect(0,200,400,400);  
    //Color c を作る
    Color c = new Color(255, 255,170);
    g.setColor(c);
    //月を点(37,76)から、幅52長さ52の円として描く
    g.fillOval(37,76,52,52);
    //月は"C”の形にするため
    g.setColor(Color.black);
    g.fillOval(50,66,60,60);
   //雪だるまの頭を描く
    g.setColor(Color.white);
    g.fillOval(200,150,80,80); 
   //雪だるまの体を描く
    g.fillOval(180,210,120,120);
   //雪だるまの目を描く
    g.setColor(Color.black);
    g.fillOval(215,172,10,10);
    g.fillOval(235,172,10,10);
   //雪だるまの鼻を三角形として描く
    g.setColor(Color.blue);
    int[] x1={232,232,210};
    int[] y1={185,195,190};
    g.fillPolygon(x1,y1,3);
   //雪だるまのスカーフを描く
    g.setColor(Color.red);
    g.fillArc(210,191,40,20,180,180);
    g.fillRoundRect(200,215,80,8,15,15);
    g.fillArc(200,212,80,18,180,180);
    g.fillRoundRect(200,215,20,70,15,15);
    g.fillRoundRect(260,215,20,70,15,15);
    g.fillRect(200,260,20,40);
    g.fillRect(260,260,20,40);
   //スカーフのばらばらのところを各線として描く
    int x=200;
    for(int i=0;i<10;i++)
    {
    g.drawLine(x,295,x,315);
    g.drawLine(x+60,295,x+60,315);
    x+=2;
    }
    //雪だるまのボタンを描く
    g.setColor(Color.black);
    x=245;
    for(int i=0;i<4;i++)
    {
    g.fillOval(228,x,10,10);
    x+=22;
    }
    //雪だるまの帽子を描く
    g.setColor(Color.red);
    g.fillArc(215,155,50,10,180,180);
    int[] x2={215,240,265};
    int[] y2={160,110,160};
    g.fillPolygon(x2,y2,3);
    //雪景色を描く
   //雪の滴をランダム位置に、ランダム直径の円として描く
    g.setColor(Color.white);
    Random r=new Random();
    //x3,y3,r3はそれぞれ雪の各位置と直径である
   int x3,y3,r3;
    int i=0;
    while( i!=80)
     {  x3=r.nextInt(399)+1;
       y3=r.nextInt(120)+1;
        r3=r.nextInt(6)+1;
       if(x3>80 ) {g.fillOval(x3,y3,r3,r3);i++;}
      }
     i=0;
     while( i!=120)
     {  x3=r.nextInt(179)+1;
       y3=r.nextInt(399)+1;
        r3=r.nextInt(8)+1;
       if(y3>119 && r3>4) {g.fillOval(x3,y3,r3,r3);i++;}
      }
      i=0;
     while( i!=70)
     {  x3=r.nextInt(399)+1;
       y3=r.nextInt(399)+1;
        r3=r.nextInt(8)+1;
       if(y3>121 && r3>4 && x3>290) {g.fillOval(x3,y3,r3,r3);i++;}
      }
     i=0;
     while( i!=20)
     {  x3=r.nextInt(289)+1;
       y3=r.nextInt(399)+1;
        r3=r.nextInt(8)+1;
       if(y3>330 && x3>180 && r3>4) {g.fillOval(x3,y3,r3,r3);i++;}
      }
   }
}

その他の作品