Sample6



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

public class Sample6 extends Applet implements Runnable, MouseListener {
	Dimension size;
	Image bkg;
	Graphics bf;
	Thread thd = null;
	int bx[] = {60, 180, 300}, by[] = {70, 170, 270}, cnt, x, y;
	boolean flg = false;	// もぐら出現フラグ
	boolean hit = false;	// もぐらたたき成功フラグ
	String msg;
	Random rnd;

	public void init() {	// 初期化処理
		size = getSize();
		bkg = createImage(size.width, size.height);
		bf = bkg.getGraphics();
		msg = "";
		cnt = 0; x = 0; y = 0;
		thd = new Thread(this);
		thd.start();
		rnd = new Random();
		addMouseListener(this);	// マウスイベントを自クラスで受け取る宣言
	}
	
	public void paint(Graphics g) {	// 描画処理
		bf.setColor(getBackground());
		bf.fillRect(0,0,size.width, size.height);

		bf.setFont(new Font("Dialog", Font.PLAIN, 20));
		bf.setColor(Color.red);
		bf.drawString(msg, 10, 25);

		bf.setColor(Color.green);		// 背景:芝生
		bf.fillRect(0, 30, 400, 370);
		bf.setColor(Color.black);		// 背景:穴
		bf.fillOval( 50, 100, 70, 30);
		bf.fillOval(170, 100, 70, 30);
		bf.fillOval(290, 100, 70, 30);
		bf.fillOval( 50, 200, 70, 30);
		bf.fillOval(170, 200, 70, 30);
		bf.fillOval(290, 200, 70, 30);
		bf.fillOval( 50, 300, 70, 30);
		bf.fillOval(170, 300, 70, 30);
		bf.fillOval(290, 300, 70, 30);

		if (cnt >= 10) {	// 10匹退治したらゲーム終了
			bf.setColor(Color.magenta);
			bf.drawString("Congratulations!", 100, 200);
		} else {
			if (flg == true && hit == false) {			// モグラ出現 & まだたたいてない
				x = bx[rnd.nextInt(3)];		// モグラ出現位置 x座標(ランダム)
				y = by[rnd.nextInt(3)];		// モグラ出現位置 y座標(ランダム)
				bf.setColor(Color.yellow);		// モグラ:体
				bf.fillRoundRect(x, y, 50, 55, 30, 30);
				bf.setColor(Color.black);
				bf.fillOval(x+15, y+12, 10, 15);	// モグラ:左目
				bf.fillOval(x+35, y+10, 10, 15);	// モグラ:右目
				bf.setColor(Color.red);
				bf.fillOval(x+30, y+30, 12, 10);	// モグラ:鼻
			} else if (flg == true && hit == true) {	// モグラ出現 & たたくの成功
				bf.setColor(Color.yellow);		// モグラ:体
				bf.fillRoundRect(x, y, 50, 55, 30, 30);
				bf.setColor(Color.black);
				bf.drawLine(x+10, y+10, x+40, y+25);	// モグラ:左目(バッテン)
				bf.drawLine(x+10, y+25, x+40, y+10);	// モグラ:右目(バッテン)
				bf.setColor(Color.red);
				bf.fillOval(x+30, y+30, 12, 10);	// モグラ:鼻
			}
		}
		g.drawImage(bkg, 0, 0, this);
	}
	
	public void run() {
		while (cnt < 10) {	// 10匹退治するまでループ
			double tmp = rnd.nextDouble();
			if (tmp < 0.3) {	// 30%の確率でモグラ出現
				flg = true;		// モグラ出現フラグON(true)
			} else {
				flg = false;	// モグラ出現フラグOFF(false)
			}
			if (hit == true) {	// たたくのに成功していたら…
				hit = false;	// ヒット成功フラグをOFFに
			}
			try {
				thd.sleep(1000);
			} catch (InterruptedException e) {
			}
			repaint();
		}
		repaint();
	}
	
	public void mouseClicked(MouseEvent e) {	// マウスクリック時の処理
		Point pt = e.getPoint();	// マウスクリック位置取得
		if (flg == true && hit == false && x <= pt.x && pt.x <= x+50 && y <= pt.y && pt.y <= y+50) {
			cnt++;
			msg = "Hit! : " + cnt + "匹退治! 残り" + (10-cnt) + "匹";
			hit = true;		// モグラたたき成功フラグON(true)
		}
		repaint();
	}
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}
	public void mousePressed(MouseEvent e) {}
	public void mouseReleased(MouseEvent e) {}
}