设计思路

该程序实现了一个“贪吃蛇”游戏,玩家通过控制蛇的移动,使其吃到食物并不断变长,直到蛇撞到墙壁或自身,游戏结束。

系统基本功能描述

主要程序界面截屏如下:

贪吃蛇界面截屏

主要功能:

  1. 开始游戏:点击“开始”按钮开始游戏,蛇开始移动。
  2. 控制蛇的移动:通过上下左右箭头键控制蛇的移动方向。
  3. 吃到食物:蛇头碰到食物后,蛇的长度加一,分数增加。
  4. 撞到墙壁:蛇撞到墙壁后游戏结束。
  5. 撞到自身:蛇撞到自身后游戏结束。
  6. 得分系统:玩家每吃掉一个食物,得分加一。

面向对象类的设计

  1. test类:主要负责程序的界面布局,包括“开始”按钮和D类的实例。
  2. D类:负责实现游戏的核心逻辑,包括蛇的移动、碰撞检测、得分计算等。同时,D类实现了Runnable和KeyListener接口,实现多线程和监听键盘事件的功能。
  3. Point类:表示蛇身体和食物的坐标点,D类中使用了Vector,存储蛇身体的每个点。

核心代码实现

1. D类中的移动和碰撞检测代码

public void run() {
    try {
        while (true) {
            for (int i = 0; i < v.size() - 1; i++) {
                Point p = v.get(i);
                Point p2 = v.get(i + 1);
                p.x = p2.x;
                p.y = p2.y;
            }
            if (direction == 0) {
                Point p = v.get(v.size() - 1);
                p.x = p.x + 10;
                // 撞墙检测以及得分系统
                if (p.x > 580) {
                    JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
                    System.exit(0);
                }
            }
            if (direction == 1) {
                Point p = v.get(v.size() - 1);
                p.x = p.x - 10;
                // 撞墙检测以及得分系统
                if (p.x < 10) {
                    JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
                    System.exit(0);
                }
            }
            if (direction == 2) {
                Point p = v.get(v.size() - 1);
                p.y = p.y - 10;
                // 撞墙检测以及得分系统
                if (p.y < 10) {
                    JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
                    System.exit(0);
                }
            }
            if (direction == 3) {
                Point p = v.get(v.size() - 1);
                p.y = p.y + 10;
                // 撞墙检测以及得分系统
                if (p.y > 370) {
                    JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
                    System.exit(0);
                }
            }

            for (int i = 0; i < v.size() - 1; i++) {
                Point p = v.get(i);
                Point p2 = v.get(v.size() - 1);
                // 撞到身体检测以及得分系统
                if (p.x == p2.x && p.y == p2.y) {
                    JOptionPane.showMessageDialog(null, '你GG了! 最终得分为 ' + (v.size() - 4));
                    System.exit(0);
                }
            }

            for (int i = 0; i < v.size(); i++) {
                Point p = v.get(i);
                if (p.x == food.x && p.y == food.y) {
                    int t = r.nextInt(20);
                    food.x = t * 10;
                    food.y = t * 10;

                    v.add(new Point(p.x, p.y));
                    break;
                }
            }
            repaint();
            Thread.sleep(100);
        }
    } catch (Exception e) {

    }
}

2. D类中的键盘监听代码

public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP && direction != 3) {
        direction = 2;
    }//增加不能掉头
    if (e.getKeyCode() == KeyEvent.VK_DOWN && direction != 2) {
        direction = 3;
    }//增加不能掉头
    if (e.getKeyCode() == KeyEvent.VK_LEFT && direction != 0) {
        direction = 1;
    }//增加不能掉头
    if (e.getKeyCode() == KeyEvent.VK_RIGHT && direction != 1) {
        direction = 0;
    }//增加不能掉头
}

public void keyReleased(KeyEvent e) {

}

public void keyTyped(KeyEvent e) {

}

代码说明:

  1. run() 方法实现了蛇的移动逻辑:
    • 首先,循环遍历蛇身体的每个点,将后一个点的坐标赋给前一个点,实现蛇身移动的效果。
    • 根据当前方向(direction),更新蛇头的坐标。
    • 判断蛇头是否撞到墙壁或自身,如果撞到则结束游戏。
    • 判断蛇头是否吃到食物,如果吃到则增加蛇的长度并生成新的食物。
  2. keyPressed() 方法监听键盘事件,根据按键方向更新蛇的移动方向。

代码结构

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;

public class test extends JFrame implements ActionListener {
    String name;
    JButton jbn = new JButton('开始');
    D jpn = new D();

test() {
        Container cn = getContentPane();
        cn.setLayout(new BorderLayout());
        cn.add(jbn, BorderLayout.NORTH);
        cn.add(jpn, BorderLayout.CENTER);
        jbn.addActionListener(this);
        setSize(600, 400);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        Thread t1 = new Thread(jpn);
        t1.start();
        jpn.requestFocus(true);
    }

    public static void main(String args[]) {
        new test();
    }
}

class D extends JPanel implements Runnable, KeyListener {
    int x = 10;
    int direction = 0;
    Random r = new Random();
    Vector<Point> v = new Vector<Point>();
    Point food = new Point();

    D() {
        v.add(new Point(20, 10));
        v.add(new Point(20, 10));
        v.add(new Point(20, 10));
        v.add(new Point(20, 10));

        int t = r.nextInt(20);
        food.x = t * 10;
        food.y = t * 10;
        addKeyListener(this);
    }


    public void run() {
        // ...  (移动和碰撞检测代码)
    }

    public void paint(Graphics g) {
        super.paint(g);
        for (int i = 0; i < v.size(); i++) {
            Point p = v.get(i);
            int x = p.x;
            int y = p.y;
            if (i == v.size() - 1) {
                g.setColor(Color.blue);
                g.fillOval(x, y, 9, 9);
            } else {
                g.setColor(Color.black);
                g.fillOval(x, y, 9, 9);
            }
        }

        int x = food.x;
        int y = food.y;
        g.setColor(Color.red);
        g.fillRect(x, y, 9, 9);
    }

    public void keyPressed(KeyEvent e) {
        // ...  (键盘监听代码)
    }

    public void keyReleased(KeyEvent e) {

    }

    public void keyTyped(KeyEvent e) {

    }


}

流程图

贪吃蛇游戏流程图

说明:

  • 游戏开始时,初始化蛇身和食物的位置。
  • 游戏循环:
    • 更新蛇身坐标,模拟蛇的移动。
    • 判断蛇头是否撞到墙壁或自身。
    • 判断蛇头是否吃到食物。
    • 重绘游戏界面。
    • 暂停一段时间,控制游戏速度。
  • 如果游戏结束,则显示游戏结束信息。

注意:

  • 以上代码仅供参考,实际实现中可能需要根据具体需求进行调整。
  • 本程序仅实现了基本功能,没有实现游戏音效、界面美化等功能。
  • 您可以根据自己的需求进行扩展和改进。

总结

本程序使用 Java 实现了一个简单的“贪吃蛇”游戏,展示了使用面向对象编程、多线程和键盘监听等技术实现游戏的基本功能。您可以将其作为学习 Java 游戏开发的入门案例。

Java 贪吃蛇游戏:经典游戏,简单实现

原文地址: https://www.cveoy.top/t/topic/oFMr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录