//
//      シューテングゲーム第二回
//
//  1998/ 1/ 5,2002/ 8/ 9 宍戸 輝光
//

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

public class sgame2 extends java.applet.Applet implements Runnable {

	Image screen,bk;
	Graphics g_screen,g_bk;

	Thread runner=null;
	Random rnd=new Random();

	int x,mx,lx,ly,ex,elx,ely;
	boolean ls,els;

	public void start(){

		resize(320,320);
		setBackground(Color.green); /*アプレットの背景を緑にする*/

		screen=createImage(300,300);  /* 画面用イメージ */
		g_screen=screen.getGraphics();
		bk=createImage(300,300);      /* 背景用イメージ */
		g_bk=bk.getGraphics();

		makeBackground();  /* 背景作成 */

		x=160; /* 自機の初期位置 */
		ex=120; /* 敵の初期位置 */

		drawScreen(); /* 自機と敵機描画 */

		ls=false; /* 弾の発射フラグリセット */
		els=false;

		repaint();

		if (runner==null) {

			runner=new Thread(this); /*スレッド生成*/
			runner.start();

		}

	}

	public void stop() { /*終了時にスレッド破棄*/

		if (runner!=null) {

			runner.stop();
			runner=null;

		}

	}

	public void makeBackground() { /* 背景作成 */

		int i,x,y,r,g,b;

		g_bk.setColor(Color.black); /* 黒く塗りつぶす */
		g_bk.fillRect(0,0,300,300);

		for (i=0;i<1000;i++) { /* 乱数で星を描く */

			x=Math.abs(rnd.nextInt()) % 300; /* 乱数で座標を決定 */
			y=Math.abs(rnd.nextInt()) % 300;

			r=Math.abs(rnd.nextInt()) % 256; /* 乱数で色を作る */
			g=Math.abs(rnd.nextInt()) % 256;
			b=Math.abs(rnd.nextInt()) % 256;

			g_bk.setColor(new Color(r,g,b));

			g_bk.fillRect(x,y,1,1);

		}

	}

	public void run() { /* スレッド本体 */

 		while (runner!=null) {

			if (mx>0) /* マウスカーソルが範囲内 */
				if (mx<x+12) /* カーソルが自機の左側 */
					x=x-4; /* 自機を左に移動 */
				else if (mx>x+20) /* カーソルが自機の右側 */
					x=x+4; /* 自機を右に移動 */

			ex=ex+(rnd.nextInt() % 3)*4; /* 敵を乱数で移動 */

			if (ex<0) /* 画面の中に収める */
				ex=0;

			if (ex>268)
				ex=268;

			drawScreen(); /* 自機と敵を描画 */

			if (ls) { /* 自機の弾表示中 */

				if (ly<0) /* 画面の上端まで来たら弾を消す */
					ls=false; /* 発射フラグリセット */

				g_screen.setColor(Color.red);
				g_screen.fillRect(lx,ly,2,16);

				ly=ly-12; /* 弾を12ドット上へ */

			}

			if (!els) { /* 敵が弾を打ってなければ */

				if (rnd.nextDouble()<0.3) {

					els=true; /* ある確率で弾を発射 */
					elx=ex+16; /* 弾の初期位置 */
					ely=16;

				}

			} else { /* 弾表示中なら */

				ely=ely+8; /* 弾を下に移動 */

				if (elx<x-(Math.abs(rnd.nextInt()) % 24)+48) /* 誘導 */
					elx=elx+(6+rnd.nextInt() % 3);
				if (elx>x+(Math.abs(rnd.nextInt() % 24))-16)
					elx=elx-(6+rnd.nextInt() % 3);

				if (ely>308) /* 画面下端に来たら消去 */
					els=false; /* 発射フラグリセット */

				g_screen.setColor(Color.orange);
				g_screen.fillRect(elx,ely,4,16);

			}

			repaint(); /* 画面に画面用イメージを表示 */

			try { Thread.sleep(25); } /*ウエイト*/
			catch (InterruptedException e) {}

		}

	}

	public void drawScreen() { /* 自機と敵機描画 */

		g_screen.drawImage(bk,0,0,this); /* 画面用イメージに背景を描く */

		g_screen.setColor(Color.cyan); /* 画面用イメージに自機を描く */
		g_screen.fillRect(x,280,32,16);

		g_screen.setColor(Color.yellow); /* 画面用イメージに敵機を描く */
		g_screen.fillRect(ex,8,32,16);

	}

	public boolean mouseMove(Event evt,int wx,int wy){ /*マウス移動*/

		mx=-1;

		if (wy<270 || wy>310 || wx<10 || wx>310)
			return true;

		mx=wx-10; /* ゲーム画面上のマウスカーソルの座標 */

		return true;

	}

	public boolean mouseDown(Event evt,int wx,int wy) { /* 弾発射 */

		if (mx<0 || ls) /* 範囲外かすでに弾が表示中なら戻る */
			return false;

		lx=x+16; /* 弾の初期位置 */
		ly=255;

		ls=true; /* 発射フラグセット */

		return true;

	}

	public boolean mouseExit(Event evt,int x,int y) {

		mx=-1; /* アプレットの外に出たら移動しない */

		return true;

	}

	public void paint(Graphics g){

		g.drawImage(screen,10,10,this); /* 画面用イメージ表示 */

	}

	public void update(Graphics g){

		paint(g);

	}

}