117.info
人生若只如初见

Java怎么实现贪吃蛇游戏

要实现贪吃蛇游戏,可以使用Java语言编写。下面是一个简单的示例代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GameBoard extends JPanel implements ActionListener {

    private final int B_WIDTH = 300;
    private final int B_HEIGHT = 300;
    private final int DOT_SIZE = 10;
    private final int ALL_DOTS = 900;
    private final int RAND_POS = 29;
    private final int DELAY = 140;

    private final int x[] = new int[ALL_DOTS];
    private final int y[] = new int[ALL_DOTS];

    private int dots;
    private int apple_x;
    private int apple_y;

    private boolean leftDirection = false;
    private boolean rightDirection = true;
    private boolean upDirection = false;
    private boolean downDirection = false;
    private boolean inGame = true;

    private Timer timer;
    private Image ball;
    private Image apple;
    private Image head;

    public GameBoard() {

        initBoard();
    }
    
    private void initBoard() {

        addKeyListener(new TAdapter());
        setBackground(Color.black);
        setFocusable(true);

        setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
        loadImages();
        initGame();
    }

    private void loadImages() {

        ImageIcon iid = new ImageIcon("src/resources/dot.png");
        ball = iid.getImage();

        ImageIcon iia = new ImageIcon("src/resources/apple.png");
        apple = iia.getImage();

        ImageIcon iih = new ImageIcon("src/resources/head.png");
        head = iih.getImage();
    }

    private void initGame() {

        dots = 3;

        for (int z = 0; z < dots; z++) {
            x[z] = 50 - z * 10;
            y[z] = 50;
        }

        locateApple();

        timer = new Timer(DELAY, this);
        timer.start();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        doDrawing(g);
    }
    
    private void doDrawing(Graphics g) {

        if (inGame) {

            g.drawImage(apple, apple_x, apple_y, this);

            for (int z = 0; z < dots; z++) {
                if (z == 0) {
                    g.drawImage(head, x[z], y[z], this);
                } else {
                    g.drawImage(ball, x[z], y[z], this);
                }
            }

            Toolkit.getDefaultToolkit().sync();

        } else {

            gameOver(g);
        }        
    }

    private void gameOver(Graphics g) {

        String msg = "Game Over";
        Font small = new Font("Helvetica", Font.BOLD, 14);
        FontMetrics metr = getFontMetrics(small);

        g.setColor(Color.white);
        g.setFont(small);
        g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2, B_HEIGHT / 2);
    }

    private void checkApple() {

        if ((x[0] == apple_x) && (y[0] == apple_y)) {

            dots++;
            locateApple();
        }
    }

    private void move() {

        for (int z = dots; z > 0; z--) {
            x[z] = x[(z - 1)];
            y[z] = y[(z - 1)];
        }

        if (leftDirection) {
            x[0] -= DOT_SIZE;
        }

        if (rightDirection) {
            x[0] += DOT_SIZE;
        }

        if (upDirection) {
            y[0] -= DOT_SIZE;
        }

        if (downDirection) {
            y[0] += DOT_SIZE;
        }
    }

    private void checkCollision() {

        for (int z = dots; z > 0; z--) {

            if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) {
                inGame = false;
            }
        }

        if (y[0] >= B_HEIGHT) {
            inGame = false;
        }

        if (y[0] < 0) {
            inGame = false;
        }

        if (x[0] >= B_WIDTH) {
            inGame = false;
        }

        if (x[0] < 0) {
            inGame = false;
        }
        
        if (!inGame) {
            timer.stop();
        }
    }

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe3cbAzsICAZVA1U.html

推荐文章

  • java中的标识符命名规则是什么

    在Java中,标识符是用来命名变量、方法、类等的名称。标识符的命名规则如下: 标识符只能由字母、数字、下划线和美元符号组成。
    标识符的第一个字符必须是字...

  • java中get方法的作用是什么

    在Java中,get方法通常用于获取对象的某个属性的值。通过get方法,可以访问对象的私有属性,并返回属性的值。通常情况下,属性被定义为私有(private),这样就无法...

  • 怎么使用java二分法查找数组元素

    要使用Java中的二分法查找数组元素,首先需要确保数组是有序的(通常是升序排列)。然后可以使用以下步骤来实现二分法查找: 定义一个方法来执行二分法查找,该方...

  • java中autowired的作用是什么

    在Java中,@Autowired注解用于自动装配依赖项。它可以自动连接Spring容器中的bean,并将其注入到需要的对象中,省去了手动创建bean并设置依赖项的繁琐步骤。@Aut...

  • 导致adb无法启动的情况有哪些

    ADB驱动未正确安装或损坏:如果ADB驱动未正确安装或驱动文件损坏,可能会导致ADB无法启动。 ADB路径未正确配置:如果ADB的路径未正确配置在系统环境变量中,可能...

  • js前端怎么实现图片懒加载

    可以通过以下几种方法实现图片懒加载: 使用Intersection Observer API:Intersection Observer API是一种现代浏览器提供的API,它可以监测指定元素与视口之间的...

  • c++怎么定义全局变量

    在C++中,可以通过在程序的任何地方定义变量来创建全局变量。全局变量是在程序的所有函数之外定义的变量,可以被程序中的任何函数访问和修改。
    要定义全局变...

  • WPF怎么使用WrapPanel实现虚拟化效果

    在WPF中,WrapPanel并不支持虚拟化(UI虚拟化)效果,所以无法直接使用WrapPanel来实现虚拟化效果。UI虚拟化是一种优化技术,用于处理大量数据时只加载可见部分数...