www.pudn.com > PinTu.rar > MainCanvas.java


package Puzzle; 
 
import Puzzle.PuzzleMidlet; 
import java.util.Random; 
import javax.microedition.lcdui.Canvas; 
import javax.microedition.lcdui.Command; 
import javax.microedition.lcdui.CommandListener; 
import javax.microedition.lcdui.Displayable; 
import javax.microedition.lcdui.Graphics; 
import javax.microedition.lcdui.Image; 
 
public class MainCanvas extends Canvas implements Runnable,CommandListener{ 
	public Image m_aImg[]; 
	public int m_anCur[][]; 
	public int m_nHidX, m_nHidY; 
	public int m_nSta; 
	private Command ExitCommand; 
	private PuzzleMidlet midlet; 
	public MainCanvas( PuzzleMidlet mMidlet ) 
	{ 
		midlet = mMidlet; 
		try 
		{ 
			ExitCommand = new Command("Exit", Command.EXIT, 0); 
			addCommand(ExitCommand); 
			setCommandListener(this); 
			m_nHidX = 2; 
			m_nHidY = 2; 
			m_nSta = 0; 
			InitCurrent(); 
			m_aImg = new Image[9]; 
			StringBuffer temp = null; 
			for( int i = 0; i < 9; i ++ ) 
			{ 
				temp=new StringBuffer(); 
				temp.append("/Images/pic"); 
				temp.append(i); 
				temp.append(".png"); 
				m_aImg[i] = Image.createImage(temp.toString()); 
			}	         
		} 
		catch (Exception ex) 
		{//暂不做出错处理 
		} 
		Thread thread = new Thread(this); 
		thread.start(); 
	} 
	public void InitCurrent() 
	{ 
		Random random = new Random(); 
		m_anCur = new int[][] { {0,1,2}, {3,4,5}, {6,7,8} }; 
		int Rx, Ry, k, nTemp; 
		for( int x = 0; x < 3; x ++ ) 
		{ 
			for( int y = 0; y < 3; y ++ ) 
			{ 
				k = random.nextInt(); 
				Rx = Math.abs(k % 3); 
				k = random.nextInt(); 
				Ry = Math.abs(k % 3); 
				if( Rx != x || Ry != y ) 
				{ 
					nTemp = m_anCur[y][x]; 
					m_anCur[y][x] = m_anCur[Ry][Rx]; 
					m_anCur[Ry][Rx] = nTemp; 
				} 
			} 
		} 
	} 
	protected void paint(Graphics g)  
	{ 
		g.setColor(0); 
		g.fillRect( 0, 0, getWidth(), getHeight() ); 
		int nImg = 0; //暂存图片的编号 
		switch( m_nSta ) 
		{ 
		case 0: 
			for( int x = 0; x < 3; x++ ) 
			{ 
	            for( int y = 0; y < 3; y++ )  
	            { 
	            	if( x == m_nHidX && y == m_nHidY ) 
	            		continue; 
	            	nImg = m_anCur[y][x]; 
	            	if( nImg >= 0 && nImg < 9 ) 
	            	{ 
	            		if( m_aImg[nImg] != null ) 
	            			g.drawImage( m_aImg[nImg], x * 30, y * 30, Graphics.LEFT|Graphics.TOP); 
	            	} 
	            } 
	        } 
//			接着画线,将9块格子分割开。 
	        g.setColor(0xffffff);//设置成白色 
	        for(int i = 0; i <= 3; i++)  
	        { 
	            g.drawLine( 0, i*30, 3*30, i*30); 
	            g.drawLine( i*30, 0, i*30, 3*30); 
	        } 
	        break; 
	    case 1: 
	    	for( int x = 0; x < 3; x++ ) 
			{ 
	            for( int y = 0; y < 3; y++ )  
	            { 
	            	nImg = y * 3 + x; 
	            	if( m_aImg[nImg] != null ) 
	            		g.drawImage( m_aImg[nImg], x * 30, y * 30, Graphics.LEFT|Graphics.TOP); 
	            } 
	        } 
	    	break; 
	    case 2: 
	    default: 
	    	g.drawString( "Very Good!", 10, 45, 0 ); 
		} 
	} 
	public boolean CheckMove( int nX, int nY ) 
	{	 
		if( nX < 0 || nX >= 3 || nY < 0 || nY >= 3 ) 
			return false; 
		if(m_nHidX==nX && m_nHidY==nY) 
            return false; 
		if( nX > 0 && nX - 1 == m_nHidX && nY == m_nHidY ) 
			return true; 
		if( nX < 2 && nX + 1 == m_nHidX && nY == m_nHidY ) 
			return true; 
		if( nY > 0 && nY - 1 == m_nHidY && nX == m_nHidX ) 
			return true; 
		if( nY < 2 && nY + 1 == m_nHidY && nX == m_nHidX ) 
			return true; 
		return false; 
	} 
	private void sweep(int x, int y) 
	{ 
		if( !CheckMove( x, y ) ) 
			return; 
		int temp = m_anCur[y][x]; 
		m_anCur[y][x] = m_anCur[m_nHidY][m_nHidX]; 
		m_anCur[m_nHidY][m_nHidX] = temp; 
		m_nHidX = x; 
		m_nHidY = y; 
    } 
 
	protected void keyPressed(int keyCode)  
	{ 
		if( m_nSta == 2 ) 
			return; 
		switch(keyCode)  
		{ 
        case KEY_NUM1: 
        	sweep( 0, 0 );        		 
            break; 
        case KEY_NUM2: 
        	sweep( 1, 0 );   
            break; 
        case KEY_NUM3: 
        	sweep( 2, 0 );   
            break; 
        case KEY_NUM4: 
        	sweep( 0, 1 );       		 
            break; 
        case KEY_NUM5: 
        	sweep( 1, 1 );   
            break; 
        case KEY_NUM6: 
        	sweep( 2, 1 );   
            break; 
        case KEY_NUM7: 
        	sweep( 0, 2 );        		 
            break; 
        case KEY_NUM8: 
        	sweep( 1, 2 );   
            break; 
        case KEY_NUM9: 
        	sweep( 2, 2 );   
            break; 
        case KEY_NUM0: 
        	if( m_nSta == 0 ) 
        		m_nSta = 1; 
        	else 
        		m_nSta = 0; 
            break; 
		} 
		if( isFinish() ) 
			m_nSta = 2; 
 
	} 
	public boolean isFinish()  
	{ 
        for( int x = 0; x < 3; x++ )  
        { 
            for( int y = 0; y < 3; y++ )  
            { 
                if( m_anCur[y][x] != y * 3 + x ) 
                    return false; 
            } 
        } 
        return true; 
    } 
	public void commandAction(Command c, Displayable s) 
	{ 
		if (c.getCommandType() == Command.EXIT) 
		{ 
			midlet.notifyDestroyed(); 
		} 
	} 
	public void run() { 
		try{ 
			while(true){ 
				//重绘图形,getWidth与getHeight可分别得到手机屏幕的宽和高 
				repaint(0, 0, getWidth(), getHeight()); 
			} 
		} 
		catch(Exception e){} 
	} 
	public void stop() 
	{ 
	} 
}