貪吃蛇完整代碼)
我將為您提供一個完整的 Java 貪吃蛇游戲?qū)崿F(xiàn)代碼基于 Swing 圖形界面庫開發(fā)。這個實現(xiàn)包含了游戲的所有核心功能包括蛇的移動、食物生成、碰撞檢測和分?jǐn)?shù)計算等。完整貪吃蛇游戲代碼實現(xiàn)1. 主程序入口類 (SnakeGame.java)import javax.swing.*; /** * 貪吃蛇游戲主類 * 負(fù)責(zé)創(chuàng)建游戲窗口和啟動游戲 */ public class SnakeGame { public static void main(String[] args) { // 創(chuàng)建游戲窗口 JFrame frame new JFrame(貪吃蛇游戲); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); // 創(chuàng)建游戲面板 GamePanel gamePanel new GamePanel(); frame.add(gamePanel); // 自動調(diào)整窗口大小 frame.pack(); frame.setLocationRelativeTo(null); // 窗口居中顯示 frame.setVisible(true); // 啟動游戲 gamePanel.startGame(); } }2. 游戲面板類 (GamePanel.java)import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.LinkedList; import java.util.Random; /** * 游戲主面板類 * 處理游戲邏輯和圖形繪制 */ public class GamePanel extends JPanel implements ActionListener, KeyListener { // 游戲常量 private static final int WIDTH 600; private static final int HEIGHT 600; private static final int UNIT_SIZE 25; private static final int GAME_UNITS (WIDTH * HEIGHT) / (UNIT_SIZE * UNIT_SIZE); private static final int DELAY 75; // 蛇的身體坐標(biāo) private final LinkedListPoint snakeBody new LinkedList(); private int snakeLength 3; // 食物坐標(biāo) private Point food; // 移動方向 private char direction R; // R:右, L:左, U:上, D:下 private char lastDirection R; // 游戲狀態(tài) private boolean running false; private boolean paused false; private int score 0; // 定時器 private Timer timer; private Random random; public GamePanel() { random new Random(); this.setPreferredSize(new Dimension(WIDTH, HEIGHT)); this.setBackground(Color.BLACK); this.setFocusable(true); this.addKeyListener(this); initGame(); } /** * 初始化游戲 */ public void initGame() { // 清空蛇身 snakeBody.clear(); // 初始化蛇的位置在屏幕中央 int startX WIDTH / 2 / UNIT_SIZE * UNIT_SIZE; int startY HEIGHT / 2 / UNIT_SIZE * UNIT_SIZE; // 創(chuàng)建初始蛇身3個單位長度 for (int i 0; i snakeLength; i) { snakeBody.add(new Point(startX - i * UNIT_SIZE, startY)); } // 生成第一個食物 generateFood(); // 重置游戲狀態(tài) direction R; lastDirection R; score 0; running true; paused false; } /** * 開始游戲 */ public void startGame() { if (timer null) { timer new Timer(DELAY, this); } timer.start(); } /** * 生成食物 */ private void generateFood() { int x random.nextInt(WIDTH / UNIT_SIZE) * UNIT_SIZE; int y random.nextInt(HEIGHT / UNIT_SIZE) * UNIT_SIZE; food new Point(x, y); // 確保食物不會生成在蛇身上 while (snakeBody.contains(food)) { x random.nextInt(WIDTH / UNIT_SIZE) * UNIT_SIZE; y random.nextInt(HEIGHT / UNIT_SIZE) * UNIT_SIZE; food new Point(x, y); } } /** * 移動蛇 */ private void move() { if (!running || paused) return; // 獲取蛇頭位置 Point head snakeBody.getFirst(); Point newHead new Point(head); // 根據(jù)方向移動蛇頭 switch (direction) { case U: // 上 newHead.y - UNIT_SIZE; break; case D: // 下 newHead.y UNIT_SIZE; break; case L: // 左 newHead.x - UNIT_SIZE; break; case R: // 右 newHead.x UNIT_SIZE; break; } // 檢查碰撞 if (checkCollision(newHead)) { running false; timer.stop(); return; } // 添加新的蛇頭 snakeBody.addFirst(newHead); // 檢查是否吃到食物 if (newHead.equals(food)) { score 10; generateFood(); } else { // 如果沒有吃到食物移除蛇尾 snakeBody.removeLast(); } lastDirection direction; } /** * 檢查碰撞 */ private boolean checkCollision(Point head) { // 檢查墻壁碰撞 if (head.x 0 || head.x WIDTH || head.y 0 || head.y HEIGHT) { return true; } // 檢查自身碰撞從第二個節(jié)點開始檢查避免與頭部比較 for (int i 1; i snakeBody.size(); i) { if (head.equals(snakeBody.get(i))) { return true; } } return false; } /** * 繪制游戲界面 */ Override protected void paintComponent(Graphics g) { super.paintComponent(g); draw(g); } /** * 繪制游戲元素 */ private void draw(Graphics g) { if (running) { // 繪制網(wǎng)格可選 drawGrid(g); // 繪制食物 g.setColor(Color.RED); g.fillOval(food.x, food.y, UNIT_SIZE, UNIT_SIZE); // 繪制蛇 for (int i 0; i snakeBody.size(); i) { Point point snakeBody.get(i); if (i 0) { // 蛇頭 g.setColor(Color.GREEN); } else { // 蛇身 g.setColor(new Color(45, 180, 0)); } g.fillRect(point.x, point.y, UNIT_SIZE, UNIT_SIZE); // 蛇身邊框 g.setColor(Color.BLACK); g.drawRect(point.x, point.y, UNIT_SIZE, UNIT_SIZE); } // 繪制分?jǐn)?shù) drawScore(g); // 如果游戲暫停顯示暫停信息 if (paused) { drawPauseMessage(g); } } else { // 游戲結(jié)束畫面 gameOver(g); } } /** * 繪制網(wǎng)格 */ private void drawGrid(Graphics g) { g.setColor(Color.DARK_GRAY); for (int i 0; i WIDTH / UNIT_SIZE; i) { g.drawLine(i * UNIT_SIZE, 0, i * UNIT_SIZE, HEIGHT); g.drawLine(0, i * UNIT_SIZE, WIDTH, i * UNIT_SIZE); } } /** * 繪制分?jǐn)?shù) */ private void drawScore(Graphics g) { g.setColor(Color.WHITE); g.setFont(new Font(Arial, Font.BOLD, 20)); g.drawString(得分: score, 10, 25); } /** * 繪制暫停信息 */ private void drawPauseMessage(Graphics g) { g.setColor(Color.YELLOW); g.setFont(new Font(Arial, Font.BOLD, 40)); String message 游戲暫停; FontMetrics metrics getFontMetrics(g.getFont()); g.drawString(message, (WIDTH - metrics.stringWidth(message)) / 2, HEIGHT / 2); g.setFont(new Font(Arial, Font.PLAIN, 20)); String subMessage 按空格鍵繼續(xù); metrics getFontMetrics(g.getFont()); g.drawString(subMessage, (WIDTH - metrics.stringWidth(subMessage)) / 2, HEIGHT / 2 40); } /** * 游戲結(jié)束畫面 */ private void gameOver(Graphics g) { // 游戲結(jié)束文字 g.setColor(Color.RED); g.setFont(new Font(Arial, Font.BOLD, 50)); String message 游戲結(jié)束; FontMetrics metrics getFontMetrics(g.getFont()); g.drawString(message, (WIDTH - metrics.stringWidth(message)) / 2, HEIGHT / 2 - 50); // 顯示最終分?jǐn)?shù) g.setColor(Color.WHITE); g.setFont(new Font(Arial, Font.BOLD, 30)); String scoreMessage 最終得分: score; metrics getFontMetrics(g.getFont()); g.drawString(scoreMessage, (WIDTH - metrics.stringWidth(scoreMessage)) / 2, HEIGHT / 2); // 重新開始提示 g.setFont(new Font(Arial, Font.PLAIN, 20)); String restartMessage 按 R 鍵重新開始游戲; metrics getFontMetrics(g.getFont()); g.drawString(restartMessage, (WIDTH - metrics.stringWidth(restartMessage)) / 2, HEIGHT / 2 50); } /** * 定時器事件處理 */ Override public void actionPerformed(ActionEvent e) { if (running) { move(); repaint(); } } /** * 鍵盤按下事件處理 */ Override public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: if (lastDirection ! R) direction L; break; case KeyEvent.VK_RIGHT: if (lastDirection ! L) direction R; break; case KeyEvent.VK_UP: if (lastDirection ! D) direction U; break; case KeyEvent.VK_DOWN: if (lastDirection ! U) direction D; break; case KeyEvent.VK_SPACE: // 空格鍵暫停/繼續(xù)游戲 if (running) { paused !paused; repaint(); } break; case KeyEvent.VK_R: // R鍵重新開始游戲 if (!running) { initGame(); startGame(); } break; } } // 其他鍵盤事件方法必須實現(xiàn) Override public void keyTyped(KeyEvent e) {} Override public void keyReleased(KeyEvent e) {} }游戲功能特性說明核心游戲機制功能模塊實現(xiàn)方式技術(shù)要點蛇移動使用 LinkedList 存儲坐標(biāo)定時更新方向控制、防反向移動食物生成隨機坐標(biāo)生成避免與蛇身重疊Random 類使用、碰撞檢測碰撞檢測邊界檢測 自身碰撞檢測坐標(biāo)比較算法分?jǐn)?shù)系統(tǒng)吃到食物加分簡單的累加計分游戲狀態(tài)運行/暫停/結(jié)束狀態(tài)管理布爾標(biāo)志位控制游戲操作說明// 鍵盤控制映射表 方向鍵控制↑↓←→ 控制蛇的移動方向 空格鍵暫停/繼續(xù)游戲 R 鍵游戲結(jié)束后重新開始技術(shù)實現(xiàn)亮點圖形界面使用 Swing 的 JPanel 和 Graphics 進(jìn)行圖形繪制事件處理通過 KeyListener 實現(xiàn)鍵盤控制定時更新使用 Timer 實現(xiàn)游戲循環(huán)數(shù)據(jù)結(jié)構(gòu)LinkedList 高效管理蛇身坐標(biāo)碰撞檢測精確的邊界和自身碰撞判斷運行說明要運行這個貪吃蛇游戲您需要將上述兩個類文件保存為SnakeGame.java和GamePanel.java使用 Java 編譯器編譯javac *.java運行主程序java SnakeGame這個實現(xiàn)包含了貪吃蛇游戲的所有核心功能代碼結(jié)構(gòu)清晰注釋詳細(xì)適合學(xué)習(xí)和進(jìn)一步擴(kuò)展 。您可以根據(jù)需要調(diào)整游戲速度、界面大小或添加更多功能如關(guān)卡系統(tǒng)、特殊食物等。參考來源Java實現(xiàn)貪吃蛇大作戰(zhàn)小游戲完整版Java實現(xiàn)貪吃蛇小游戲JavaSE項目 | 純Java實現(xiàn)貪吃蛇小游戲Java實現(xiàn)貪吃蛇游戲Java貪吃蛇全代碼