21xrx.com
2024-12-22 19:01:50 Sunday
登录
文章检索 我的文章 写文章
Java程序设计——贪吃蛇
2023-06-14 23:46:35 深夜i     --     --
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();

  }

  

}

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复