// ====================================================================
//            JAVA APPLET PROGRAM BASE SOURCE     BakuretuKen          
// ====================================================================

import java.applet.Applet;
import java.awt.*;
import java.net.*;
import java.awt.image.*;
import java.util.StringTokenizer;
import java.net.MalformedURLException;
import java.io.*;

// ===============================================================

public class KumaPuzzle extends Applet {
	
	// グローバル変数
	Image img;
	// ダブルバッファリング用の宣言
	Graphics bg;
	Image backimage;
	
	// ＣＧ完成判別用配列
	int puzz[];
	
	// ＣＧが完成しているかどうか？
	boolean isWin;
	
	// -----------------------------------------------------------
	public void init() {  // 初期処理
		
		// ダブルバッファリング初期宣言
		backimage = createImage( 480, 560 );
		bg = backimage.getGraphics();
		
		// ＣＧ完成判別用配列 初期宣言
		puzz = new int[36];
		
		// 初期状態でＣＧは完成していない
		isWin = false;
		
		// puzz[] に順番に数字をいれる（初期状態）
		for (int i=0; i<36; i++) puzz[i]=i;
		
		// 画像(image.jpg)を変数(img)に読みこむ
		img = getImage(getDocumentBase(), "image.jpg");
		
		// MediaTracker を使って画像の読みこみが終わるまで待つ
		MediaTracker mt = new MediaTracker(this);
		mt.addImage( img, 0);
		try {
			mt.waitForAll();
		} catch (Exception e) { System.out.println("ERROR!!"); }
		
		// 裏画面に img を作画
		bg.drawImage( img, 0, 0, this);
		
		bg.setColor(Color.black); // 裏画像の作画ペンの色を黒に
		// すべてのパネルを四角で囲む
		for ( int x=0; x<6; x++ )
			for ( int y=0; y<6; y++ )
				bg.drawRect( x*80, y*80, 80, 80 );
		
		int r, x1, y1, x2, y2, tmp;
		
		// 300回ランダムにパネルを入れ替える
		for ( r=0; r<300 ; r++) {
			// ランダムで動かすパネルを決める
			x1 = (int) (6 * Math.random());// ランダム発生
			y1 = (int) (6 * Math.random());// ランダム発生
			x2 = (int) (6 * Math.random());// ランダム発生
			y2 = (int) (6 * Math.random());// ランダム発生
			
			// ランダム１のパネルを、裏画面左下にコピー
			kcopy( x1, y1, 0, 6);
			// ランダム２のパネルをランダム１の場所にコピー
			kcopy( x2, y2, x1, y1);
			// 裏画面左下のパネルをランダム２の場所にコピー
			kcopy( 0, 6, x2, y2);
			
			// 画像を動かすと同時に puzz[] の数字も入替える
			tmp = puzz[ y1*6+x1 ];
			puzz[ y1*6+x1 ] = puzz[ y2*6+x2 ];
			puzz[ y2*6+x2 ] = tmp;
			
		} // for
		
		
	} // init()
	
	// -----------------------------------------------------------
	public void paint(Graphics g) {  // 作画処理
		
		// 裏画像を表に転送
		g.drawImage( backimage, 0, 0, null );
		
	} // paint()
	
	// -----------------------------------------------------------
	public void update(Graphics g) {  // 再作画処理
		paint( g );
	} // update()
	
	// -----------------------------------------------------------
	public boolean mouseDown(Event e, int x, int y) {  // マウスダウン
		
		// もしすでにＣＧが完成してるなら何もしない
		if (isWin) return true;
		
		// マウスがクリックされた場所のパネルを調べる
		int px, py;
		px= (int)( x/80 );
		py= (int)( y/80 );
		
		// 左上のパネルを裏画面左下にコピー
		kcopy( 0, 0, 0, 6);
		// クリックされた場所のパネルを左上にコピー
		kcopy( px, py, 0, 0);
		// 裏画面左下パネルをクリックされた場所にコピー
		kcopy( 0, 6, px, py);
		
		// puzz[] の数字も移動
		int tmp = puzz[ 0 ];
		puzz[ 0 ] = puzz[ py*6+px ];
		puzz[ py*6+px ] = tmp;
		
		// ＣＧが完成したかどうかのチェック
		int c;
		for (c=0; c<36; c++){
			if (puzz[c] != c) break;
		}
		
		// もし完成していたら、パネルの線が入っていない元のＣＧを裏画面に作画する
		if( c==36 ){
			bg.drawImage( img, 0, 0, this);
			isWin = true;
		}
		
		// デバッグ用CONSOLE出力
		// for (int i=0; i<36; i++)
		// 	System.out.print( puzz[i] +" ");
		// System.out.println("\n");
		
		// 再作画
		repaint();
		
		return true;
	} // mouseDown()
	
	// -----------------------------------------------------------
	public boolean mouseUp(Event e, int x, int y) {  // マウスアップ
		
		return true;
	} // mouseUp()
	
	// -----------------------------------------------------------
	public boolean mouseDrag(Event e, int x, int y) { //  マウス移動
		
		return true;
	} // mouseDrag()
	
	// -----------------------------------------------------------
	// 簡単コピー関数 kcopy()
	void kcopy( int x, int y, int dx, int dy) {
		bg.copyArea( x*80, y*80, 80, 80,(dx-x)*80, (dy-y)*80 );
	}

// ===============================================================
}  // End of Class

