📄 snakecanvas.java
字号:
import javax.microedition.lcdui.game.GameCanvas;import javax.microedition.lcdui.Canvas;import java.util.Vector;import java.util.Random;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.Image;import java.lang.Thread;import javax.microedition.media.Player;import javax.microedition.media.Manager;import javax.microedition.media.MediaException;import java.io.IOException;import java.io.InputStream;public class SnakeCanvas extends GameCanvas implements Runnable{ private mmenuCanvas parent; private Vector snake; private POINT food; private int score,lv; private int dir,sel; private Random rnd; private Graphics g; private boolean pauseReq,alive; private GameOpt option=null; private Player player=null; public SnakeCanvas(mmenuCanvas p,GameOpt go) { super(true); option=go; parent=p; this.setFullScreenMode(true); score=0; lv=0; rnd=new Random(System.currentTimeMillis()); snake=new Vector(); snake.addElement(new POINT(7,22)); snake.addElement(new POINT(6,22)); snake.addElement(new POINT(5,22)); dir=RIGHT; pauseReq=false; g=getGraphics(); food=new POINT(); try { InputStream is=getClass().getResourceAsStream("eat1.wav"); player= Manager.createPlayer(is,null); player.realize(); //player.start(); } catch (MediaException pe) { System.out.println(pe.getMessage()); } catch (IOException ioe) { System.out.println(ioe.getMessage()); } } public void run() { boolean k1,k2; int i; alive=true; POINT tp=new POINT();; long time,lastFlush=0; int key,nextDir; genFood(); g.setColor(0xfffffff); g.fillRect(0,0,128,160); g.setColor(0); g.fillRect(2,3,124,139); g.fillTriangle(118,152,125,152,121,159); g.drawChar('0',21,142,g.TOP|g.LEFT); g.setColor(0xfffffff); g.fillRect(4,5,120,135); nextDir=RIGHT; while(true){ if(pauseReq){ k1=false; sel=0; g.setColor(0xffffff); g.fillRect(20,20,90,48); g.setColor(0); g.drawRect(20,20,90,48); g.drawString("***PAUSE***",21,20,g.TOP|g.LEFT); g.drawString(" Back",20,36,g.TOP|g.LEFT); g.drawString(" Quit",20,52,g.TOP|g.LEFT); if(sel==0) g.drawChar('>',27,36,g.TOP|g.LEFT); else g.drawChar('>',27,52,g.TOP|g.LEFT); this.flushGraphics(); while(pauseReq){ key=getKeyStates(); k2=(key&UP_PRESSED)!=0||(key&DOWN_PRESSED)!=0; if(k1==true&&!k2){ k1=false; g.setColor(0xffffff); g.fillRect(20,20,90,48); g.setColor(0); g.drawRect(20,20,90,48); g.drawString("***PAUSE***",21,20,g.TOP|g.LEFT); sel=1-sel; g.drawString(" Back",20,36,g.TOP|g.LEFT); g.drawString(" Quit",20,52,g.TOP|g.LEFT); if(sel==0) g.drawChar('>',27,36,g.TOP|g.LEFT); else g.drawChar('>',27,52,g.TOP|g.LEFT); this.flushGraphics(); }else if(k2) k1=true; if((key&FIRE_PRESSED)!=0){ if(sel==0) pauseReq=false; else{ player.close(); player=null; parent.backToMenu(); return; } } } lastFlush=0; System.gc(); try{ player.start(); }catch(MediaException me){} } 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)lastFlush-=1; time=System.currentTimeMillis(); if((time-lastFlush)>1500/(lv+4)){ lastFlush=time; dir=nextDir; tp.setPoint(((POINT)snake.firstElement()).x,((POINT)snake.firstElement()).y); 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; } if(tp.x==-1||tp.y==-1||tp.x==40||tp.y==45){ alive=false; } for(i=4;i<snake.size();i++){ if(POINT.samePoint((POINT)snake.elementAt(i),tp)) alive=false; } if(!alive){ g.setColor(0xffffff); g.fillRect(30,30,90,20); g.setColor(0); g.drawRect(30,30,90,20); g.drawString("You Lose!",35,32,g.TOP|g.LEFT); this.flushGraphics(); while(true){ key=getKeyStates(); if((key&FIRE_PRESSED)!=0) { player.close(); player=null; parent.backToMenu(); return; } } } if(POINT.samePoint(tp,food)){ genFood(); snake.addElement(new POINT()); if(snake.size()%5==0) lv++; g.setColor(0xffffff); g.fillRect(20,142,50,16); g.setColor(0); g.drawString(Integer.toString(snake.size()-3),21,142,g.TOP|g.LEFT); if(option.sound){ try{ //player.setLoopCount(-1); player.start(); }catch(Exception me){} } } g.setColor(0xffffff); g.fillRect(4,5,120,135); g.setColor(0); g.fillRect(4+3*food.x,5+3*food.y,3,3); g.fillArc(4+3*tp.x,5+3*tp.y,3,3,0,360); 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); g.fillArc(4+3*((POINT)snake.elementAt(i)).x,5+3*((POINT)(snake.elementAt(i))).y,3,3,0,360); // System.out.println("snake["+i+"].x="+((POINT)snake.elementAt(i)).x+" y="+((POINT)snake.elementAt(i)).y); // System.out.println("free memory: "+Runtime.getRuntime().freeMemory()); } ((POINT)snake.firstElement()).setPoint(tp.x,tp.y); this.flushGraphics(); } } } private void genFood(){ boolean j=false; while(true){ food.setPoint(Math.abs(rnd.nextInt()%40),Math.abs(rnd.nextInt()%45)); for(int i=0;i<snake.size();i++){ if(POINT.samePoint(food,(POINT)snake.elementAt(i))){ j=true; break;} } if(!j) { System.out.println("food:("+food.x+","+food.y+")"); return; } j=false; } } public void keyReleased(int keyCode){ System.out.println(keyCode); if(keyCode==-22||keyCode==-7) pauseReq=!pauseReq; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -