import java.util.Enumeration; import java.util.Random; import java.util.Vector; import com.nttdocomo.io.ConnectionException; import com.nttdocomo.ui.*; class PuzzleCanvas extends Canvas { private int level; private boolean clear; private Image[] images; private int[][] piece; private int cursorX,cursorY; private Vector media; // 初期化 public PuzzleCanvas(int level) { this.level=level; setSoftLabel(Panel.SOFT_KEY_1,"終了"); setSoftLabel(Panel.SOFT_KEY_2,"リセット"); init(); reset(); } private void init() { media=new Vector(); piece=new int[level][level]; images=new Image[level*level]; for (int i=0;i<=images.length-1;i++) { images[i]=loadImage("/image"+ Integer.toString(i%level)+Integer.toString(i/level)+".gif"); } PhoneSystem.setAttribute( PhoneSystem.DEV_BACKLIGHT,PhoneSystem.ATTR_BACKLIGHT_ON); } private Image loadImage(String file) { MediaImage mediaImage; mediaImage=MediaManager.getImage("resource://"+file); media.addElement(mediaImage); try { mediaImage.use(); } catch (ConnectionException e) { e.printStackTrace(); } return mediaImage.getImage(); } private void reset() { Random random=new Random(); for (int i=0;i<=images.length-1;i++) { piece[i%level][i/level]=i; } cursorX=0; cursorY=0; clear=false; for (int i=1;i<=level*level*8;i++) { if (Math.abs(random.nextInt())%2==0) { swapPiece(random.nextInt()%2,0); } else { swapPiece(0,random.nextInt()%2); } } } // 描画処理 public void paint(Graphics g) { g.lock(); g.clearRect(0,0,getWidth(),getHeight()); for (int y=0;y<=level-1;y++) { for (int x=0;x<=level-1;x++) { if (x==cursorX && y==cursorY && !clear) { g.clearRect(x*30,y*30,30,30); } else { g.drawImage(images[piece[x][y]],x*30,y*30); } } } g.unlock(true); } // イベント public void processEvent(int type,int param) { if (type==Display.KEY_PRESSED_EVENT && param==Display.KEY_SOFT1) { exit(); } if (type==Display.KEY_PRESSED_EVENT && param==Display.KEY_SOFT2) { reset(); } if (type==Display.KEY_PRESSED_EVENT && !clear) { if (param==Display.KEY_UP) { swapPiece(0,-1); } if (param==Display.KEY_DOWN) { swapPiece(0,1); } if (param==Display.KEY_LEFT) { swapPiece(-1,0); } if (param==Display.KEY_RIGHT) { swapPiece(1,0); } checkClear(); } } private void swapPiece(int vx,int vy) { int swap; if (vy==-1 && cursorY==0) { return; } if (vy==1 && cursorY==level-1) { return; } if (vx==-1 && cursorX==0) { return; } if (vx==1 && cursorX==level-1) { return; } swap=piece[cursorX][cursorY]; piece[cursorX][cursorY]=piece[cursorX+vx][cursorY+vy]; piece[cursorX+vx][cursorY+vy]=swap; cursorX=cursorX+vx; cursorY=cursorY+vy; repaint(); } private void checkClear() { clear=true; for (int i=0;i<=images.length-1;i++) { if (piece[i%level][i/level]!=i) { clear=false; } } } // 終了 private void exit() { MediaResource resource; for (Enumeration enum=media.elements();enum.hasMoreElements();) { resource=(MediaResource)(enum.nextElement()); resource.unuse(); resource.dispose(); } IApplication.getCurrentApp().terminate(); } }