import java.applet.Applet; import java.awt.*; import java.util.*; import java.awt.event.*; import java.lang.*; import java.text.*; import java.net.*; public class Cube45Applet extends Applet implements Runnable, MouseListener, MouseMotionListener { // 定数 final static int NONE = -1; final static int SIZE_CUBE = 32; // モード final static int MODE_TITLE = 0; final static int MODE_GAMEON = 1; final static int MODE_CLEAR = 2; private int mode = MODE_TITLE; // ゲームモード final static int GAMEMODE_FLOWER = 0; final static int GAMEMODE_CROSS = 1; final static int GAMEMODE_FIVE = 2; private int gamemode = GAMEMODE_FLOWER; // 位置 private int mx = 0; // 座標 private int my = 0; private int lockonmx = NONE; private int lockonmy = NONE; private int[][] basepoint = {{SIZE_CUBE * 3,0}, {0, SIZE_CUBE*3}, {SIZE_CUBE*3,SIZE_CUBE*3}, {SIZE_CUBE*6,SIZE_CUBE*3}, {SIZE_CUBE*3,SIZE_CUBE*6}}; private CubeObject[][] cubetbl = new CubeObject[5][9]; // マウス private boolean mouseonflg = false; private boolean mouseenterflg = true; // 得点 private int[] hightime = new int[3]; private long starttime = NONE; private int nowtime = NONE; // 画面描写用 Dimension dm = null; Image offs = null; Graphics grf = null; // スレッド private Thread kicker = null; private boolean loop = false; final static int threadspeed = 100; public void init() { // 変数の初期化 for(int i=0;i=0)&&(mx<9)&&(my>=0)&&(my<9)){ grf.setColor(Color.white); x = mx / 3; y = my / 3; grf.drawRect(x*3*SIZE_CUBE,y*3*SIZE_CUBE,SIZE_CUBE*3,SIZE_CUBE*3); } } else { // CUBEの描写 for(int i=0;i=nowtime) grf.drawString("New Record", 3, 48+24); } if((mode==MODE_GAMEON)||(mode==MODE_CLEAR)){ grf.setColor(Color.white); grf.drawString(String.valueOf(nowtime), 192+32, 48); } if(mode==MODE_GAMEON){ // カーソルの表示 if((mx>=0)&&(mx<9)&&(my>=0)&&(my<9)){ if(mouseonflg) grf.setColor(Color.yellow); else grf.setColor(Color.white); grf.drawRect(mx*SIZE_CUBE,my*SIZE_CUBE,SIZE_CUBE,SIZE_CUBE); } } // オフスクリーンのイメージを一挙に実際の表示領域に描く g.drawImage(offs, 0, 0, this); } //////////////////////////////////////////////////////////////// // マウス管理 //////////////////////////////////////////////////////////////// public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){ mouseenterflg = true; } public void mouseExited(MouseEvent e){ mouseenterflg = false; } public void mouseDragged(MouseEvent e){ if(!mouseenterflg) return; mx = e.getX() / SIZE_CUBE; my = e.getY() / SIZE_CUBE; if(mode==MODE_GAMEON) moveCube(mx, my, lockonmx, lockonmy); lockonmx = mx; lockonmy = my; repaint(); } public void mousePressed(MouseEvent e){ if(!mouseenterflg) return; lockonmx = e.getX() / SIZE_CUBE; lockonmy = e.getY() / SIZE_CUBE; mouseonflg = true; repaint(); } public void mouseReleased(MouseEvent e){ mouseonflg = false; if(mode==MODE_TITLE){ int x = mx / 3; int y = my / 3; if((x==0)&&(y==1)) initGame(GAMEMODE_FLOWER); if((x==1)&&(y==1)) initGame(GAMEMODE_CROSS); if((x==2)&&(y==1)) initGame(GAMEMODE_FIVE); else return; } else if(mode==MODE_GAMEON){ if(isCheckClear()){ mode=MODE_CLEAR; // ハイスコアの処理 if(hightime[gamemode]>nowtime) hightime[gamemode]=nowtime; } } else if(mode==MODE_CLEAR){ mode = MODE_TITLE; } repaint(); } public void mouseMoved(MouseEvent e){ if(!mouseenterflg) return; mx = e.getX() / SIZE_CUBE; my = e.getY() / SIZE_CUBE; repaint(); } //////////////////////////////////////////////////////////////// // スレッド管理 //////////////////////////////////////////////////////////////// public void start() { if(kicker == null) { // スレッドを実行させる loop = true; kicker = new Thread(this); kicker.start(); } } public void stop() { // スレッドを止める if ( kicker != null ) { //kicker.stop(); loop = false; try { kicker.join(); } catch(Exception e){}; kicker = null; } } public void run() { // 描画オブジェクトの確定 while(loop){ // 時間の取得 if(mode==MODE_GAMEON) nowtime = (int)((System.currentTimeMillis() - starttime) / 1000); repaint(); // スレッド待機 try { kicker.sleep(threadspeed); } catch(Exception e) { System.out.println("--- THREAD ERROR:" + e.toString() + " ---"); } } } //////////////////////////////////////////////////////////////// // 初期化 //////////////////////////////////////////////////////////////// public void initGame(int valgamemode){ gamemode = valgamemode; ArrayList vec = new ArrayList(); // 配列の構成 switch(gamemode){ case GAMEMODE_FLOWER: for(int i=0;i<9;i++) vec.add(new CubeObject(0)); for(int i=0;i<(9*4);i++) vec.add(new CubeObject(1)); break; case GAMEMODE_CROSS: for(int i=0;i<9;i++) vec.add(new CubeObject(0)); for(int i=0;i<(9*2);i++) vec.add(new CubeObject(1)); for(int i=0;i<(9*2);i++) vec.add(new CubeObject(2)); break; default: for(int i=0;i<9;i++) vec.add(new CubeObject(0)); for(int i=0;i<9;i++) vec.add(new CubeObject(1)); for(int i=0;i<9;i++) vec.add(new CubeObject(2)); for(int i=0;i<9;i++) vec.add(new CubeObject(3)); for(int i=0;i<9;i++) vec.add(new CubeObject(4)); break; } // 乱数で並べ替えを行い、画面に設定 int index = NONE; for(int i=0;i<5;i++){ for(int j=0;j<9;j++){ index = (int)(Math.random() * vec.size()); cubetbl[i][j]= (CubeObject) vec.get(index); vec.remove(index); } } // 開始時間 starttime = System.currentTimeMillis(); mode = MODE_GAMEON; } //////////////////////////////////////////////////////////////// // Cube移動 //////////////////////////////////////////////////////////////// private void moveCube(int valmx, int valmy, int vallockonmx, int vallockonmy){ // 移動できるか否か if(((valmx-vallockonmx)!=1)&&((valmx-vallockonmx)!=-1)&& ((valmy-vallockonmy)!=1)&&((valmy-vallockonmy)!=-1)) return; // 移動 int side; int pos; int horizontal; int vertical; CubeObject[] wkcubetbl = null; CubeObject wkobj = null; // 座標をside、posに変換 if((valmx>=3)&&(valmx<6)&&(valmy>=0)&&(valmy<3)){ side = 0; pos = valmy * 3 + (valmx - 3); } else if((valmx>=0)&&(valmx<3)&&(valmy>=3)&&(valmy<6)){ side = 1; pos = (valmy-3) * 3 + valmx; } else if((valmx>=3)&&(valmx<6)&&(valmy>=3)&&(valmy<6)){ side = 2; pos = (valmy-3) * 3 + (valmx-3); } else if((valmx>=6)&&(valmx<9)&&(valmy>=3)&&(valmy<6)){ side = 3; pos = (valmy-3) * 3 + (valmx-6); } else if((valmx>=3)&&(valmx<6)&&(valmy>=6)&&(valmy<9)){ side = 4; pos = (valmy-6) * 3 + (valmx-3); } else return; // 変数の設定 horizontal = valmx - vallockonmx; vertical = valmy - vallockonmy; wkcubetbl = getCubeLine(side,pos,(horizontal!=0)); wkobj = new CubeObject(); // 配列の並べ替え if((horizontal==1)||(vertical==1)){ // 下にずらす wkobj.copy(wkcubetbl[wkcubetbl.length-1]); for(int i=wkcubetbl.length-1;i>0;i--){ wkcubetbl[i].copy(wkcubetbl[i-1]); } wkcubetbl[0].copy(wkobj); } else { // 上にずらす wkobj.copy(wkcubetbl[0]); for(int i=0;i