21xrx.com
2025-03-29 04:05:16 Saturday
文章检索 我的文章 写文章
关键词:Java、简单、贪吃蛇
2023-06-14 10:16:56 深夜i     7     0

Java编程是众多程序员所热衷的领域之一,特别是对于初学者而言,实现一个简单的游戏是入门的好方法。本文就将通过编写一个Java版的贪吃蛇游戏来介绍Java编程的基础知识和语法。

首先,我们需要明确贪吃蛇游戏的基本规则和逻辑。游戏开始后,贪吃蛇会在地图上不断移动,玩家操控蛇头的移动方向,让蛇吃掉食物并让蛇身变长。当蛇撞到自己或者地图边缘时游戏结束。那么,如何用Java来实现这个游戏呢?

首先,我们需要设计游戏的界面。一个简单的贪吃蛇游戏界面可以采用Java中的AWT和Swing包来实现。接下来,我们需要定义一个Snake类来描述贪吃蛇的行为。Snake类可以包括蛇的初始长度、蛇的方向、蛇的移动方法等成员属性和方法。其中,蛇的移动方法可以通过定时器来实现,即每隔一段时间蛇会自动移动一格。当玩家控制蛇头改变方向时,需要对蛇的方向进行修改,并在迭代过程中实现蛇身的变化。

以下是一个简单的基于Java的贪吃蛇代码实现,供参考:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class Snake extends JFrame implements KeyListener {
  private JPanel mainPanel, boardPanel;
  private JLabel[][] slot;
  private int[][] board;
  private SnakeBody head, tail;
  private Key key;
  private int timer, score, speed, difficulty;
  public static void main(String[] args) {
    new Snake();
  }
  Snake() {
    mainPanel = new JPanel();
    add(mainPanel);
    mainPanel.setLayout(new BorderLayout());
    boardPanel = new JPanel();
    boardPanel.setLayout(new GridLayout(20,20));
    mainPanel.add(boardPanel, BorderLayout.CENTER);
    slot = new JLabel[20][20];
    board = new int[20][20];
    for(int x = 0; x < 20; x++) {
      for(int y = 0; y < 20; y++) {
        slot[x][y] = new JLabel();
        boardPanel.add(slot[x][y]);
        board[x][y] = 0;
      }
    }
    head = new SnakeBody(10,10);
    tail = head;
    board[10][10] = 1;
    board[11][10] = -1;
    key = new Key();
    addKeyListener(key);
    timer = 0;
    score = 0;
    speed = 6;
    difficulty = 1;
    setSize( 400, 425 );
    setVisible( true );
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setResizable(false);
    run();
  }
  public void run() {
    boolean playing = true;
    while(playing) {
      delay(speed);
      addTail();
      move();
      score++;
      if(score % 10 == 0 && difficulty < 10) difficultyUp();
      if(checkLose()) playing = false;
    }
    JOptionPane.showMessageDialog(this,"Game Over!","Snake",JOptionPane.PLAIN_MESSAGE);
  }
  public void addTail() {
    if( timer < 2 ) return;
    timer = 0;
    int x = tail.getX();
    int y = tail.getY();
    SnakeBody temp = new SnakeBody(x,y);
    tail.setN(next());
    tail = temp;
    board[x][y] = 1;
  }
  public void move() {
    int x = head.getX();
    int y = head.getY();
    switch(head.getD()) {
      case 0:
        y--;
        break;
      case 1:
        x--;
        break;
      case 2:
        y++;
        break;
      case 3:
        x++;
        break;
    }
    if(x == 19) x = 0;
    else if(x == -1) x = 19;
    if(y == 19) y = 0;
    else if(y == -1) y = 19;
    if(board[x][y] == 1) return;
    if(board[x][y] == -1) {
      removeFood();
      score += 100;
      speed += 3;
      SnakeBody temp = new SnakeBody(x,y);
      head.setP(temp);
      temp.setN(head);
      head = temp;
      board[x][y] = 1;
    }
    else {
      int l;
      SnakeBody temp = tail;
      l = temp.removeSelf();
      board[temp.getX()][temp.getY()] = 0;
      temp = new SnakeBody(x,y);
      head.setP(temp);
      temp.setN(head);
      head = temp;
      board[x][y] = 1;
    }
    for(int i = 0; i < 20; i++) {
      for(int j = 0; j < 20; j++) {
        if(board[i][j] == 0) slot[i][j].setBackground(Color.white);
        else if(board[i][j] == 1) slot[i][j].setBackground(Color.black);
        else slot[i][j].setBackground(Color.red);
      }
    }
  }
  public SnakeBody next() {
    SnakeBody temp = head;
    while(temp.getP() != null) {
      temp = temp.getP();
    }
    return temp;
  }
  public boolean checkLose() {
    int x = head.getX();
    int y = head.getY();
    if(x == 19) x = 0;
    else if(x == -1) x = 19;
    if(y == 19) y = 0;
    else if(y == -1) y = 19;
    if(board[x][y] == 1) return true;
    return false;
  }
  public void removeFood() {
    ArrayList
  l = new ArrayList 
  
   ();
  
 
    for(int x = 0; x < 20; x++) {
      for(int y = 0; y < 20; y++) {
        if(board[x][y] == -1) {
          l.add(x*20+y);
        }
      }
    }
    int r = (int)(Math.random() * l.size());
    int x = l.get(r)/20;
    int y = l.get(r)%20;
    board[x][y] = 0;
  }
  public void difficultyUp() {
    difficulty++;
    switch(difficulty) {
      case 2:
        JOptionPane.showMessageDialog(this,"Difficulty Up!","Snake",JOptionPane.PLAIN_MESSAGE);
        break;
      case 4:
        speed += 2;
        JOptionPane.showMessageDialog(this,"Difficulty Up!","Snake",JOptionPane.PLAIN_MESSAGE);
        break;
      case 6:
        speed += 2;
        JOptionPane.showMessageDialog(this,"Difficulty Up!","Snake",JOptionPane.PLAIN_MESSAGE);
        break;
      case 8:
        speed += 2;
        JOptionPane.showMessageDialog(this,"Difficulty Up!","Snake",JOptionPane.PLAIN_MESSAGE);
        break;
      case 10:
        speed += 2;
        JOptionPane.showMessageDialog(this,"You Win!","Snake",JOptionPane.PLAIN_MESSAGE);
        break;
      default:
        break;
    }
  }
  public void delay(int d) {
    int i = 0;
    while(i < d) {
      i++;
      timer++;
      try { Thread.sleep(5); }
      catch(InterruptedException e) { e.printStackTrace(); }
    }
  }
  public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if(key == KeyEvent.VK_LEFT && head.getD() != 3) head.setD(1);
    if(key == KeyEvent.VK_RIGHT && head.getD() != 1) head.setD(3);
    if(key == KeyEvent.VK_UP && head.getD() != 2) head.setD(0);
    if(key == KeyEvent.VK_DOWN && head.getD() != 0) head.setD(2);
  }
  public void keyTyped(KeyEvent e) {}
  public void keyReleased(KeyEvent e) {}
}
class SnakeBody {
  private int x, y, d;
  private SnakeBody p;
  private SnakeBody n;
  SnakeBody(int x, int y)
    this.x = x;
    this.y = y;
    d = 0;
    p = null;
    n = null;
  
  public int getX()
    return x;
  
  public int getY()
    return y;
  
  public int getD()
    return d;
  
  public void setD(int d)
    this.d = d;
  
  public SnakeBody getP()
    return p;
  
  public void setP(SnakeBody p)
    this.p = p;
  
  public SnakeBody getN()
    return n;
  
  public void setN(SnakeBody n)
    this.n = n;
  
  public int removeSelf() {
    SnakeBody prev = p;
    SnakeBody next = n;
    p.setN(next);
    n.setP(prev);
    return 0;
  }
}
class Key implements KeyListener {
  public void keyPressed(KeyEvent e) {}
  public void keyTyped(KeyEvent e) {}
  public void keyReleased(KeyEvent e) {}
}

通过上面的代码,我们就可以编写一个简单的Java版贪吃蛇游戏了。在代码实现过程中,我们需要熟练掌握Java语言的基础语法和常用类库,特别是AWT和Swing包的使用方法。

总的来说,Java编程并不难,适合初学者入门。而编写一个简单的游戏不仅是学习Java的好方法,还可以让我们更好地掌握编程逻辑,培养编程思维。因此,如果你正在学习Java编程,不妨尝试编写一个简单的贪吃蛇游戏吧!

  
  

评论区