| 
 
TA的每日心情|  | 开心 2021-3-12 23:18
 | 
|---|
 签到天数: 2 天 [LV.1]初来乍到 | 
 
| 
//文件名:SnakeMIDlet .java package snake; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class SnakeMIDlet extends MIDlet {
 SnakeCanvas displayable = new SnakeCanvas();
 public SnakeMIDlet() {
 Display.getDisplay(this).setCurrent(displayable);
 }     public void startApp() {}     public void pauseApp() {}     public void destroyApp(boolean unconditional) {} }  //文件名:SnakeCanvas.java package snake; import java.util.*;
 import javax.microedition.lcdui.*; /**
 * 贪吃蛇游戏
 */
 public class SnakeCanvas extends Canvas  implements Runnable{
 /**存储贪吃蛇节点坐标,其中第二维下标为0的代表x坐标,第二维下标是1的代表y坐标*/
 int[][] snake = new int[200][2];
 /**已经使用的节点数量*/
 int snakeNum;
 /**贪吃蛇运动方向,0代表向上,1代表向下,2代表向左,3代表向右*/
 int direction;
 /*移动方向*/
 /**向上*/
 private final int DIRECTION_UP = 0;
 /**向下*/
 private final int DIRECTION_DOWN = 1;
 /**向左*/
 private final int DIRECTION_LEFT = 2;
 /**向右*/
 private final int DIRECTION_RIGHT = 3;     /**游戏区域宽度*/
 int width;
 /**游戏区域高度*/
 int height;     /**蛇身单元宽度*/
 private final byte SNAKEWIDTH = 4;     /**是否处于暂停状态,true代表暂停*/
 boolean isPaused = false;
 /**是否处于运行状态,true代表运行*/
 boolean isRun = true;     /**时间间隔*/
 private final int SLEEP_TIME = 300;
 
 /**食物的X坐标*/
 int foodX;
 /**食物的Y坐标*/
 int foodY;
 /**食物的闪烁控制*/
 boolean b = true;
 
 /**Random对象*/
 Random random = new Random();
 
 public SnakeCanvas() {
 //初始化
 init();
 width = this.getWidth();
 height = this.getHeight();
 //启动线程
 new Thread(this).start();
 }     /**
 * 初始化开始数据
 */
 private void init(){
 //初始化节点数量
 snakeNum = 7;
 //初始化节点数据
 for(int i = 0;i < snakeNum;i++){
 snake[0] = 100 - SNAKEWIDTH * i;
 snake[1] = 40;
 }
 //初始化移动方向
 direction = DIRECTION_RIGHT;
 //初始化食物坐标
 foodX = 100;
 foodY = 100;
 }     protected void paint(Graphics g) {
 //清屏
 g.setColor(0xffffff);
 g.fillRect(0,0,width,height);
 g.setColor(0);         //绘制蛇身
 for(int i = 0;i < snakeNum;i++){
 g.fillRect(snake[0],snake[1],SNAKEWIDTH,SNAKEWIDTH);
 }
 //绘制食物
 if(b){
 g.fillRect(foodX,foodY,SNAKEWIDTH,SNAKEWIDTH);
 }
 }     private void move(int direction){
 //蛇身移动
 for(int i = snakeNum - 1;i > 0;i--){
 snake[0] = snake[i - 1][0];
 snake[1] = snake[i - 1][1];
 }         //第一个单元格移动
 switch(direction){
 case DIRECTION_UP:
 snake[0][1] = snake[0][1] - SNAKEWIDTH;
 break;
 case DIRECTION_DOWN:
 snake[0][1] = snake[0][1] + SNAKEWIDTH;
 break;
 case DIRECTION_LEFT:
 snake[0][0] = snake[0][0] - SNAKEWIDTH;
 break;
 case DIRECTION_RIGHT:
 snake[0][0] = snake[0][0] + SNAKEWIDTH;
 break;
 }
 }
 /**
 * 吃掉食物,自身增长
 */
 private void eatFood(){
 //判别蛇头是否和食物重叠
 if(snake[0][0] == foodX && snake[0][1] == foodY){
 snakeNum++;
 generateFood();
 }
 }
 /**
 * 产生食物
 * 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合
 */
 private void generateFood(){
 while(true){
 foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1))
 / SNAKEWIDTH * SNAKEWIDTH;
 foodY = Math.abs(random.nextInt() % (height - SNAKEWIDTH + 1))
 / SNAKEWIDTH * SNAKEWIDTH;
 boolean b = true;
 for(int i = 0;i < snakeNum;i++){
 if(foodX == snake[0] && snake[1] == foodY){
 b = false;
 break;
 }
 }
 if(b){
 break;
 }
 }
 }
 
 /**
 * 判断游戏是否结束
 * 结束条件:
 *        1、蛇头超出边界
 *        2、蛇头碰到自身
 */
 private boolean isGameOver(){
 //边界判别
 if(snake[0][0] < 0 || snake[0][0] > (width - SNAKEWIDTH) ||
 snake[0][1] < 0 || snake[0][1] > (height - SNAKEWIDTH)){
 return true;
 }
 //碰到自身
 for(int i = 4;i < snakeNum;i++){
 if(snake[0][0] == snake[0]
 && snake[0][1] == snake[1]){
 return true;
 }
 }
 
 return false;
 }  /**
 * 事件处理
 */
 public void keyPressed(int keyCode){
 int action = this.getGameAction(keyCode);
 //改变方向
 switch(action){
 case UP:
 if(direction != DIRECTION_DOWN){
 direction = DIRECTION_UP;
 }
 break;
 case DOWN:
 if(direction != DIRECTION_UP){
 direction = DIRECTION_DOWN;
 }
 break;
 case LEFT:
 if(direction != DIRECTION_RIGHT){
 direction = DIRECTION_LEFT;
 }
 break;
 case RIGHT:
 if(direction != DIRECTION_LEFT){
 direction = DIRECTION_RIGHT;
 }
 break;
 case FIRE:
 //暂停和继续
 isPaused = !isPaused;
 break;
 }
 }  /**
 * 线程方法
 * 使用精确延时
 */
 public void run(){
 try{
 while (isRun) {
 //开始时间
 long start = System.currentTimeMillis();
 
 
 if(!isPaused){
 //吃食物
 eatFood();
 //移动
 move(direction);
 
 //结束游戏
 if(isGameOver()){
 break;
 }
 
 //控制闪烁
 b = !b;
 }
 //重新绘制
 repaint();
 
 long end = System.currentTimeMillis();
 
 //延时
 if(end - start < SLEEP_TIME){
 Thread.sleep(SLEEP_TIME - (end - start));
 }
 }
 }catch(Exception e){}
 }
 } 效果图:
   
 
 
 
 
 
 
 
 
 
 
 
 源码下载:http://203.93.208.26/kj/cwb/dir7/SnakeMIDlet.zip
 | 
 |