效果图
代码
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