// ==================================================================== // 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; // CG完成判別用配列 int puzz[]; // CGが完成しているかどうか? boolean isWin; // ----------------------------------------------------------- public void init() { // 初期処理 // ダブルバッファリング初期宣言 backimage = createImage( 480, 560 ); bg = backimage.getGraphics(); // CG完成判別用配列 初期宣言 puzz = new int[36]; // 初期状態でCGは完成していない 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());// ランダム発生 // ランダム1のパネルを、裏画面左下にコピー kcopy( x1, y1, 0, 6); // ランダム2のパネルをランダム1の場所にコピー kcopy( x2, y2, x1, y1); // 裏画面左下のパネルをランダム2の場所にコピー 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) { // マウスダウン // もしすでにCGが完成してるなら何もしない 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; // CGが完成したかどうかのチェック int c; for (c=0; c<36; c++){ if (puzz[c] != c) break; } // もし完成していたら、パネルの線が入っていない元のCGを裏画面に作画する 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