📄 newsnakecanvas.java
字号:
import javax.microedition.lcdui.game.GameCanvas;import java.io.ByteArrayInputStream;import java.io.InputStream;import java.util.Vector;import java.io.IOException;import javax.microedition.lcdui.Graphics;import java.lang.Thread;import javax.microedition.lcdui.game.TiledLayer;import javax.microedition.lcdui.game.LayerManager;import javax.microedition.lcdui.Image;import java.io.IOException;import javax.microedition.lcdui.Font;import javax.microedition.lcdui.game.Sprite;import javax.microedition.rms.RecordStore;import javax.microedition.rms.RecordStoreNotFoundException;import javax.microedition.rms.InvalidRecordIDException;import javax.microedition.rms.RecordStoreException;import javax.microedition.rms.RecordStoreNotOpenException;public class NewSnakeCanvas extends GameCanvas implements Runnable{ private mmenuCanvas parent; private Vector snake; private Graphics g; private GameOpt option; private int dir; private int speed; private int nStage; private boolean pauseReq=false; private LayerManager lm=null; private TiledLayer earth,stage; private int[] lv; private int score,nSteps,nRmv; private int lives,fruitcnts; public NewSnakeCanvas(mmenuCanvas p,GameOpt o) { super(true); parent=p; snake=new Vector(); g=getGraphics(); option=o; setFullScreenMode(true); dir=RIGHT; nStage=0; lv=new int[4]; lv[0]=500; lv[1]=400; lv[2]=300; lv[3]=200; score=0; } public void run() { Image land=null; Image fimg=null; Image paper=null; Image title=null; g.setColor(0); g.fillRect(0,0,128,160); try{ Image wait=Image.createImage("/wait.png"); //g.setColor(0xff,0xff,0x80); //g.fillRect(0,0,128,160); //g.drawImage(Image.createImage("/girl.jpg"),20,20,g.TOP|g.LEFT); g.drawImage(wait,0,0,g.TOP|g.LEFT); for(int k=0;k<128;k+=4){ g.setColor(255,0,0); g.fillRect(0,157,k+1,3); this.flushGraphics(); Thread.currentThread().sleep(20); } }catch(IOException ioe){System.out.println(ioe.getMessage());} catch(InterruptedException ie){} try{ land=Image.createImage("/earth1.png"); fimg=Image.createImage("/stage.png"); }catch(IOException ioe){System.out.println(ioe.getMessage());} lm=new LayerManager(); earth=new TiledLayer(4,11,land,30,14); stage=new TiledLayer(20,24,fimg,6,6); lm.append(stage); lm.append(earth); int[] fruitTile=new int[4]; fruitTile[0]=stage.createAnimatedTile(10); fruitTile[1]=stage.createAnimatedTile(14); fruitTile[2]=stage.createAnimatedTile(18); fruitTile[3]=stage.createAnimatedTile(20); int[] add=new int[4]; add[0]=1; add[1]=1; add[2]=-1; add[3]=-1; RecordStore rs=null; byte[] n=new byte[32]; InputStream stagefile=null; String name=null; byte[] map=new byte[480]; int i,j; long time,lastFr,lastSn; int key,nextDir; boolean redraw,alive; POINT tp=new POINT(); int sel=0; boolean k1,k2; byte[] data; lives=3; for(nStage=0;nStage<2;nStage++){ snake.removeAllElements(); stagefile=getClass().getResourceAsStream("/level"); try{ stagefile.skip(523*nStage); stagefile.read(n); name=new String(n); g.setColor(0); g.fillRect(0,0,128,160); g.setColor(0xffffff); g.drawString(" Stage "+(nStage+1),32,70,g.TOP|g.LEFT); g.drawString(name,28,90,g.TOP|g.LEFT); stagefile.read(n,0,11); earth.fillCells(0,0,4,11,n[0]); speed=n[1]; dir=n[2]; snake.addElement(new POINT(n[3],n[4],1)); snake.addElement(new POINT(n[5],n[6],n[7])); snake.addElement(new POINT(n[8],n[9],n[10])); stagefile.read(map); stagefile.close(); stagefile=null; name=null; flushGraphics(); Thread.currentThread().sleep(2000); }catch(IOException ioe){ }catch(InterruptedException ie){} fruitcnts=0; for(j=0;j<24;j++){ for(i=0;i<20;i++){ switch(map[j*20+i]){ case 0x00: stage.setCell(i,j,0); break; case 0x01: stage.setCell(i,j,1); break; case 0x02: case 0x03: case 0x04: case 0x05: stage.setCell(i,j,fruitTile[map[j*20+i]-2]); fruitcnts++; break; default: //System.out.println("Map data is corrupted! @"+i+","+j); } } } if(dir==UP) stage.setCell(n[3],n[4],2); else if(dir==DOWN) stage.setCell(n[3],n[4],4); else if(dir==LEFT) stage.setCell(n[3],n[4],3); else if(dir==RIGHT) stage.setCell(n[3],n[4],5); stage.setCell(n[5],n[6],n[7]+4); stage.setCell(n[8],n[9],n[10]+4); lastFr=0; lastSn=0; nextDir=dir; redraw=false; alive=true; nSteps=0; nRmv=0; while(fruitcnts>0){ k1=false; k2=false; key=getKeyStates(); while(pauseReq){ g.setColor(0xff00ff); g.fillRoundRect(30,38,70,40,7,7); g.setColor(0xffff00); g.fillRoundRect(30,20,70,23,7,7); g.setColor(0); g.drawRoundRect(30,20,70,58,7,7); g.drawString(" 暂停 ",32,22,g.TOP|g.LEFT); g.drawString(" 继续 ",32,42,g.TOP|g.LEFT); g.drawString(" 退出 ",32,62,g.TOP|g.LEFT); g.drawLine(30,60,100,60); if(sel==0){ g.drawChar('>',34,42,g.TOP|g.LEFT); }else{ g.drawChar('>',34,62,g.TOP|g.LEFT); } flushGraphics(); key=getKeyStates(); k2=(key&UP_PRESSED)!=0||(key&DOWN_PRESSED)!=0; if(k1&&(k2==false)) {sel=1-sel; k1=false;} else if(k2) k1=true; if((key&FIRE_PRESSED)!=0){ if(sel==0){ pauseReq=false; }else{ parent.backToMenu(); return; } } } key=getKeyStates(); if((key&UP_PRESSED)!=0){ if(dir!=DOWN) nextDir=UP; }else if((key&DOWN_PRESSED)!=0){ if(dir!=UP) nextDir=DOWN; }else if((key&LEFT_PRESSED)!=0){ if(dir!=RIGHT) nextDir=LEFT; }else if((key&RIGHT_PRESSED)!=0){ if(dir!=LEFT) nextDir=RIGHT; } //if((key&FIRE_PRESSED)!=0) lastSn-=1; time=System.currentTimeMillis(); if(time-lastFr>600){ lastFr=time; // for(i=0;i<4;i++){ j=stage.getAnimatedTile(fruitTile[i]); j+=add[i]; if(j==12+3*i||j==10+3*i) add[i]=0-add[i]; //System.out.println("Map data is corrupted! @"+i+","+j+" "+add[i]); stage.setAnimatedTile(fruitTile[i],j); } redraw=true; } if(time-lastSn>lv[speed]){ //System.out.println(""+snake.size()); if(snake.size()<3); else if(((POINT)snake.elementAt(snake.size()-2)).color==((POINT)snake.lastElement()).color&&((POINT)snake.lastElement()).color==((POINT)snake.elementAt(snake.size()-3)).color){ //System.out.println("label 1"); for(i=1;i<4;i++){ stage.setCell(((POINT)snake.lastElement()).x,((POINT)snake.lastElement()).y,0); snake.removeElementAt(snake.size()-1); } nRmv++; } lastSn=time; tp.setPoint(((POINT)snake.firstElement()).x,((POINT)snake.firstElement()).y); dir=nextDir; switch(dir){ case UP: tp.y-=1; break; case DOWN: tp.y+=1; break; case LEFT: tp.x-=1; break; case RIGHT: tp.x+=1; break; } switch(map[tp.y*20+tp.x]){ case 0: break; case 1: alive=false; break; case 2: case 3: case 4: case 5: snake.addElement(new POINT()); ((POINT)snake.lastElement()).color=map[tp.y*20+tp.x]; map[tp.y*20+tp.x]=0; fruitcnts--; break; } //System.out.println("label 3"); if(stage.getCell(tp.x,tp.y)<10&&stage.getCell(tp.x,tp.y)>5&&(!POINT.samePoint(tp,(POINT)snake.lastElement()))) alive=false; if(!alive){ //System.out.println("You lose!"); g.setColor(0xff00ff); g.fillRoundRect(10,50,110,30,15,15); g.setColor(0); g.drawRoundRect(10,50,110,30,15,15); g.drawString(" 失败了!",20,53,g.TOP|g.LEFT); flushGraphics(); key=getKeyStates(); while(true){ key=getKeyStates(); if((key&FIRE_PRESSED)!=0) break; } for(i=0;i<snake.size();i++){ stage.setCell(((POINT)snake.elementAt(i)).x,((POINT)snake.elementAt(i)).y,0); } lives--; snake.removeAllElements(); System.gc(); snake.addElement(new POINT(n[3],n[4],1)); snake.addElement(new POINT(n[5],n[6],n[7])); snake.addElement(new POINT(n[8],n[9],n[10])); if(n[2]==UP) stage.setCell(n[3],n[4],2); else if(n[2]==DOWN) stage.setCell(n[3],n[4],4); else if(n[2]==LEFT) stage.setCell(n[3],n[4],3); else if(n[2]==RIGHT) stage.setCell(n[3],n[4],5); stage.setCell(n[5],n[6],n[7]+4); stage.setCell(n[8],n[9],n[10]+4); lastFr=0; lastSn=0; dir=n[2]; nextDir=n[2]; redraw=false; alive=true; if(lives>0) continue; else break; } stage.setCell(((POINT)snake.lastElement()).x,((POINT)snake.lastElement()).y,0); for(i=snake.size()-1;i>0;i--){ ((POINT)snake.elementAt(i)).setPoint(((POINT)snake.elementAt(i-1)).x,((POINT)snake.elementAt(i-1)).y); } ((POINT)snake.firstElement()).setPoint(tp.x,tp.y); //System.out.println("label 2"); for(i=1;i<snake.size();i++){ stage.setCell(((POINT)snake.elementAt(i)).x,((POINT)snake.elementAt(i)).y,4+((POINT)snake.elementAt(i)).color); } if(dir==UP) stage.setCell(tp.x,tp.y,2); else if(dir==DOWN) stage.setCell(tp.x,tp.y,4); else if(dir==LEFT) stage.setCell(tp.x,tp.y,5); else if(dir==RIGHT) stage.setCell(tp.x,tp.y,3); nSteps++; redraw=true; } if(redraw){ redraw=false; g.setClip(4,6,120,144); lm.paint(g,4,6); flushGraphics(); } } if(fruitcnts==0){ g.setColor(0xff00ff); g.fillRoundRect(10,50,110,30,15,15); g.setColor(0); g.drawRoundRect(10,50,110,30,15,15); g.drawString("Stage clear!",20,53,g.TOP|g.LEFT); flushGraphics(); key=getKeyStates(); while(true){ key=getKeyStates(); if((key&FIRE_PRESSED)!=0) break; } try{ g.setClip(0,0,128,160); paper=Image.createImage("/paper.png"); g.drawImage(paper,0,0,g.TOP|g.LEFT); title=Image.createImage("/pass.png"); g.drawImage(title,20,10,g.TOP|g.LEFT); flushGraphics(); Thread.currentThread().sleep(500); g.drawString("步数:",20,50,g.TOP|g.LEFT); flushGraphics(); Thread.currentThread().sleep(300); g.drawString(Integer.toString(nSteps)+"步",80,50,g.TOP|g.LEFT); flushGraphics(); //Thread.currentThread().sleep(500); //g.drawString("X -1 = -"+Integer.toString(nSteps),80,50,g.TOP|g.LEFT); g.drawString("消去:",20,70,g.TOP|g.LEFT); flushGraphics(); Thread.currentThread().sleep(500); g.drawString(Integer.toString(nRmv)+"次",80,70,g.TOP|g.LEFT); flushGraphics(); //Thread.currentThread().sleep(500); //g.drawString("X 10 = "+Integer.toString(nRmv*10),60,70,g.TOP|g.LEFT); g.drawString("关卡分: "+Integer.toString(nStage*20+20+15*speed),20,90,g.TOP|g.LEFT); flushGraphics(); Thread.currentThread().sleep(500); g.drawString("得分: "+Integer.toString(20+nStage*20-nSteps+nRmv*10),20,112,g.TOP|g.LEFT); score=score+nStage*20-nSteps+nRmv*10+20+15*speed; g.drawString("总分: "+Integer.toString(score),20,132,g.TOP|g.LEFT); flushGraphics(); paper=null; title=null; }catch(IOException ioe){ }catch(InterruptedException ie){ } key=getKeyStates(); while(true){ key=getKeyStates(); if((key&FIRE_PRESSED)!=0) break; } continue; }else{ g.setColor(0xff00ff); g.fillRoundRect(10,50,110,30,15,15); g.setColor(0); g.drawRoundRect(10,50,110,30,15,15); g.drawString("游戏结束!",20,53,g.TOP|g.LEFT); flushGraphics(); key=getKeyStates(); boolean first=false,f=true; while(true){ key=getKeyStates(); if((key&FIRE_PRESSED)!=0){ first=true; } if((first)&&!((key&FIRE_PRESSED)!=0)){ if(f) f=false; else break; } } getKeyStates(); try{ rs=RecordStore.openRecordStore("scorerec",false); data=rs.getRecord(1); System.out.println(data[2]+" "+data[3]); for(i=0;i<5;i++){ if(score>(data[i*2]*256+data[i*2+1]))break; } if(i<5){ for(j=i;j<4;j++){ data[(j+1)*2]=data[j*2]; data[(j+1)*2+1]=data[j*2+1]; } data[i*2]=(byte)(score/256); data[i*2+1]=(byte)(score%256); rs.setRecord(1,data,0,10); rs.closeRecordStore(); g.setColor(0); paper=Image.createImage("/paper.png"); title=Image.createImage("/brk.png"); g.drawImage(paper,0,0,g.TOP|g.LEFT); g.drawImage(title,20,15,g.TOP|g.LEFT); flushGraphics(); for(j=0;j<5;j++){ if(j==i) g.setColor(0xff0000); else g.setColor(0); g.drawString(Integer.toString(j+1)+" "+Integer.toString(data[j*2]*256+data[j*2+1]),22,40+j*20,g.TOP|g.LEFT); } flushGraphics(); key=getKeyStates(); first=false;f=true; while(true){ key=getKeyStates(); if((key&FIRE_PRESSED)!=0){ first=true; } if((first)&&!((key&FIRE_PRESSED)!=0)){ if(f) f=false; else break; } } } paper=null; title=null; }catch(RecordStoreNotOpenException rsne){ System.out.println(rsne.getMessage()); }catch(InvalidRecordIDException ire){ System.out.println(ire.getMessage()); }catch(RecordStoreException rse){ System.out.println(rse.getMessage()); }catch(IOException ioe){ System.out.println(ioe.getMessage()); } parent.backToMenu(); return; } } try{ rs=RecordStore.openRecordStore("scorerec",false); data=rs.getRecord(1); for(i=0;i<5;i++){ if(score>(data[i*2]*256+data[i*2+1]))break; } if(i<5){ for(j=i;j<4;j++){ data[(j+1)*2]=data[j*2]; data[(j+1)*2+1]=data[j*2+1]; } data[i*2]=(byte)(score/256); data[i*2+1]=(byte)(score%256); rs.setRecord(1,data,0,10); rs.closeRecordStore(); g.setColor(0); paper=Image.createImage("/paper.png"); title=Image.createImage("/brk.png"); g.drawImage(paper,0,0,g.TOP|g.LEFT); g.drawImage(title,20,15,g.TOP|g.LEFT); for(j=0;j<5;j++){ if(j==i) g.setColor(0xff0000); else g.setColor(0); g.drawString(Integer.toString(j+1)+" "+Integer.toString(data[j*2]*256+data[j*2+1]),22,40+j*20,g.TOP|g.LEFT); } flushGraphics(); key=getKeyStates(); boolean first=false,f=true; while(true){ key=getKeyStates(); if((key&FIRE_PRESSED)!=0){ first=true; } if((first)&&!((key&FIRE_PRESSED)!=0)){ if(f) f=false; else break; } } } paper=null; title=null; }catch(Exception e){ System.out.println("error"); } } public void keyReleased(int keyCode){ if(keyCode==-22||keyCode==-7) pauseReq=!pauseReq; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -