一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java貪吃蛇極速版

java貪吃蛇極速版

2020-03-12 11:23July JAVA教程

這篇文章主要為大家分享了java貪吃蛇極速版,貪吃蛇經(jīng)典手機(jī)游戲,既簡(jiǎn)單又耐玩,本文用java來(lái)實(shí)現(xiàn)下貪吃蛇小游戲,感興趣的小伙伴可以參考下

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

效果圖:

java貪吃蛇極速版

java貪吃蛇極速版

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

1、

?
1
2
3
4
5
6
7
8
9
10
11
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、

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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、

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
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;             // 指示位置上有沒蛇體或食物
  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
    // 初始化蛇體,如果橫向位置超過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)行方向向上,所以游戲一開始nodeArray就變?yōu)椋?/code>
      //    [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)上沒有東西(蛇體),移動(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、

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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ì)。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲AV 无码AV 中文字幕 | 久久精品无码一区二区日韩av | 免费看黄色片的网站 | 和直男装修工在工地啪 | 范冰冰特黄xx大片 | 荷兰艾优apiyoo | 五月色婷婷网在线观看 | 华人亚洲欧美精品国产 | 国产rpg迷雾之风冷狐破解 | 啊用力好大粗黑人小说 | 荷兰精品女人性hd | 日本乱中文字幕系列在线观看 | 天堂8在线天堂资源bt | 亚洲国产精品自在在线观看 | 国产精品久久国产精品99 gif | 国产精品视频网 | 四虎影视永久在线精品免费 | 男人好大好硬好爽免费视频 | 91嫩草国产在线观看免费 | 91私密保健女子养生spa | 欧美作爱福利免费观看视频 | 二区免费视频 | 免费观看韩剧网站在线观看 | 国产91对白在线观看 | 国产欧美日韩在线观看精品 | 国产精品久久久久这里只有精品 | 五月一区二区久久综合天堂 | 国产成+人+综合+欧美 亚洲 | 欧美黑人换爱交换乱理伦片 | 插鸡网站 | 香蕉久久一区二区不卡无毒影院 | 日本网络视频www色高清免费 | gayrb漫画免费入口 | 99re这里只有精品视频在线观看 | 俄罗斯大白屁股 | 小舞丝袜调教喷水沦为肉奴 | dyav午夜片 | 国产一精品一av一免费爽爽 | 日本一区二区三区久久 | 韩国美女被的免费视频 | 赤色疑惑 |