⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 onesnakemodel.java

📁 是一个贪吃蛇的游戏
💻 JAVA
字号:
 package OnePlayer;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Random;

import javax.swing.JOptionPane;

class OneSnakeModel implements Runnable{
  OneSnake gs;
  boolean[][] matrix;
  LinkedList nodeArray = new LinkedList();
  Node food;
  int maxX;
  int maxY;
  
  /*
   * 运行状态
   */
  boolean running = false;
  
  /*
   *开始移动方向 
   */
  int direction = 3;
  
  /*
   * 两次移动间的睡眠时间(ms)
   */
  int timeInterval = 250;
  
  /*
   * 速度因子
   */
  double speedChangeRate = 0.75;
  
  /*
   * 暂停状态
   */
  boolean paused = false;
  
  int score = 0;
  int countMove = 0;

	/*
	 * 上下为偶数,左右为奇数
	 * 原因见changeDirection(int newDirection)
	 */
  public static final int UP = 2;
  public static final int DOWN = 4;
  public static final int LEFT = 1;
  public static final int RIGHT = 3;

  
  
  public OneSnakeModel(){}
  
  public OneSnakeModel(OneSnake gs, int maxX, int maxY){
    this.gs = gs;
    this.maxX = maxX;
    this.maxY = maxY;

    // initial matirx
    matrix = new boolean[maxX][];
    for(int i=0; i<maxX; ++i){
      matrix[i] = new boolean[maxY];
      Arrays.fill(matrix[i],false);
    }

    
    /*
     * 设置蛇开始状态的长度
     * maxX是  游戏界面的宽度/蛇的宽度
     */
    int initArrayLength = maxX > 20 ? 10 : maxX/2;
    for(int i = 0; i < initArrayLength; ++i){
      int x = 0;
      int y = 0;
      nodeArray.addLast(new Node(x, y));
      matrix[x][y] = true;
    }

    food = createFood();
//    matrix[food.x][food.y] = true;
  }

  /*
   * 改变方向
   * 
   * 判断(%2)是为了当按下方向命令与当前方向"水平"时,不改变方向
   * 而按下方向命令与当前方向"垂直"时,改变方向
   * eg:当方向向上时
   * 按下"向上"和"向下"时方向不变
   * 按下"向左"和"向右"时才改变方向
   */
  public void changeDirection(int newDirection){
    if (direction % 2 != newDirection % 2){
      direction = newDirection;
    }
  }

  public boolean moveOn(){
    Node n = (Node)nodeArray.getFirst();
    int x = n.x;
    int y = n.y;

    switch(direction){
      case UP:
        y--;
        break;
      case DOWN:
        y++;
        break;
      case LEFT:
        x--;
        break;
      case RIGHT:
        x++;
        break;
    }
    
    /*
     * 判断是否在游戏界面内
     */
    if ((0 <= x && x < maxX) && (0 <= y && y < maxY)){
    	/*
    	 * 判断当前点是否有为空
    	 * 不为空情况
    	 */
      if (matrix[x][y]){
    	  /*
    	   * 判断是否是食物
    	   * 是食物就往第一个节点添加一点
    	   */
        if(x == food.x && y == food.y){
          nodeArray.addFirst(food);
          
          /*
           * 计算分数,分数跟移动格数有关
           * 清空移动格数
           */
          int scoreGet = (10000 - 200 * countMove) / timeInterval;
          score += scoreGet > 0? scoreGet : 10;
          countMove = 0;
          
          /*
           * 
           */
          food = createFood();
//          matrix[food.x][food.y] = true;
          return true;
        }
        /*
         * 不是食物情况(咬到自己),游戏结束
         */
        else
          return false;
      }
      /*
       * 为空情况
       */
      else{
        nodeArray.addFirst(new Node(x,y));
        matrix[x][y] = true;
        n = (Node)nodeArray.removeLast();
        matrix[n.x][n.y] = false;
        countMove++;
        return true;
      }
    }
    return false;
  }

  
  public void run(){
    running = true;
    while (running){
      try{
        Thread.sleep(timeInterval);
      }
      catch(Exception e){
        break;
      }
      
	
      if(!paused){
        if (moveOn()){
          gs.repaint();
        }
        else{
          JOptionPane.showMessageDialog(
              null,
              "You Source:"+score,
              "Game Over",
              JOptionPane.INFORMATION_MESSAGE);
          break;
        }
      }
    }
    running = false;
  }

  
  /*
   * 随机创建一个食物
   */
  public Node createFood(){
    int x = 0;
    int y = 0;
    do{
      Random r = new Random();
      x = r.nextInt(maxX);
      y = r.nextInt(maxY);
    }while(matrix[x][y]);
    matrix[x][y] = true;
    return new Node(x,y);
  }
  
  /*
   *加快移动速度 
   */
  public void speedUp(){
    timeInterval *= speedChangeRate;
  }
  /*
   * 减慢移动速度
   */
  public void speedDown(){
    timeInterval /= speedChangeRate;
  }
  
  /*
   * 改变当前暂停状态
   */
  public void changePauseState(){
    paused = !paused;
  }

}

class Node{
  int x;
  int y;
  Node(int x, int y){
    this.x = x;
    this.y = y;
  }
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -