11/22 簡単なグラフィクス(3)


前回までの補足


前回の課題

以下の要素を備えたプログラムを作成しなさい.

解答例

締め切りよりかなり前だが,提出されたものがあるので,紹介する.
 //010344H
//XXXX,東京大学文1,1年。E-mail:g010344@mail.ecc.u-tokyo.ac.jp
//ユーザが、画面上で、yを入力すると、ランダムに、ハートの絵を表示する
//プログラムです。 入力 を繰り返すと、ハートの数が増えます。
//   y を入力しすぎると、ひびの入ったハートが、1つだけ表示されます。
//ラブレターに最適!!なわけないか。
import java.awt.*;
import java.awt.event.*;
import java.util.*;
//elementAt,addElementなどを使うときには、いちいち、このように、
//クラスを生成して、媒介としてやらなくては、いけないのでしょうか?
class Iruno{
public int     iruno;
  public Iruno(int    hatena){
    iruno=hatena;}
}
 
class Loveletter extends Frame implements KeyListener{
  Vector v;
  Image image;
  Image brokenheart;
  //イメージをロードし、vectorクラスのオブジェクトを生成する。
  public Loveletter(String title){
    super(title);
    v=new Vector();
    image=Toolkit.getDefaultToolkit().getImage("heart.gif"); 
    brokenheart=Toolkit.getDefaultToolkit().getImage("brokenheart.gif");
    addKeyListener(this);
  }

  public static void main(String[] args){
    Loveletter frame=new Loveletter("Loveletter");
    frame.setSize(600,400);
    frame.setVisible(true);
  }


  public  void paint(Graphics g){
    g.setColor(Color.white);
    g.fillRect(0,0,600,400);
    g.setColor(Color.black);
    //文章。
    g.drawString("Do You Want More Love?",10,50);
    g.drawString("If yes,type y.If no,type n."  ,10,70);
    g.drawString("But remember,too many want will destroy  yourself!",10,90);
    int i;
    //はじめに小さなハートを表示しておく。
    g.drawImage(image,140,140,35 ,35,this);
    //ランダムに、ハートを表示する。
    if(v.size()<=14){
    for(i=0;i< v.size();i++){
      Iruno l=(Iruno)v.elementAt(i);
      double l_1   =Math.random()*l.iruno*18.0;
      double l_2     =Math.random()*l.iruno*14.0*Math.random()*2;
      int firstl=(int)l_1;
      int secondl=(int)l_2;
      g.drawImage(image, 18 *firstl,12*secondl ,14  *firstl, 15 *secondl, this);
    }
    }
    //壊れたハートの表示。
else 
  g.drawImage(brokenheart,140,100,300,300,this);
  }

  public void keyPressed(KeyEvent e){
    int key=e.getKeyChar();
    System.out.println("KeyPressed("+e+","+key+")");
    if(key=='y'){
      int a=1;
      v.addElement(new Iruno(a));
      repaint();}
    else   if(key=='n')System.exit(0);
  }
  public void keyReleased(KeyEvent e){}
  public void keyTyped(KeyEvent e){}
}

コメント

基本型を保持するVectorを作りたい時は,自前で用意しなくてもシステムにラッ パークラス(wrapper class)というものが用意されています.語源は食品を包 むのに使う「XXXラップ」と同じで,基本型のデータを包んでオブジェクトに して使うものです.int型に対してはIntegerク ラスが用意されているので,上のプログラムでは以下のように書き直すこ とができます.
      Iruno l=(Iruno)v.elementAt(i);
->
      Integer l=(Integer)v.elementAt(i);
----------------------------------------------------------------------
l.iruno
->
l.intValue()
----------------------------------------------------------------------
      v.addElement(new Iruno(a));
->
      v.addElement(new Integer(a));

ただし,このプログラムではVectorを使っている意味がないプログラムなの で,ちょっとつまらないですね.paintの度に毎回乱数で位置を決めるのでは なくて,keyPressedの際に位置を乱数で決めて,それをVectorに記録してお いた方がより有効な使い方になります.
上のプログラムで使われている疑似乱数の生成は,Math クラスのrandomメソッドを使っていますが,Random クラスを使う方法もあります.

今日の課題

駒場祭直前なのでなし.
次に進む