program
//アプレットを使うため
import java.applet.*;
//AWTを使うため
import java.awt.*;
//イベント駆動関係のため
import java.awt.event.*;

public class Kadai1216 extends Applet implements Runnable{
    int width=300,height=600;
    int arrow_x=150,arrow_y=550,arrow_vx=0,arrow_vy=0;
    int target_x=150,target_y=50,target_vx=10;
    int target_width=120,target_height=10;
    int hit=0;
    int total=0;
    //Kadai1216クラスのコンストラクタ
    //アニメーションを行うためのスレッド
    public Thread th=null;
    //wwwブラウザがアプレットを含むページに来たときに呼ばれる
    public void init(){
	System.out.println("init is called");
	addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent e){
		    System.out.println("keyPressed("+e+")");
		    int key=e.getKeyChar();
		    if(key=='w'){
			target_width=target_width+10;
		    }
		    if(key=='n'){
			target_width=target_width-10;
		    }
		    else if(key=='h'){
			arrow_vy=-30;
		    }
		    else if(key=='l'){
			arrow_vy=-15;
		    }
		    else if(key=='r'){
			hit=0;
			total=0;
		    }
		}
	    });
	addMouseListener(new MouseAdapter(){
		public void mousePressed(MouseEvent e){
		    System.out.println(e);
		}
	    });
	requestFocus();
    }
    public void start(){
	System.out.println("start is called");
	if(th==null){ th=new Thread(this); th.start();}
    }
    public void stop(){
	System.out.println("stop is called");
	    th=null;
    }
    public void run(){
	Thread thisThread=Thread.currentThread();
	while(th==thisThread){
	    try{ Thread.sleep(100); }
	    catch(Exception e){}
	    timeTick();
	}
    }
    void timeTick(){
	//的の移動
	target_x=target_x+target_vx;
	//的が左端まで行ったら戻ってくる
	if(target_x<0){
	    target_vx=-target_vx;
	}
	//的が右端まで行ったら戻ってくる
	else if(target_x>width-target_width){
	    target_vx=-target_vx;
	} 
 	//矢の移動、古い座標を保存
	int old_x=arrow_x;
	int old_y=arrow_y;
	arrow_x=arrow_x+arrow_vx;
	arrow_y=arrow_y+arrow_vy;
	//矢が的に近づいてきたら
	if(arrow_y=target_y){
	    //的と矢の交差するx座標を計算
	    int x=old_x+(arrow_x-old_x)*(target_y-old_y)/(arrow_y-old_y);
	    //的に当たったら
	    if(target_x <= x && x<=target_x+target_width){
		 arrow_x=150;
		 arrow_y=550;
		 arrow_vx=0;
		 arrow_vy=0;
		 hit=hit+1;
		 total=total+1;
	    }
	}
	if(arrow_y<0){
		arrow_x=150;
		arrow_y=550;
		arrow_vx=0;
		arrow_vy=0;
		total=total+1;
	}
	repaint();
    }
    Image offScreenImage;
    Graphics offScreenGraphics;
    public void update(Graphics g){
	if(offScreenImage==null){
	    //オフスクリーンイメージを600x400のサイズで作成  
	    offScreenImage=createImage(getWidth(),getHeight());
	     //オフスクリーンイメージに描画するための Graphics オブジェクト
	    offScreenGraphics=offScreenImage.getGraphics(); 
	}
	//次の画面のイメージを作る
	paint(offScreenGraphics);
	//イメージを本物のスクリーンに書き込む
	g.drawImage(offScreenImage,0,0,this);
    }
    public void paint(Graphics g){
	//描画色を白にする.
	g.setColor(Color.white);
	//全体を塗り潰す
	g.fillRect(0,0,width,height);
	//描画色を黒にする
	g.setColor(Color.black);
	//矢を描く
	int[] xs={arrow_x,arrow_x-4,arrow_x-2,arrow_x-2,arrow_x+2,arrow_x+2,arrow_x+4};
	int[] ys={arrow_y,arrow_y+4,arrow_y+4,arrow_y+16,arrow_y+16,arrow_y+4,arrow_y+4};
	g.fillPolygon(xs,ys,7);
	//的を描く
	g.fillRect(target_x,target_y,target_width,target_height);
	g.drawString("命中率 "+hit+"/"+total,130,450);
    }
}