Java 贪吃蛇游戏代码示例:带中文注释
{"title":"Java 贪吃蛇游戏代码示例:带中文注释", "description":"这是一个用 Java 编写的贪吃蛇游戏示例代码,附带详细的中文注释,帮助您理解游戏逻辑和实现细节。", "keywords":"Java, 贪吃蛇, 游戏, 代码示例, 中文注释", "content":"\u003ccode\u003eimport java.awt.Color;\nimport java.awt.Dimension;\nimport java.awt.Font;\nimport java.awt.FontMetrics;\nimport java.awt.Graphics;\nimport java.awt.Image;\nimport java.awt.Toolkit;\nimport java.awt.event.ActionEvent;\nimport java.awt.event.ActionListener;\nimport java.awt.event.KeyAdapter;\nimport java.awt.event.KeyEvent;\nimport javax.swing.ImageIcon;\nimport javax.swing.JPanel;\nimport javax.swing.Timer;\n\npublic class SnakeGame extends JPanel implements ActionListener {\n\n private final int B_WIDTH = 300; // 游戏面板的宽度\n private final int B_HEIGHT = 300; // 游戏面板的高度\n private final int DOT_SIZE = 10; // 蛇身和食物的大小\n private final int ALL_DOTS = 900; // 游戏面板上能容纳的最大蛇身数量\n private final int RAND_POS = 29; // 食物的随机位置范围\n private final int DELAY = 140; // 游戏的速度\n\n private final int x[] = new int[ALL_DOTS]; // 蛇身的x坐标\n private final int y[] = new int[ALL_DOTS]; // 蛇身的y坐标\n\n private int dots; // 蛇身的长度\n private int apple_x; // 食物的x坐标\n private int apple_y; // 食物的y坐标\n\n private boolean leftDirection = false; // 是否向左移动\n private boolean rightDirection = true; // 是否向右移动\n private boolean upDirection = false; // 是否向上移动\n private boolean downDirection = false; // 是否向下移动\n private boolean inGame = true; // 是否游戏中\n\n private Timer timer; // 游戏的计时器\n private Image ball; // 蛇身的图像\n private Image apple; // 食物的图像\n private Image head; // 蛇头的图像\n\n public SnakeGame() {\n initBoard();\n }\n\n private void initBoard() {\n\n addKeyListener(new TAdapter());\n setBackground(Color.black);\n setFocusable(true);\n\n setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));\n loadImages();\n initGame();\n }\n\n private void loadImages() {\n\n ImageIcon iid = new ImageIcon("src/resources/dot.png");\n ball = iid.getImage();\n\n ImageIcon iia = new ImageIcon("src/resources/apple.png");\n apple = iia.getImage();\n\n ImageIcon iih = new ImageIcon("src/resources/head.png");\n head = iih.getImage();\n }\n\n private void initGame() {\n\n dots = 3; // 初始化蛇身长度\n for (int z = 0; z \u003c dots; z++) {\n x[z] = 50 - z * 10; // 初始化蛇身的x坐标\n y[z] = 50; // 初始化蛇身的y坐标\n }\n\n locateApple(); // 初始化食物的位置\n\n timer = new Timer(DELAY, this);\n timer.start();\n }\n\n @Override\n public void paintComponent(Graphics g) {\n super.paintComponent(g);\n\n doDrawing(g);\n }\n\n private void doDrawing(Graphics g) {\n\n if (inGame) {\n\n g.drawImage(apple, apple_x, apple_y, this);\n\n for (int z = 0; z \u003c dots; z++) {\n if (z == 0) {\n g.drawImage(head, x[z], y[z], this);\n } else {\n g.drawImage(ball, x[z], y[z], this);\n }\n }\n\n Toolkit.getDefaultToolkit().sync();\n\n } else {\n gameOver(g);\n }\n }\n\n private void gameOver(Graphics g) {\n\n String msg = "Game Over";\n Font small = new Font("Helvetica", Font.BOLD, 14);\n FontMetrics metr = getFontMetrics(small);\n\n g.setColor(Color.white);\n g.setFont(small);\n g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2, B_HEIGHT / 2);\n }\n\n private void checkApple() {\n\n if ((x[0] == apple_x) && (y[0] == apple_y)) {\n dots++; // 蛇身长度增加\n locateApple(); // 重新定位食物\n }\n }\n\n private void move() {\n\n for (int z = dots; z \u003e 0; z--) {\n x[z] = x[(z - 1)];\n y[z] = y[(z - 1)];\n }\n\n if (leftDirection) {\n x[0] -= DOT_SIZE; // 向左移动\n }\n\n if (rightDirection) {\n x[0] += DOT_SIZE; // 向右移动\n }\n\n if (upDirection) {\n y[0] -= DOT_SIZE; // 向上移动\n }\n\n if (downDirection) {\n y[0] += DOT_SIZE; // 向下移动\n }\n }\n\n private void checkCollision() {\n\n for (int z = dots; z \u003e 0; z--) {\n\n if ((z \u003e 4) && (x[0] == x[z]) && (y[0] == y[z])) {\n inGame = false; // 发生碰撞,游戏结束\n }\n }\n\n if (y[0] \u003e= B_HEIGHT) {\n inGame = false; // 碰到游戏面板底部,游戏结束\n }\n\n if (y[0] \u003c 0) {\n inGame = false; // 碰到游戏面板顶部,游戏结束\n }\n\n if (x[0] \u003e= B_WIDTH) {\n inGame = false; // 碰到游戏面板右侧,游戏结束\n }\n\n if (x[0] \u003c 0) {\n inGame = false; // 碰到游戏面板左侧,游戏结束\n }\n\n if (!inGame) {\n timer.stop(); // 停止游戏计时器\n }\n }\n\n private void locateApple() {\n\n int r = (int) (Math.random() * RAND_POS);\n apple_x = ((r * DOT_SIZE));\n\n r = (int) (Math.random() * RAND_POS);\n apple_y = ((r * DOT_SIZE));\n }\n\n @Override\n public void actionPerformed(ActionEvent e) {\n\n if (inGame) {\n checkApple();\n checkCollision();\n move();\n }\n\n repaint();\n }\n\n private class TAdapter extends KeyAdapter {\n\n @Override\n public void keyPressed(KeyEvent e) {\n\n int key = e.getKeyCode();\n\n if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) {\n leftDirection = true;\n upDirection = false;\n downDirection = false;\n }\n\n if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) {\n rightDirection = true;\n upDirection = false;\n downDirection = false;\n }\n\n if ((key == KeyEvent.VK_UP) && (!downDirection)) {\n upDirection = true;\n rightDirection = false;\n leftDirection = false;\n }\n\n if ((key == KeyEvent.VK_DOWN) && (!upDirection)) {\n downDirection = true;\n rightDirection = false;\n leftDirection = false;\n }\n }\n }\n}\n\u003c/code\u003e\n\n这个示例代码实现了一个简单的贪吃蛇游戏。你可以使用Java Swing库来创建一个窗口并在其中显示游戏界面。游戏界面由一个面板(JPanel)组成,用于绘制游戏的图形。\n\n在initBoard方法中,我们设置了面板的背景颜色、大小,加载了蛇身、食物和蛇头的图像,然后初始化游戏。\n\ndoDrawing方法用于绘制游戏界面。如果游戏正在进行中,它会绘制蛇身、食物和蛇头的图像。否则,它会显示游戏结束的消息。\n\ncheckApple方法用于检查蛇头是否与食物相撞,如果相撞,则增加蛇身的长度并重新定位食物。\n\nmove方法用于根据蛇的当前方向移动蛇身的位置。\n\ncheckCollision方法用于检查蛇头是否与蛇身或游戏面板的边界相撞,如果相撞,则游戏结束。\n\nlocateApple方法用于随机定位食物的位置。\n\nactionPerformed方法是计时器的回调方法,它在每个时间间隔内更新游戏的状态。\n\nTAdapter类是一个键盘适配器,它监听用户的键盘输入并根据输入改变蛇的移动方向。\n\n你可以在main方法中创建一个新的SnakeGame对象,并将其添加到窗口中以显示游戏界面。
原文地址: https://www.cveoy.top/t/topic/p4PW 著作权归作者所有。请勿转载和采集!