程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> DOJA開發貪吃蛇的代碼

DOJA開發貪吃蛇的代碼

編輯:JAVA編程入門知識

  公司准備做手機游戲方面的項目,第一次做DOJA相關的項目,練習了“貪吃蛇”這個游戲,現把自己做的源代碼發布出來,希望給才接觸DOJA的新手一點提示和幫助。也歡迎大家提出改正。

  //主運行類

package greedSnake;
import com.nttdocomo.ui.Display;
import com.nttdocomo.ui.IApplication;
public class GreedSnake extends IApplication implements Runnable{
 public static final int GRID_WIDTH = 20;
 public static final int GRID_HEIGHT = 24;
 public static final int NODE_SIZE  = 10; 
 private Grid      grid = null;
 private Food   food = null;
 private Snake      snake = new Snake();;
 private boolean     running;
 private int    score;
 private int       level;
 private int       count; 
 private int    countMove;
 private int    timeInterval;
 
  //----------------------------------------
  /** Set up game. */
  public void start() {
  reset();
grid = new Grid(GRID_WIDTH, GRID_HEIGHT, this);
Display.setCurrent(grid);
Thread runner = new Thread(this);
runner.start();
 
  }
private void reset() {
 running = false;
 score = 0;
 level = 0;
 count = 0;
 countMove = 6;
 timeInterval = 200;
 }
 
  /** Runnable interface. */
  public void run() {
 food=grid.addFood();
 grid.addSnake(snake); 
 grid.repaint(); 
 for(;;) {
  if (food == null) {  
   food=grid.addFood();
   continue;  
  }  
  try {
  Thread.sleep(timeInterval);
  } catch (Exception e) {
  break;
  }  
   
  if (!running) {
  snake.move();
  Node head = snake.getHead();  
  if (grid.overlapsWith(head)||(snake.ptInSnake(head))){
   running = true; 
   continue;
  }
  if((head.x==food.getX())&&(head.y==food.getY())){
   int scoreGet=(10000-200*countMove)/timeInterval;
   score+=scoreGet>0 ? scoreGet : 0;
   countMove=0;
   snake.eatFood(food);
   grid.reduceFood(food);
   food=null;
   
   if( ++count%5 == 0){
   level++;
   }
 
  }else{
   countMove++; 
  } 
    
  grid.repaint();
  
  }else{
  grid.setGameOver();
  break;  
  }
 }
 
 grid.repaint(); 
 
  }
 
 public int getScore() {
 return score;
 } 
 
 /** Get the current level of the game. */
  public int getLevel() {
  return level;
  } 
/** Key event handler. */
  public void keyPressed(int key) {
   
 if (key == Display.KEY_SELECT) {
  grid.setGameOver();
 }
if (key == Display.KEY_LEFT) {   
  snake.setDirection(Snake.LEFT);
  }
if (key == Display.KEY_RIGHT) {
  snake.setDirection(Snake.RIGHT);
  }
if (key == Display.KEY_DOWN) {
  snake.setDirection(Snake.DOWN);
  }
  if (key == Display.KEY_UP) {
  snake.setDirection(Snake.UP);
  }     
 }
}
//畫面框架類
package greedSnake;
import com.nttdocomo.ui.Canvas;
import com.nttdocomo.ui.Display;
import com.nttdocomo.ui.Font;
import com.nttdocomo.ui.Frame;
import com.nttdocomo.ui.Graphics;
//---------------------
/**
 * This class represents the grid box that catches
 * the pieces dropping from above. If a dropped piece
 * fills up one or more horizontal lines in the grid,
 * these lines will be removed from it.
 */
public class Grid extends Canvas {
 private int    width;
 private int    height;
 private GreedSnake   listener;
 private Snake      snake;
 private Food  food;
 private String   pad = "0000";
 private Font    score_font;
 private Font    game_over_font;
 private boolean  blDisplay;
 private boolean  game_over;
 static final int  SOFT_LEFT = Frame.SOFT_KEY_1;
 static final int  SOFT_RIGHT = Frame.SOFT_KEY_2;
 
 /**
 * Create a new instance of this class.
 * @param witdth the width (in tiles) of this grid
 * @param height the height (in tiles) of this grid
 * @param score the score object to keep track of the score
 * @param listener a reference to the owning tetris object
 */
 public Grid(int width, int height, GreedSnake listener) {
this.width  = width;
 this.height  = height;
 this.listener = listener;
 reset();
 setSoftLabel(SOFT_LEFT, "New");
 setSoftLabel(SOFT_RIGHT, "Quit");
 score_font  = Font.getFont(Font.FACE_MONOSPACE | Font.SIZE_SMALL);
 game_over_font = Font.getFont(Font.FACE_PROPORTIONAL | Font.SIZE_LARGE | Font.STYLE_BOLD);
 }
 /** Remove all pieces from this instance */
 private void reset() {
 
 synchronized (this) {
  food = null;
  snake= null;
 }
 game_over = false;
 blDisplay = false;
 }
 
 public void setGameOver() {
 snake = null;
 food = null;
 game_over = true;
 }
/** Get the width (in tiles) of this instance. */
 public int getGridWidth() {
 return width;
 }
/** Get the height (in tiles) of this instance. */
 public int getGridHeight() {
 return height;
 }
 
 /** Add the specified piece to this instance. */
 public Food addFood() { 
 blDisplay= false;
 int gs = GreedSnake.GRID_WIDTH; 
 if(snake == null){  
  this.food =Food.createRandomFood(gs,gs);  
 }else{
  for(;;){  
  this.food =Food.createRandomFood(gs,gs);  
  Node newNode = new Node(food.getX(),food.getY());
  if(snake.ptInSnake(newNode)){
   this.food = null; 
   continue;
  }else{
   break; 
  }
  }   
 } 
 return this.food; 
 }
 
 public void addSnake(Snake snake) { 
 
 this.snake=snake;
 Node head=(Node)snake.getHead();
 }
 /**
 * Returns <code>true</code> if the specified
 * piece overlaps with any tile in this instance,
 * <code>false</code> otherwise.
 */
 public boolean overlapsWith(Node node) {
 if ((node.x<0) || (node.x>getGridWidth()-1)
  || (node.y<0) || (node.y>getGridHeight()-1)) {
     
  return true;
 }
 return false; 
 }
 
 public void reduceFood(Food food) {
 blDisplay = true;
 }
 
 private String format(int n) {
String raw = "" + n;
return pad.substring(0, 4 - raw.length()) + raw;
 }
/** Paint this instance onto the specified graphics context. */
 public synchronized void paint(Graphics g) {
 g.lock();
 g.setColor(Graphics.getColorOfName(Graphics.BLACK));
 g.fillRect(0, 0, getWidth(), getHeight());
 g.setColor(Graphics.getColorOfName(Graphics.WHITE));
 g.drawLine(0, 0, 0, getHeight());
 g.drawLine(201, 0, 201, getHeight());
 g.drawLine(0, getHeight(), 201, getHeight());
if ((food != null)&& (!blDisplay)) {
  food.paint(g);
 }
 
 if (snake != null) { 
  snake.paint(g);   
 }
  
 g.setColor(Graphics.getColorOfName(Graphics.SILVER));
 g.setFont(score_font); 
 g.drawString("LEVEL", 203, 40); 
 g.drawString(String.valueOf(listener.getLevel()), 220, 70);
 g.drawString("SCORE", 202, 100);
 g.drawString(format(listener.getScore()), 208, 130);
 
 if (game_over) { 
  g.setColor(0x00ffff);
  g.setFont(game_over_font);
  g.drawString("GAME", 70, 110);
  g.drawString("OVER", 70, 140);
 } 
 g.unlock(true);
 }
/** Process key events. */
 public void processEvent(int type, int param) {
if (type == Display.KEY_PRESSED_EVENT) {
  listener.keyPressed(param);
 }
 }
}
//蛇對象類
package greedSnake;
import java.util.Random;
import java.util.Vector;
import java.util.Enumeration;
import com.nttdocomo.ui.Graphics;
public class Snake {
 public final static int UP   = 1;
 public final static int DOWN  = 3;
 public final static int LEFT  = 2;
 public final static int RIGHT = 4;
 private int     direction;
//   private Grid           grid;
 private Node           node;
 private Vector     snakeData = null;
   private static Random      rnd    = new Random();
/** Private internal constructor. */
 public Snake() {
 snakeData = new Vector();
 Node node = new Node(4,0);
 snakeData.addElement(node);
 node = new Node(3,0);
 snakeData.addElement(node);
 node = new Node(2,0);
 snakeData.addElement(node);
 node = new Node(1,0);
 snakeData.addElement(node);
 node = new Node(0,0);
 snakeData.addElement(node);
 setDirection(Snake.DOWN);
 }
 
 public int getDirection() {
 return direction;
 }
 
 public void setDirection(int dir) {
 if(direction%2!=dir%2){
  direction = dir;  
 }
 }  
 public Node getHead() {
 return (Node) snakeData.elementAt(0);
 }
  
 public Node getNextHead() {
 Node node = (Node) snakeData.elementAt(0);
 node = new Node(node.x,node.y);
 switch(this.direction) {
  case Snake.UP:
  node.y--;
  break;
  case Snake.DOWN:
   node.y++;
   break;
   case Snake.LEFT:
   node.x--;
   break;
   case Snake.RIGHT:
   node.x++;
   break;
  }    
  return node;
  }
  
  public void move() { 
 Node node= (Node)snakeData.elementAt(0);
 Node newNode = this.getNextHead(); 
  for (int i =snakeData.size()-1 ; i>0; i--) {
  Node node1 = (Node) snakeData.elementAt(i);
  Node node2 = (Node) snakeData.elementAt(i-1);
   node1.x = node2.x;
   node1.y = node2.y; 
  }
  node.x = newNode.x;
  node.y = newNode.y;
 
  }
 
 public void addNode() {
 Node node = (Node) snakeData.lastElement();
 Node newNode = new Node(node.x,node.y);
 snakeData.addElement(newNode);
 }
   
  public void paint(Graphics g) {
  int SnakeColor= 0xff0000;
  int gn = GreedSnake.NODE_SIZE;
 Enumeration e = snakeData.elements() ;
 while(e.hasMoreElements()){
  Node node = (Node)e.nextElement() ;
    g.setColor(SnakeColor);
  g.fillRect(node.x * gn, node.y * gn, gn, gn);
  }
  }
public void eatFood(Food food) {
   
 this.addNode();
 
 }
 public boolean ptInSnake(Node node) { 
 for (int i = 1; i<snakeData.size(); i++) {
  Node nodeInSnake = (Node) snakeData.elementAt(i);
  if ((nodeInSnake.x == node.x)&&(nodeInSnake.y == node.y)) {
  return true;  
  }
 }
 return false;
 }  
}
//食物對象類
package greedSnake;
import java.util.Random;
import com.nttdocomo.ui.Graphics;
public class Food {
 private int           x;
 private int           y;
 private static Random      rnd = new Random();
 
 private Food(int x,int y) {
  this.x   = x;
  this.y   = y; 
 }
 
 public static Food createRandomFood(int width,int height) {
   return createFood( getRandomInt(width),getRandomInt(height));
 }
 
 private static int getRandomInt(int limit) {
   return Math.abs(rnd.nextInt() % limit);
 }
 
 private static Food createFood(int x,int y) { 
 return new Food(x,y); 
}
 /**
 * Get the x coordinate of the base
 * location of this instance.
 */
 public int getX() {
 return x;
 }
/**
 * Get the y coordinate of the base
 * location of this instance.
 */
 public int getY() {
 return y;
 }
/** Paint this instance onto the specified Graphics context. */
 public synchronized void paint(Graphics g) {
 int gn = GreedSnake.NODE_SIZE;
 int FoodColor= 0x0000ff; 
 g.setColor(FoodColor);
 g.fillRect(this.getX()* gn,this.getY()* gn,gn,gn); 
 }
}
 
//節點對象類
/package greedSnake;
public class Node {
 public int x;
 public int y;
/** Create a new instance of this class. */
 public Node(int x, int y) {
 this.x = x;
 this.y = y;
 }
 
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved