首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2ME开发 >

100分拼图怎么显示在模拟器正中央,帮忙修改代码

2012-01-28 
100分求助拼图如何显示在模拟器正中央,帮忙修改代码MainCanvas代码如下:importjava.util.Randomimportjav

100分求助拼图如何显示在模拟器正中央,帮忙修改代码
MainCanvas代码如下:

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( "/pic ");
temp.append(i);
temp.append( ".png ");
m_aImg[i]   =   Image.createImage(temp.toString());
temp=null;
}                
}
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,Graphics.LEFT|Graphics.TOP);
break;
}
}
private   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()
{
}
}

MIDLET   框架:
import   javax.microedition.lcdui.Display;
import   javax.microedition.midlet.MIDlet;
import   javax.microedition.midlet.MIDletStateChangeException;

public   class   PuzzleMidlet   extends   MIDlet   {

/**
  *  
  */
private   static   MainCanvas   m_MainCanvas;
public   PuzzleMidlet()   {
super();
//   TODO   Auto-generated   constructor   stub
}

/*   (non-Javadoc)


  *   @see   javax.microedition.midlet.MIDlet#startApp()
  */
protected   void   startApp()   throws   MIDletStateChangeException   {
//   TODO   Auto-generated   method   stub
if   (m_MainCanvas   ==   null)  
{
try
{
m_MainCanvas   =   new   MainCanvas(this);
        }
catch   (Exception   ex)
{
        System.out.println(ex);
        }
}
Display.getDisplay(this).setCurrent(m_MainCanvas);
}

/*   (non-Javadoc)
  *   @see   javax.microedition.midlet.MIDlet#pauseApp()
  */
protected   void   pauseApp()   {
//   TODO   Auto-generated   method   stub
m_MainCanvas.stop();
}

/*   (non-Javadoc)
  *   @see   javax.microedition.midlet.MIDlet#destroyApp(boolean)
  */
protected   void   destroyApp(boolean   arg0)   throws   MIDletStateChangeException   {
//   TODO   Auto-generated   method   stub
m_MainCanvas.stop();
}

}

[解决办法]
调整paint中for循环中的X的初值
[解决办法]
显示在正中间吗?那就把你现在的paint函数里边所有画东西的函数中,x,y坐标分别加一个量dx,dy就好了。


protected void paint(Graphics g) {
g.setColor(0);
g.fillRect( 0, 0, getWidth(), getHeight() );
int nImg = 0; //暂存图片的编号
int dx = (getWidth() - 90) / 2;
int dy = (getHeight() - 90) / 2;
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], dx + x * 30, dy + y * 30, Graphics.LEFT|Graphics.TOP);
}
}
}
//接着画线,将9块格子分割开。
g.setColor(0xffffff);//设置成白色
for(int i = 0; i <= 3; i++) {
g.drawLine( dx + 0, dy + i*30, dx + 3*30, dy + i*30);
g.drawLine( dx + i*30, dy + 0, dx + i*30, dy + 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], dx + x * 30, dy + y * 30, Graphics.LEFT|Graphics.TOP);
}
}
break;
case 2:
default:
g.drawString( "Very Good! ", 10, 45,Graphics.LEFT|Graphics.TOP);
break;
}
}

热点排行