最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)貪吃蛇極速版

 更新時(shí)間:2021年09月13日 16:01:44   作者:July  
這篇文章主要為大家分享了java貪吃蛇極速版,貪吃蛇經(jīng)典手機(jī)游戲,既簡(jiǎn)單又耐玩,本文用java來(lái)實(shí)現(xiàn)下貪吃蛇小游戲,感興趣的小伙伴可以參考下

本文為大家推薦了一款由java實(shí)現(xiàn)經(jīng)典小游戲:貪吃蛇,相信大家都玩過(guò),如何實(shí)現(xiàn)的吶?

效果圖:

廢話不多說(shuō),直接奉上代碼:

1、

public class GreedSnake {
  public static void main(String[] args) {
    SnakeModel model = new SnakeModel(20,30);
    SnakeControl control = new SnakeControl(model);
    SnakeView view = new SnakeView(model,control);
    //添加一個(gè)觀察者,讓view成為model的觀察者
    model.addObserver(view);
   
    (new Thread(model)).start();
  }
}

2、

package mvcTest;

//SnakeControl.java
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class SnakeControl implements KeyListener{
  SnakeModel model;

  public SnakeControl(SnakeModel model){
    this.model = model;
  }

  public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
    if (model.running){        // 運(yùn)行狀態(tài)下,處理的按鍵
      switch (keyCode) {
        case KeyEvent.VK_UP:
          model.changeDirection(SnakeModel.UP);
          break;
        case KeyEvent.VK_DOWN:
          model.changeDirection(SnakeModel.DOWN);
          break;
        case KeyEvent.VK_LEFT:
          model.changeDirection(SnakeModel.LEFT);
          break;
        case KeyEvent.VK_RIGHT:
          model.changeDirection(SnakeModel.RIGHT);
          break;
        case KeyEvent.VK_ADD:
        case KeyEvent.VK_PAGE_UP:
          model.speedUp();
          break;
        case KeyEvent.VK_SUBTRACT:
        case KeyEvent.VK_PAGE_DOWN:
          model.speedDown();
          break;
        case KeyEvent.VK_SPACE:
        case KeyEvent.VK_P:
          model.changePauseState();
          break;
        default:
      }
    }

    // 任何情況下處理的按鍵,按鍵導(dǎo)致重新啟動(dòng)游戲
    if (keyCode == KeyEvent.VK_R ||
        keyCode == KeyEvent.VK_S ||
        keyCode == KeyEvent.VK_ENTER) {
      model.reset();
    }
  }

  public void keyReleased(KeyEvent e) {
  }

  public void keyTyped(KeyEvent e) {
  }
}

3、

package mvcTest;


//SnakeModel.java
import javax.swing.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Random;


class SnakeModel extends Observable implements Runnable {
  boolean[][] matrix;             // 指示位置上有沒(méi)蛇體或食物
  LinkedList nodeArray = new LinkedList();  // 蛇體
  Node food;
  int maxX;
  int maxY;
  int direction = 2;             // 蛇運(yùn)行的方向
  boolean running = false;          // 運(yùn)行狀態(tài)

  int timeInterval = 200;           // 時(shí)間間隔,毫秒
  double speedChangeRate = 0.75;       // 每次得速度變化率
  boolean paused = false;           // 暫停標(biāo)志

  int score = 0;               // 得分
  int countMove = 0;             // 吃到食物前移動(dòng)的次數(shù)

  // UP and DOWN should be even
  // RIGHT and LEFT should be odd
  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 SnakeModel( int maxX, int maxY) {
    this.maxX = maxX;
    this.maxY = maxY;

    reset();
  }

  public void reset(){
    direction = SnakeModel.UP;       // 蛇運(yùn)行的方向
    timeInterval = 200;           // 時(shí)間間隔,毫秒
    paused = false;             // 暫停標(biāo)志
    score = 0;               // 得分
    countMove = 0;             // 吃到食物前移動(dòng)的次數(shù)

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

    // initial the snake
    // 初始化蛇體,如果橫向位置超過(guò)20個(gè),長(zhǎng)度為10,否則為橫向位置的一半
    int initArrayLength = maxX > 20 ? 10 : maxX / 2;
    nodeArray.clear();
    for (int i = 0; i < initArrayLength; ++i) {
      int x = maxX / 2 + i;//maxX被初始化為20
      int y = maxY / 2;  //maxY被初始化為30
      //nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]
      //默認(rèn)的運(yùn)行方向向上,所以游戲一開(kāi)始nodeArray就變?yōu)椋?
      //    [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]
      nodeArray.addLast(new Node(x, y));
      matrix[x][y] = true;
    }

    // 創(chuàng)建食物
    food = createFood();
    matrix[food.x][food.y] = true;
  }

  public void changeDirection(int newDirection) {
    // 改變的方向不能與原來(lái)方向同向或反向
    if (direction % 2 != newDirection % 2) {
      direction = newDirection;
    }
  }

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

    // 根據(jù)方向增減坐標(biāo)值
    switch (direction) {
      case UP:
        y--;
        break;
      case DOWN:
        y++;
        break;
      case LEFT:
        x--;
        break;
      case RIGHT:
        x++;
        break;
    }

    // 如果新坐標(biāo)落在有效范圍內(nèi),則進(jìn)行處理
    if ((0 <= x && x < maxX) && (0 <= y && y < maxY)) {
    
      if (matrix[x][y]) {    // 如果新坐標(biāo)的點(diǎn)上有東西(蛇體或者食物)
        if (x == food.x && y == food.y) {    // 吃到食物,成功
          nodeArray.addFirst(food);      // 從蛇頭贈(zèng)長(zhǎng)

          // 分?jǐn)?shù)規(guī)則,與移動(dòng)改變方向的次數(shù)和速度兩個(gè)元素有關(guān)
          int scoreGet = (10000 - 200 * countMove) / timeInterval;
          score += scoreGet > 0 ? scoreGet : 10;
          countMove = 0;

          food = createFood();        // 創(chuàng)建新的食物
          matrix[food.x][food.y] = true;   // 設(shè)置食物所在位置
          return true;
        } else                 // 吃到蛇體自身,失敗
          return false;
        
      } else {         // 如果新坐標(biāo)的點(diǎn)上沒(méi)有東西(蛇體),移動(dòng)蛇體
        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()) {
          setChanged();      // Model通知View數(shù)據(jù)已經(jīng)更新
          notifyObservers();
        } else {
          JOptionPane.showMessageDialog(null,
              "you failed",
              "Game Over",
              JOptionPane.INFORMATION_MESSAGE);
          break;
        }
      }
    }
    running = false;
  }

  private Node createFood() {
    int x = 0;
    int y = 0;
    // 隨機(jī)獲取一個(gè)有效區(qū)域內(nèi)的與蛇體和食物不重疊的位置
    do {
      Random r = new Random();
      x = r.nextInt(maxX);
      y = r.nextInt(maxY);
    } while (matrix[x][y]);

    return new Node(x, y);
  }

  public void speedUp() {
    timeInterval *= speedChangeRate;
  }

  public void speedDown() {
    timeInterval /= speedChangeRate;
  }

  public void changePauseState() {
    paused = !paused;
  }

  public String toString() {
    String result = "";
    for (int i = 0; i < nodeArray.size(); ++i) {
      Node n = (Node) nodeArray.get(i);
      result += "[" + n.x + "," + n.y + "]";
    }
    return result;
  }
}

class Node {
  int x;
  int y;

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

4、

package mvcTest;

//SnakeView.java
import javax.swing.*;
import java.awt.*;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Observer;


public class SnakeView implements Observer {
  SnakeControl control = null;
  SnakeModel model = null;

  JFrame mainFrame;
  Canvas paintCanvas;
  JLabel labelScore;

  public static final int canvasWidth = 200;
  public static final int canvasHeight = 300;

  public static final int nodeWidth = 10;
  public static final int nodeHeight = 10;

  public SnakeView(SnakeModel model, SnakeControl control) {
    this.model = model;
    this.control = control;

    mainFrame = new JFrame("GreedSnake");

    Container cp = mainFrame.getContentPane();

    // 創(chuàng)建頂部的分?jǐn)?shù)顯示
    labelScore = new JLabel("Score:");
    cp.add(labelScore, BorderLayout.NORTH);

    // 創(chuàng)建中間的游戲顯示區(qū)域
    paintCanvas = new Canvas();
    paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1);
    paintCanvas.addKeyListener(control);
    cp.add(paintCanvas, BorderLayout.CENTER);

    // 創(chuàng)建底下的幫助欄
    JPanel panelButtom = new JPanel();
    panelButtom.setLayout(new BorderLayout());
    JLabel labelHelp;
    labelHelp = new JLabel("PageUp, PageDown for speed;", JLabel.CENTER);
    panelButtom.add(labelHelp, BorderLayout.NORTH);
    labelHelp = new JLabel("ENTER or R or S for start;", JLabel.CENTER);
    panelButtom.add(labelHelp, BorderLayout.CENTER);
    labelHelp = new JLabel("SPACE or P for pause", JLabel.CENTER);
    panelButtom.add(labelHelp, BorderLayout.SOUTH);
    cp.add(panelButtom, BorderLayout.SOUTH);

    mainFrame.addKeyListener(control);
    mainFrame.pack();
    mainFrame.setResizable(false);
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    mainFrame.setVisible(true);
  }

  void repaint() {
    Graphics g = paintCanvas.getGraphics();

    //draw background
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, canvasWidth, canvasHeight);

    // draw the snake
    g.setColor(Color.BLACK);
    LinkedList na = model.nodeArray;
    Iterator it = na.iterator();
    while (it.hasNext()) {
      Node n = (Node) it.next();
      drawNode(g, n);
    }

    // draw the food
    g.setColor(Color.RED);
    Node n = model.food;
    drawNode(g, n);

    updateScore();
  }

  private void drawNode(Graphics g, Node n) {
    g.fillRect(n.x * nodeWidth,
        n.y * nodeHeight,
        nodeWidth - 1,
        nodeHeight - 1);
  }

  public void updateScore() {
    String s = "Score: " + model.score;
    labelScore.setText(s);
  }

  public void update(Observable o, Object arg) {
    repaint();
  }
}

本文的目的就是帶著大家回味經(jīng)典,但是更主要的目的就是幫助大家學(xué)習(xí)好java程序設(shè)計(jì)。

相關(guān)文章

  • sharding-jdbc5.0.0實(shí)現(xiàn)分表實(shí)踐

    sharding-jdbc5.0.0實(shí)現(xiàn)分表實(shí)踐

    本文主要介紹了sharding-jdbc5.0.0分表實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 冒泡排序算法原理及JAVA實(shí)現(xiàn)代碼

    冒泡排序算法原理及JAVA實(shí)現(xiàn)代碼

    關(guān)鍵字較小的記錄好比氣泡逐趟上浮,關(guān)鍵字較大的記錄好比石塊下沉,每趟有一塊最大的石塊沉底
    2014-01-01
  • 淺談MyBatis Plus主鍵設(shè)置策略

    淺談MyBatis Plus主鍵設(shè)置策略

    本文主要介紹了MyBatis Plus主鍵設(shè)置策略,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • idea下載svn的項(xiàng)目并且運(yùn)行操作

    idea下載svn的項(xiàng)目并且運(yùn)行操作

    這篇文章主要介紹了idea下載svn的項(xiàng)目并且運(yùn)行操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 使用Java實(shí)現(xiàn)創(chuàng)建Excel表單控件

    使用Java實(shí)現(xiàn)創(chuàng)建Excel表單控件

    在數(shù)據(jù)填報(bào)時(shí),創(chuàng)建Excel表單控件是一項(xiàng)常見(jiàn)的任務(wù),它可以極大地簡(jiǎn)化數(shù)據(jù)收集和處理的過(guò)程,本文主要介紹了如何使用Java實(shí)現(xiàn)創(chuàng)建Excel表單控件,感興趣的可以了解下
    2024-03-03
  • 如何在java 8 stream表達(dá)式實(shí)現(xiàn)if/else邏輯

    如何在java 8 stream表達(dá)式實(shí)現(xiàn)if/else邏輯

    這篇文章主要介紹了如何在java 8 stream表達(dá)式實(shí)現(xiàn)if/else邏輯,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java根據(jù)ip地址獲取歸屬地實(shí)例詳解

    Java根據(jù)ip地址獲取歸屬地實(shí)例詳解

    這篇文章主要為大家介紹了Java根據(jù)ip地址獲取歸屬地實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • springboot中使用redis由淺入深解析

    springboot中使用redis由淺入深解析

    這篇文章主要由淺入深為大家介紹了springboot中使用redis的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Springboot使用JustAuth實(shí)現(xiàn)各種第三方登陸

    Springboot使用JustAuth實(shí)現(xiàn)各種第三方登陸

    本文主要介紹了Springboot使用JustAuth實(shí)現(xiàn)各種第三方登陸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Springboot把外部依賴包納入Spring容器管理的兩種方式

    Springboot把外部依賴包納入Spring容器管理的兩種方式

    這篇文章主要給大家介紹了Springboot把外部依賴包納入Spring容器管理的兩種方式,Spring.factories和org.springframework.boot.autoconfigure.AutoConfiguration.imports,有感興趣的小伙伴可以參考閱讀本文
    2023-07-07

最新評(píng)論

桃园市| 敖汉旗| 弥渡县| 蒙阴县| 遂川县| 衡阳县| 宝丰县| 盘山县| 泗水县| 揭阳市| 竹北市| 历史| 平阴县| 栖霞市| 同德县| 阆中市| 仪征市| 玛曲县| 迁西县| 布尔津县| 永胜县| 景德镇市| 恭城| 临邑县| 拉萨市| 肇州县| 普定县| 靖安县| 眉山市| 赫章县| 喀什市| 庄河市| 岢岚县| 嘉祥县| 水富县| 仁布县| 孟津县| 台前县| 新兴县| 堆龙德庆县| 洛隆县|