11/9の課題の講評


講評


解答例(1)

作品



g410412

プログラム

////////////////////////////////////////////////////////////////////////////////
// プログラム名     : Kadai1109
// 作成者           : gXXXXXX XXXX
// プログラムの説明 : 月と雪だるまを描画するプログラム
// コメント         : お絵かきは嫌いですw雪だるまの原案はクラスの人に書いてもら
//                    いました。あまり再現できてないかも。
//                    無駄にオブジェクト指向なのはオプション課題で拡張するときに
//                    動かすことを考えたから。だんだん、(プログラム中の)コメント
//                    が手抜きになっていく
////////////////////////////////////////////////////////////////////////////////


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

abstract class Obje{//描画オブジェクトの基底クラス
  protected int px,py;
  protected int psize;
  
  Obje(int x,int y,int size){
    move(x,y,size);
  }

  abstract public void draw(Graphics g);
  public void move(int x,int y ,int size){
    px=x;
    py=y;
    psize=size;
  }
  protected void drawCircle(int x,int y,int size,Graphics g){//グラデーションのかかった円を描く関数
    while(size>0){
      g.setColor(new Color(255-size/2,255-size/2,255-size/4));//ちょっと青っぽく
      g.fillOval(x,y,size,size);

      x++;y++;size-=2;
    }
  }
}

class Info extends Obje{//著作権表示?用オブジェクト、クラスの人に雪だるまの原案を書いてもらったのでw
  Info(){
    super(350,450,0);
  }
  public void draw(Graphics g){
    g.setColor(Color.green);
    g.setFont(new Font("Courier",Font.BOLD,20));
    g.drawString("(C) 22組の暇なかたがた",px,py);
  }
}

class Moon extends Obje{//月クラス
  Moon(int x,int y){
    super(x,y,80);
  }
  public void draw(Graphics g){
    int size=psize;
    int x=px;
    int y=py;
    while(size>0){
      g.setColor(new Color(255-size,255-size,100));
      g.fillOval(x,y,size,size);

      x++;y++;size-=2;
    }
  }
}

class Yuki extends Obje{//雪クラス
  Yuki(int x,int y){
    super(x,y,10);
  }
  public void draw(Graphics g){
    drawCircle(px,py,psize,g);
  }
}

class Yukidaruma extends Obje{//雪だるまクラスその1
  Yukidaruma(int x,int y,int size){
    super(x,y,size);
  }
  public void draw(Graphics g){

    g.setColor(new Color(185,122,0));//腕
    int[] armxs1={px+psize*60/60,px+psize*58/60,px+psize*73/60,px+psize*75/60};
    int[] armys1={py+psize*60/60,py+psize*57/60,py+psize*47/60,py+psize*50/60};
    g.fillPolygon(armxs1,armys1,4);
    int[] armxs2={px+psize*2/60,px+psize*5/60,px-psize*5/60,px-psize*8/60};
    int[] armys2={py+psize*50/60,py+psize*48/60,py+psize*33/60,py+psize*35/60};
    g.fillPolygon(armxs2,armys2,4);

    g.setColor(Color.red);//帽子
    int[] hatxs={px+psize*45/60,px+psize*60/60,px+psize*70/60,px+psize*60/60};
    int[] hatys={py+psize*5/60,py-psize*5/60,py+psize*5/60,py+psize*20/60};
    g.fillPolygon(hatxs,hatys,4);
    
    drawCircle(px,py+psize/2,psize,g);//本体
    drawCircle(px+psize/3,py,psize*2/3,g);//頭

    drawCircle(px-psize*55/600-psize/12,py+psize*34/60-psize/12,psize/6,g);
    drawCircle(px+psize*74/60-psize/12,py+psize*485/600-psize/12,psize/6,g);

    g.setColor(Color.black);//眼
    g.fillOval(px+psize*7/12-psize/30,py+psize*2/12-psize/30,psize/15,psize/15);
    g.fillOval(px+psize*10/12-psize/30,py+psize*3/12-psize/30,psize/15,psize/15);

    g.setColor(Color.red);//ボタン
    g.fillOval(px+psize*13/24-psize/30,py+psize*9/12-psize/30,psize/15,psize/15);
    g.fillOval(px+psize*6/12-psize/30,py+psize*12/12-psize/30,psize/15,psize/15);
    g.fillOval(px+psize*11/24-psize/30,py+psize*15/12-psize/30,psize/15,psize/15);
    
    
  }
}

class Yukidaruma2 extends Obje{//雪だるまクラスその2
  Yukidaruma2(int x,int y,int size){
    super(x,y,size);
  }

  public void draw(Graphics g){

    g.setColor(new Color(185,122,0));//腕
    int[] armxs={px+psize*6/40,px+psize*6/40,px-psize*9/40,px-psize*9/40};
    int[] armys={py+psize*44/40,py+psize*46/40,py+psize*46/40,py+psize*44/40};
    g.fillPolygon(armxs,armys,4);
    int[] armxs2={px+psize*6/40,px+psize*7/40,px-psize*3/40,px-psize*6/40,px-psize*7/40,px-psize*4/40};
    int[] armys2={py+psize*41/40,py+psize*39/40,py+psize*29/40,py+psize*24/40,py+psize*26/40,py+psize*31/40};
    g.fillPolygon(armxs2,armys2,6);
    int[] armxs3={px+psize*6/40,px+psize*7/40,px-psize*3/40,px-psize*6/40,px-psize*7/40,px-psize*4/40};
    int[] armys3={py+psize*49/40,py+psize*51/40,py+psize*61/40,py+psize*66/40,py+psize*64/40,py+psize*59/40};
    g.fillPolygon(armxs3,armys3,6);
    int[] armxs4={px+psize*34/40,px+psize*34/40,px+psize*49/40,px+psize*49/40};
    int[] armys4={py+psize*44/40,py+psize*46/40,py+psize*46/40,py+psize*44/40};
    g.fillPolygon(armxs4,armys4,4);
    int[] armxs5={px+psize*34/40,px+psize*33/40,px+psize*43/40,px+psize*46/40,px+psize*47/40,px+psize*44/40};
    int[] armys5={py+psize*41/40,py+psize*39/40,py+psize*29/40,py+psize*24/40,py+psize*26/40,py+psize*31/40};
    g.fillPolygon(armxs5,armys5,6);
    int[] armxs6={px+psize*34/40,px+psize*33/40,px+psize*43/40,px+psize*46/40,px+psize*47/40,px+psize*44/40};
    int[] armys6={py+psize*49/40,py+psize*51/40,py+psize*61/40,py+psize*66/40,py+psize*64/40,py+psize*59/40};
    g.fillPolygon(armxs6,armys6,6);
    
    drawCircle(px,py+psize*5/4,psize,g);//胴
    drawCircle(px+psize*1/8,py+psize*3/4,psize*3/4,g);//胸
    drawCircle(px,py,psize,g);//頭

    g.setColor(new Color(185,122,0));//眼
    int[] eyexs={px+psize*10/40,px+psize*8/40,px+psize*13/40,px+psize*15/40};
    int[] eyeys={py+psize*20/40,py+psize*18/40,py+psize*13/40,py+psize*15/40};
    g.fillPolygon(eyexs,eyeys,4);
    int[] eyexs2={px+psize*30/40,px+psize*32/40,px+psize*27/40,px+psize*25/40};
    int[] eyeys2={py+psize*20/40,py+psize*18/40,py+psize*13/40,py+psize*15/40};
    g.fillPolygon(eyexs2,eyeys2,4);

    
  }
}

class Yukidaruma3 extends Obje{//雪だるまクラスその3
  Yukidaruma3(int x,int y,int size){
    super(x,y,size);
  }

  public void draw(Graphics g){
    g.setColor(new Color(185,122,0));//首
    g.fillRect(px+psize*27/60,py+psize*25/60,psize*6/60,psize*40/60);

    g.fillRect(px+psize*10/60,py+psize*105/60,psize*5/60,psize*25/60);//足
    g.fillRect(px+psize*20/60,py+psize*105/60,psize*5/60,psize*25/60);
    g.fillRect(px+psize*35/60,py+psize*105/60,psize*5/60,psize*25/60);
    g.fillRect(px+psize*45/60,py+psize*105/60,psize*5/60,psize*25/60);

    drawCircle(px+psize*15/60,py,psize*30/60,g);//頭
    drawCircle(px,py+psize,psize,g);//本体

    g.setColor(Color.black);//眼
    g.fillOval(px+psize*25/60-psize/30,py+psize*10/60-psize/30,psize/15,psize/15);
    g.fillOval(px+psize*35/60-psize/30,py+psize*10/60-psize/30,psize/15,psize/15);
  }
}
class Kadai1109 extends Frame{
  private Obje obje[];
  private void init(){//初期化関数、オブジェクト生成
    obje = new Obje[100];
    Random r=new Random();
    obje[0]=new Yukidaruma(50,180,180);
    obje[1]=new Yukidaruma2(300,100,100);
    obje[2]=new Yukidaruma3(450,130,130);
    
    obje[3]=new Moon(50,50);
    
    for(int i=4;i< 99;i++){
      obje[i]=new Yuki(r.nextInt(600),r.nextInt(480));
    }
    obje[99]=new Info();
  }
  
  public Kadai1109(String title){
    super(title);
    setResizable(false);//ウィンドウサイズを変えちゃダメ
    init();//初期化、オブジェクト生成

    //以下イベント処理
    addKeyListener(new KeyAdapter(){//キーボード入力
      public void keyPressed(KeyEvent e){//qで終了
        int key=e.getKeyChar();
        if(key=='q'){
          System.exit(0);
        }
      }
    });

    addWindowListener(new WindowAdapter(){//ウィンドウイベント?
      public void windowClosing(WindowEvent e) {//閉じる印で終了
        System.exit(0);
      }
    });
    
  }
  
  //メイン関数
  public static void main(String[] args){
    Kadai1109 frame=new Kadai1109("Kadai1109");
    frame.setSize(600,480);
    frame.setVisible(true);
  }
  
  //描画関数
  public void paint(Graphics g){

    //背景描画
    g.setColor(Color.black);
    g.fillRect(0,0,600,240);
    for(int i=240;i < 480;i++){
      g.setColor(new Color(i-240,i-240,i-225));//少し青っぽく
      g.fillRect(0,i,600,1);
    }

    //オブジェクト描画
    for(int i=0;i < 100;i++){
      obje[i].draw(g);
    }
  }
}

コメント

「無駄にオブジェクト指向 」と謙遜していますが,クラスの切り分け方やメソッドの 分け方も良い感じです.

解答例(2)

作品



g420198

プログラム

// 名前:XXXX
// 学生証番号:XXXXXX
// 説明:Kadai1109


import java.awt.*;
import java.awt.event.*;
import java.util.*;//乱数


class Kadai1109 extends Frame{

    Random random=new Random(); //乱数の宣言

    public Kadai1109(String title){
	super(title);
	addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent e){
		    int key=e.getKeyChar();
		    if(key=='q') System.exit(0);
		}
	    });
    }
    public static void main(String[] args){
	Kadai1109 frame=new Kadai1109("Kadai1109");
	frame.setSize(400,400);
	frame.setVisible(true);    
    }
    public void paint(Graphics g){
	//背景描画
	for (int i=0;i < 300;i++){
	    g.setColor(new Color((int)(255-0.15*i),(int)(255-0.15*i),(int)(255-0.2*i))); 
	    g.fillOval((int)(-100+i),(int)(-100+i),600-2*i,600-2*i);
	}

	//月の描画		
	for(int i=10;i>=1;i--){
	    g.setColor(new Color(248-3*i,(int)(240-2*i),224-4*i));
	    g.fillOval((int)(320-1*i),(int)(80-0.7*i),3*i,3*i);
	}

	//雪だるま下部描画
	for (int i=0;i <= 10;i++){//胴体
	    g.setColor(new Color(240+1*i,(int)(244+1*i),(int)(244+1*i)));
	    g.fillOval((int)(60+4*i),(int)(190+4*i),280-8*i,350-8*i);
	}
	for (int i=0;i <= 10;i++){ //ボタン
	    g.setColor(new Color((int)(80+17*i),(int)(90+16*i),(int)(80+17*i)));
	    g.fillOval((int)(195+0.5*i),(int)(295+0.5*i),(int)(17-0.7*i),(int)(14-1*i));
	    g.fillOval((int)(195+0.5*i),(int)(350+0.5*i),(int)(17-0.7*i),(int)(14-1*i));
	}

	g.setColor(new Color(165,175,145));//帽子の鍔の裏側
	g.fillArc(133,144,130,20,202,140);

	g.setColor(new Color(185,195,165));
	for (int i=0;i <= 10;i++){//マフラー左
	    g.drawArc((int)(175-0.5*i),(int)(235+0.5*i),(int)(65-1.2*i),(int)(120+1.2*i),10,70);
	}
	for (int i=0;i <= 15;i++){//マフラー右
	    g.drawArc((int)(190-1.3*i),(int)(225-0.5*i),85+8*i,140-i,90+2*i,90-2*i);
	}
	
	//雪の描画
	g.setColor(Color.white); 
	for (int i=0;i < 300;i++){ 
	    int snowX=random.nextInt(400);
	    int snowY=random.nextInt(400);
	    int snowR=random.nextInt(5)+1;
	    g.fillOval(snowX,snowY,snowR,snowR);
	}

	//雪だるま上部描画    
	for (int i=0;i<=10;i++){
	    g.setColor(new Color((int)(230+2.4*i),(int)(244+1*i),(int)(244+1*i)));//顔全体
	    g.fillOval((int)(140+1*i),(int)(129+4*i),120-2*i,115-5*i);
	}
	for (int i=0;i<=10;i++){
	    g.setColor(new Color((int)(240+1.4*i),(int)(170+7*i),(int)(60+15*i)));//鼻
	    g.fillOval((int)(188+0.35*i),(int)(183+0.4*i),(int)(27-0.7*i),(int)(14-0.9*i));
	}
	g.setColor(new Color(100,110,100));//目
	g.fillOval(182,173,7,6);
	g.fillOval(214,173,7,6);
	g.setColor(Color.white);
	g.fillOval(185,175,1,1);
	g.fillOval(217,175,1,1);
	g.setColor(new Color(200,200,200));//口
	g.drawArc(168,176,60,30,228,103);

	g.setColor(new Color(180,190,160));
	for (int i=0;i<=20;i++){//帽子本体
	    g.drawArc(162,117+i,75,20,355,190);
	}
	for (int i=0;i<=15;i++){//帽子の鍔
	    g.setColor(new Color(180+i,190+i,160+i));
	    g.drawArc((int)(163-1.7*i),135+i,(int)(80+3.3*i),20,30,150);
	}
    
	g.setColor(Color.white);
	for (int i=0;i< 10;i++){ 
	    int snowX=random.nextInt(400);
	    int snowY=random.nextInt(400);
	    g.drawLine(snowX,snowY-1,snowX,snowY+29);//結晶
	    g.drawLine(snowX+12,snowY+7,snowX-12,snowY+21);
	    g.drawLine(snowX+12,snowY+21,snowX-12,snowY+7);
	    g.drawLine(snowX,snowY+8,snowX+3,snowY+5);//結晶細部
	    g.drawLine(snowX,snowY+8,snowX-3,snowY+5);
	    g.drawLine(snowX+5,snowY+11,snowX+6,snowY+8);
	    g.drawLine(snowX+5,snowY+11,snowX+9,snowY+13);
	    g.drawLine(snowX+5,snowY+17,snowX+9,snowY+15);
	    g.drawLine(snowX+5,snowY+17,snowX+6,snowY+20);
	    g.drawLine(snowX,snowY+20,snowX+3,snowY+23);
	    g.drawLine(snowX,snowY+20,snowX-3,snowY+23);
	    g.drawLine(snowX-5,snowY+17,snowX-6,snowY+20);
	    g.drawLine(snowX-5,snowY+17,snowX-9,snowY+15);
	    g.drawLine(snowX-5,snowY+11,snowX-9,snowY+13);
	    g.drawLine(snowX-5,snowY+11,snowX-6,snowY+8);
	}
    }
}

コメント


解答例(3)

作品



g440882

プログラム

//XXXX
//XXXX
//雲のかかった月と雪だるまと降っている雪の絵

import java.awt.*;           //AWTを使うため
import java.awt.event.*;     //イベント駆動関係のクラスのため
import java.util.*;          //Randomクラスを使うため

class Kadai1109 extends Frame{
    public Kadai1109(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){
	Kadai1109 frame=new Kadai1109("Kadai1109");
	frame.setSize(400,400);
	frame.setVisible(true);
    }
    public void paint(Graphics g){
	//背景
	for(int i=0;i< 30;i++){
	    g.setColor(new Color(200+i,190,240));
	    g.fillRect(0,7*i,400,400);
	}
	//地面
	g.setColor(new Color(230,230,230));
	g.fillRect(0,240,400,400);
	//月
	g.setColor(new Color(255,255,110));
	g.fillOval(270,50,70,70);
	//雲
	g.setColor(new Color(240,240,255,150));
	g.fillOval(170,90,150,30);
	g.fillOval(270,55,100,20);
	//陰
	g.setColor(new Color(0,0,0,100));
	g.fillOval(50,350,100,40);
	//雪だるま
	g.setColor(Color.white);
	g.fillOval(70,200,90,90);
	g.fillOval(60,270,110,110);
	
	g.setColor(Color.black);
	g.fillOval(100,235,5,5);
	g.fillOval(130,235,5,5);
	//枝
	g.setColor(new Color(140,80,40));
	g.drawLine(150,310,200,280);
	g.drawLine(180,292,200,295);
	g.drawLine(80,310,30,280);
	g.drawLine(55,295,35,292);
	g.drawLine(40,286,35,274);
	//雪
	g.setColor(new Color(255,255,255,200));
	Random r=new Random();
	for(int i=0;i< 20;i++){
	    int px=r.nextInt(400);
	    int py=r.nextInt(400);
	    g.fillOval(px,py,10,10);
	}
    }
}

コメント

雲や雪が半透明になっているのが奇麗ですね.これは,講義では扱いませんでしたが,
	g.setColor(new Color(240,240,255,150));
のように,色を指定する時に,アルファ値(不透明度,0は透明,255は不透明)も 与えていることで実現しています.

その他の作品



g410151


g410416


g440009


g440052


g440138


g440157


g440387


g440396


g440513


g440535


g440538


g440539


g440545


g440554


g440564


g440565


g440568


g440574


g440584


g440587


g440608


g440654


g440701


g440773


g440806


g440881


g440904


g441096


g441101


g441132


g441163


g441169


g450246


g450302


g460002


g460026


g460032

オプション課題