21xrx.com
2025-03-24 14:36:48 Monday
文章检索 我的文章 写文章
Java程序设计——贪吃蛇
2023-06-14 23:46:35 深夜i     13     0
Java 程序设计 贪吃蛇

贪吃蛇是一款经典的游戏,许多程序员使用它作为学习Java游戏开发的起点。本文将向你介绍如何用Java编写一个简单的贪吃蛇游戏。

1. 数据结构设计

在实现贪吃蛇游戏时,需要使用数据结构对蛇的状态进行维护。这里我们可以使用一个ArrayList来保存蛇身的所有坐标,然后不断更新蛇头和蛇身的坐标即可。并且,在每次更新蛇的状态后,还需要判断是否触碰到边界或者撞到了自己的身体,从而来决定游戏是否结束。

2. 用户界面设计

用户界面是游戏的重要组成部分。在本例中,我们使用awt包和swing包的组合来创建用户界面。我们需要创建一个继承自JFrame的窗口,在窗口中加入面板,面板中绘制出整个游戏的界面。

3. 游戏逻辑设计

游戏逻辑主要包括三个部分:用户输入、蛇的移动、食物的产生。用户输入可以通过awt包中的监听器来实现,用户按下对应的方向键,即可改变蛇的朝向。蛇的移动可以通过计算每个时间段的蛇头坐标和蛇身坐标得到。食物可以在合适的时间间隔内随机生成。

下面是一个简单的示例代码:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class SnakeGame extends JFrame implements KeyListener {
  
  private JPanel canvas;
  private ArrayList
  snake;
 
  private Point food;
  private int direction;
 
  public SnakeGame() {
    
    setTitle("Java 贪吃蛇");
    setSize(640, 480);
    
    snake = new ArrayList
  ();
 
    snake.add(new Point(9, 10));
    snake.add(new Point(10, 10));
    snake.add(new Point(11, 10));
    
    food = new Point();
    newFood();
    
    canvas = new JPanel() {
      protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Point p : snake) {
          g.fillRect(p.x * 10, p.y * 10, 10, 10);
        }
        g.fillRect(food.x * 10, food.y * 10, 10, 10);
      }
    };
    setContentPane(canvas);
    addKeyListener(this);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    
    Timer t = new Timer(100, new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        move();
        canvas.repaint();
      }
    });
    t.start();
    
  }
  
  private void move() {
    Point head = snake.get(0);
    int x = head.x;
    int y = head.y;
    switch (direction) {
      case KeyEvent.VK_LEFT:
        x -= 1;
        break;
      case KeyEvent.VK_RIGHT:
        x += 1;
        break;
      case KeyEvent.VK_UP:
        y -= 1;
        break;
      case KeyEvent.VK_DOWN:
        y += 1;
        break;
    }
    head = new Point(x, y);
    if (head.equals(food)) {
      snake.add(0, head);
      newFood();
    } else {
      snake.remove(snake.size() - 1);
      if (snake.contains(head)) {
        JOptionPane.showMessageDialog(this, "游戏结束");
        System.exit(0);
      }
      snake.add(0, head);
    }
    if (head.x < 0 || head.x > 63 || head.y < 0 || head.y > 47) {
      JOptionPane.showMessageDialog(this, "游戏结束");
      System.exit(0);
    }
  }
  
  private void newFood() {
    while (true) {
      int x = (int) (Math.random() * 64);
      int y = (int) (Math.random() * 48);
      food.setLocation(x, y);
      for (Point p : snake) {
        if (p.equals(food))
          continue;
        
      }
      break;
    }
  }
  
  public void keyPressed(KeyEvent e) {
    direction = e.getKeyCode();
  }
  
  public void keyReleased(KeyEvent e)
  
  
  public void keyTyped(KeyEvent e)
  
  
  public static void main(String[] args) {
    new SnakeGame();
  }
  
}

  
  

评论区