📄 board.java
字号:
import java.util.Random;import javax.microedition.lcdui.*;import javax.microedition.midlet.MIDlet;import javax.microedition.lcdui.game.*;public class Board extends GameCanvas implements CommandListener, Runnable { static final int ROWS = 4; static final int COLS = 4; Piece[] pieces; Piece blank; int cellw = 24, cellh = 24, cellx = 30, celly = 20; int cellxoff = 7, cellyoff = 4; Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM); Random rand = new Random(); Thread thread; Command exitCmd, resetCmd; MIDlet midlet; class Piece { String caption; int row; int col; public Piece(String caption, int row, int col) { this.caption = caption; this.row = row; this.col = col; } void paint(Graphics g) { int px = col * cellw + cellx; int py = row * cellh + celly; if (caption != null) { g.setColor(0); g.setFont(font); g.drawRect(px, py, cellw-2, cellh-2); g.drawString(caption, px+cellxoff, py+cellyoff, Graphics.TOP|Graphics.LEFT); } } } public Board(MIDlet midlet_) { super( true ); midlet = midlet_; pieces = new Piece[ ROWS * COLS ]; for(int i=0; i<ROWS; i++ ) for(int j=0; j<COLS; j++ ) { String caption = ""+(i*COLS+j+1); if( i==ROWS-1 && j==COLS-1 ) caption = null; // 这里用数字作标题,最后一块的标题为空 pieces[i*COLS + j] = new Piece( caption, i, j ); } blank = pieces[ROWS * COLS - 1]; exitCmd = new Command("退出", Command.EXIT, 0); resetCmd = new Command( "开始", Command.SCREEN, 1); addCommand( exitCmd ); addCommand( resetCmd ); setCommandListener(this); } public void commandAction(Command c, Displayable d) { if( c==exitCmd ) { midlet.notifyDestroyed(); }else if( c==resetCmd ) { resetGrid(); } } // 重置格子,随机交换一些格子的位置 void resetGrid() { for( int i=0; i<100; i++ ) { int a = randRange( ROWS*COLS ); int b = randRange( ROWS*COLS ); swap( a, b ); } } // 产生一个随机数 int randRange(int n) { int r = rand.nextInt() % n; if (r < 0) r += n; return r; } // 交换两个方块 void swap( int a, int b ) { int t; t=pieces[a].row; pieces[a].row=pieces[b].row; pieces[b].row = t; t=pieces[a].col; pieces[a].col=pieces[b].col; pieces[b].col = t; } public void paint( Graphics g ) { flushGraphics(); } // 绘制 public void paintAll(Graphics g) { g.setColor(0xFFFFFF); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(0); g.drawRect(cellx-2, celly-2, COLS*cellw + 3, ROWS*cellh + 3); for (int i = 0; i < ROWS*COLS; i++) { pieces[i].paint(g); } } public void showNotify() { thread = new Thread(this); thread.start(); } public void hideNotify() { thread = null; } public void run() { Graphics g = getGraphics(); // 后台grahpics对象 Thread mythread = Thread.currentThread(); while (mythread == thread ) { // 检查键盘的状态,并进行适当的处理 int keyState = getKeyStates(); if ((keyState & LEFT_PRESSED) != 0) { moveLeft(); System.out.println( "L" ); } else if ((keyState & RIGHT_PRESSED) != 0) { moveRight(); System.out.println( "R" ); } else if ((keyState & UP_PRESSED) != 0) { moveUp(); System.out.println( "U" ); } else if ((keyState & DOWN_PRESSED) != 0) { moveDown(); System.out.println( "D" ); } // 绘制相应的图形 paintAll(g); // 刷新屏幕 flushGraphics(); // 等待键状态的改变 int cnt = 1; while( getKeyStates() == keyState ) { try{ Thread.sleep(10);} catch(Exception e){} cnt ++; if( cnt > 100 ) break; // 最久等1秒 } //synchronized(this) { // try { // wait(100); // } catch(Exception e) {} //} } } void moveLeft(){ if( blank.col==COLS-1 ) return; for( int i=0; i<ROWS*COLS; i++ ) if( pieces[i].row == blank.row && pieces[i].col == blank.col + 1 ){ swap( i, ROWS*COLS-1 ); break; } } void moveRight(){ if( blank.col==0 ) return; for( int i=0; i<ROWS*COLS; i++ ) if( pieces[i].row == blank.row && pieces[i].col == blank.col - 1 ){ swap( i, ROWS*COLS-1 ); break; } } void moveUp(){ if( blank.row==ROWS-1 ) return; for( int i=0; i<ROWS*COLS; i++ ) if( pieces[i].col == blank.col && pieces[i].row == blank.row + 1 ){ swap( i, ROWS*COLS-1 ); break; } } void moveDown(){ if( blank.row==0 ) return; for( int i=0; i<ROWS*COLS; i++ ) if( pieces[i].col == blank.col && pieces[i].row == blank.row - 1 ){ swap( i, ROWS*COLS-1 ); break; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -