用java写一个带图形界面的贪吃蛇游戏
创始人
2024-12-29 08:11:13
0

下面是一个使用Java编写的带图形界面的贪吃蛇游戏。这个游戏使用了Java的Swing库来创建图形界面,并实现了基本的游戏逻辑,包括蛇的移动、食物生成和碰撞检测。

  1. 创建主类 SnakeGame
    首先,我们创建一个主类 SnakeGame 来启动游戏。
import javax.swing.JFrame;  public class SnakeGame extends JFrame {      public SnakeGame() {         add(new GamePanel());         setResizable(false);         pack();                  setTitle("Snake Game");         setLocationRelativeTo(null);         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     }      public static void main(String[] args) {         JFrame frame = new SnakeGame();         frame.setVisible(true);     } } 
  1. 创建游戏面板 GamePanel
    接下来,我们创建一个继承 JPanel 的 GamePanel 类,包含游戏的主要逻辑和绘图。
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 GamePanel 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 GamePanel() {                  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();         }     }      private void locateApple() {          int r = (int) (Math.random() * RAND_POS);         apple_x = ((r * DOT_SIZE));          r = (int) (Math.random() * RAND_POS);         apple_y = ((r * DOT_SIZE));     }      @Override     public void actionPerformed(ActionEvent e) {          if (inGame) {              checkApple();             checkCollision();             move();         }          repaint();     }      private class TAdapter extends KeyAdapter {          @Override         public void keyPressed(KeyEvent e) {              int key = e.getKeyCode();              if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) {                 leftDirection = true;                 upDirection = false;                 downDirection = false;             }              if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) {                 rightDirection = true;                 upDirection = false;                 downDirection = false;             }              if ((key == KeyEvent.VK_UP) && (!downDirection)) {                 upDirection = true;                 rightDirection = false;                 leftDirection = false;             }              if ((key == KeyEvent.VK_DOWN) && (!upDirection)) {                 downDirection = true;                 rightDirection = false;                 leftDirection = false;             }         }     } } 
  1. 资源文件
    为了使这个代码正常运行,你需要准备三个图片文件:

dot.png:表示蛇的身体部分。
apple.png:表示食物。
head.png:表示蛇的头部。
将这些图片文件放在 src/resources/ 目录下。

运行说明
创建一个新的Java项目。
将上面的代码分别放在 SnakeGame.java 和 GamePanel.java 文件中。
创建 src/resources/ 目录,并将 dot.png、apple.png 和 head.png 放入该目录。
运行 SnakeGame 类的 main 方法启动游戏。
这个示例提供了一个基本的贪吃蛇游戏框架,包括蛇的移动、食物生成和简单的碰撞检测。可以在此基础上添加更多功能,例如增加得分显示、添加更多的游戏逻辑和动画效果。

相关内容

热门资讯

总算了解!广西老友有破解吗,开... 总算了解!广西老友有破解吗,开心泉州免费辅助器,攻略教程(有挂分享)1、开心泉州免费辅助器有没有辅助...
无独有偶!微信小程序免费黑科技... 无独有偶!微信小程序免费黑科技透视,微乐小程序多功能修改器法子教程(有挂分享)1、这是跨平台的微乐小...
避坑细节!宝宝游戏辅助,决战卡... 避坑细节!宝宝游戏辅助,决战卡五星游戏辅助器,积累教程(有挂规律)亲,关键说明,决战卡五星游戏辅助器...
据权威媒体报道!微信小程序免费... 据权威媒体报道!微信小程序免费黑科技透视,钱塘十三水其实真的有挂手段教程(有挂详细)1、钱塘十三水其...
实测揭晓!同乡游辅助工具制作,... 实测揭晓!同乡游辅助工具制作,永胜联盟会封号吗,模块教程(有挂教学)1、同乡游辅助工具制作模拟器是什...
实测必看!微信小程序免费黑科技... 实测必看!微信小程序免费黑科技开挂,皮皮胡子辅助举措教程(有挂详细)1、起透看视 微信小程序免费黑科...
一分钟揭秘!微乐小程序免费黑科... 一分钟揭秘!微乐小程序免费黑科技安卓,新超凡软件辅助练习教程(有挂存在)1、微乐小程序免费黑科技脚本...
必备辅助推荐!蜜瓜大厅可以装挂... 必备辅助推荐!蜜瓜大厅可以装挂吗,友友联盟辅助脚本,指南书教程(有挂技术)1、进入游戏-大厅左侧-新...
今日焦点!微信小程序免费黑科技... 今日焦点!微信小程序免费黑科技透视,川南久久辅助模块教程(存在有挂)运微信小程序免费黑科技辅助工具,...
技术分享!山西扣点点辅助工具,... 技术分享!山西扣点点辅助工具,福州十八扑外卦视频,诀窍教程(有挂方法)1、山西扣点点辅助工具公共底牌...