Java Swing 实现贪吃蛇小游戏

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

App.java

import javax.swing.*;

/**
 * @author 蚂蚁追风筝
 * @date 2022/11/8
 * @description 贪吃蛇小游戏
 * @version 1.0
 * @since 1.0
 */
public class App {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(
                new Runnable() {
                    @Override
                    public void run() {
                        createGUI();
                    }
                }
        );
    }

    public static void createGUI() {
        JFrame jf = new JFrame("贪吃蛇");
        jf.setIconImage(new ImageIcon(App.class.getResource("/up.png")).getImage());
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jf.setSize(900, 750);
        jf.setResizable(false);
        jf.setLocationRelativeTo(null);
        jf.add(new SnakePanel());
        jf.setVisible(true);
    }
}

SnakePanel.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class SnakePanel extends JPanel implements KeyListener, ActionListener {
    int[] snakeX = new int[500];
    int[] snakeY = new int[500];
    int foodX;
    int foodY;
    String fx;
    int length;
    int score;
    boolean isStart;
    boolean isFail;

    Timer timer = new Timer(100, this);
    Random random = new Random();

    public SnakePanel() {
        init();
        this.setFocusable(true);
        this.addKeyListener(this);
    }

    public void init() {
        length = 3;
        score = 0;
        fx = "r";
        isStart = false;
        isFail = false;
        this.snakeX[0] = 100;
        this.snakeY[0] = 100;
        this.snakeX[1] = 75;
        this.snakeY[1] = 100;
        this.snakeX[2] = 50;
        this.snakeY[2] = 100;
        foodX = 25 + 25 * random.nextInt(33);
        foodY = 100 + 25 * random.nextInt(23);
        timer.start();
    }

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

        new ImageIcon(getClass().getResource("/header.png")).paintIcon(this, g, 17, 20);
        g.fillRect(17, 80, 850, 600);

        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑", Font.BOLD, 14));
        g.drawString("分数:" + score, 750, 45);
        g.drawString("长度:" + length, 750, 60);

        switch (fx) {
            case "r":
                new ImageIcon(getClass().getResource("/right.png")).paintIcon(this, g, snakeX[0], snakeY[0]);
                break;
            case "l":
                new ImageIcon(getClass().getResource("/left.png")).paintIcon(this, g, snakeX[0], snakeY[0]);
                break;
            case "u":
                new ImageIcon(getClass().getResource("/up.png")).paintIcon(this, g, snakeX[0], snakeY[0]);
                break;
            case "d":
                new ImageIcon(getClass().getResource("/down.png")).paintIcon(this, g, snakeX[0], snakeY[0]);
                break;
            default:
                break;
        }

        for (int i = 1; i < length; i++) {
            new ImageIcon(getClass().getResource("/body.png")).paintIcon(this, g, snakeX[i], snakeY[i]);
        }
        if (!isFail) {
            if (!isStart) {
                g.setColor(Color.white);
                g.setFont(new Font("微软雅黑", Font.BOLD, 30));
                g.drawString("按下空格开始游戏", 325, 360);
            }
        }

        if (isFail) {
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑", Font.BOLD, 30));
            g.drawString("游戏失败了!按下空格键重新开始", 250, 360);
        }

        new ImageIcon(getClass().getResource("/food.png")).paintIcon(this, g, foodX, foodY);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_SPACE) {
            if (!isFail) {
                isStart = !isStart;
            } else {
                init();
            }
        }
        if (keyCode == KeyEvent.VK_UP) {//不同按键时的蛇头方向,上下左右
            fx = "u";
        } else if (keyCode == KeyEvent.VK_DOWN) {
            fx = "d";
        } else if (keyCode == KeyEvent.VK_RIGHT) {
            fx = "r";
        } else if (keyCode == KeyEvent.VK_LEFT) {
            fx = "l";
        }
        repaint();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (isStart) {
            if (!isFail) {
                for (int i = length - 1; i > 0; i--) {
                    snakeX[i] = snakeX[i - 1];
                    snakeY[i] = snakeY[i - 1];
                }
                switch (fx) {
                    case "r":
                        snakeX[0] += 25;
                        if (snakeX[0] > 825) {
                            snakeX[0] = 25;
                        }
                        break;
                    case "l":
                        snakeX[0] -= 25;
                        if (snakeX[0] < 25) {
                            snakeX[0] = 825;
                        }
                        break;
                    case "u":
                        snakeY[0] -= 25;
                        if (snakeY[0] < 100) {
                            snakeY[0] = 650;
                        }
                        break;
                    case "d":
                        snakeY[0] += 25;
                        if (snakeY[0] > 650) {
                            snakeY[0] = 100;
                        }
                        break;
                    default:
                        break;
                }
                if (snakeX[0] == foodX && snakeY[0] == foodY) {
                    length++;
                    score++;
                    foodX = 25 + 25 * random.nextInt(33);
                    foodY = 100 + 25 * random.nextInt(23);
                }
                for (int i = 1; i < length; i++) {
                    if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
                        isFail = true;
                    }
                }
            }
            repaint();
        }
        timer.start();
    }
}

素材

header.png
请添加图片描述
food.png
请添加图片描述
body.png
请添加图片描述
down.png
请添加图片描述
left.png
请添加图片描述
right.png
请添加图片描述
up.png
请添加图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值