`

完整的贪吃蛇(蛇吃蛋)Java源代码

阅读更多

代码:

 

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class SnakeGame {
        public static void main(String[] args) {
                SnakeFrame frame = new SnakeFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
        }
}

// ----------记录状态的线程
class StatusRunnable implements Runnable {
        public StatusRunnable(Snake snake, JLabel statusLabel, JLabel scoreLabel) {
                this.statusLabel = statusLabel;
                this.scoreLabel = scoreLabel;
                this.snake = snake;
        }

        public void run() {
                String sta = "";
                String spe = "";
                while (true) {

                        switch (snake.status) {
                        case Snake.RUNNING:
                                sta = "Running";
                                break;
                        case Snake.PAUSED:
                                sta = "Paused";
                                break;
                        case Snake.GAMEOVER:
                                sta = "GameOver";
                                break;
                        }
                        statusLabel.setText(sta);
                        scoreLabel.setText("" + snake.score);
                        try {
                                Thread.sleep(100);
                        } catch (Exception e) {
                        }
                }
        }

        private JLabel scoreLabel;
        private JLabel statusLabel;
        private Snake snake;
}

// ----------蛇运动以及记录分数的线程
class SnakeRunnable implements Runnable {
        public SnakeRunnable(Snake snake, Component component) {
                this.snake = snake;
                this.component = component;
        }

        public void run() {
                while (true) {
                        try {
                                snake.move();
                                component.repaint();
                                Thread.sleep(snake.speed);
                        } catch (Exception e) {
                        }
                }
        }

        private Snake snake;
        private Component component;
}

class Snake {
        boolean isRun;// ---------是否运动中
        ArrayList<Node> body;// -----蛇体
        Node food;// --------食物
        int derection;// --------方向
        int score;
        int status;
        int speed;
        public static final int SLOW = 500;
        public static final int MID = 300;
        public static final int FAST = 100;
        public static final int RUNNING = 1;
        public static final int PAUSED = 2;
        public static final int GAMEOVER = 3;
        public static final int LEFT = 1;
        public static final int UP = 2;
        public static final int RIGHT = 3;
        public static final int DOWN = 4;

        public Snake() {
                speed = Snake.SLOW;
                score = 0;
                isRun = false;
                status = Snake.PAUSED;
                derection = Snake.RIGHT;
                body = new ArrayList<Node>();
                body.add(new Node(60, 20));
                body.add(new Node(40, 20));
                body.add(new Node(20, 20));
                makeFood();
        }

        // ------------判断食物是否被蛇吃掉
        // -------如果食物在蛇运行方向的正前方,并且与蛇头接触,则被吃掉
        private boolean isEaten() {
                Node head = body.get(0);
                if (derection == Snake.RIGHT && (head.x + Node.W) == food.x
                                && head.y == food.y)
                        return true;
                if (derection == Snake.LEFT && (head.x - Node.W) == food.x
                                && head.y == food.y)
                        return true;
                if (derection == Snake.UP && head.x == food.x
                                && (head.y - Node.H) == food.y)
                        return true;
                if (derection == Snake.DOWN && head.x == food.x
                                && (head.y + Node.H) == food.y)
                        return true;
                else
                        return false;
        }

        // ----------是否碰撞
        private boolean isCollsion() {
                Node node = body.get(0);
                // ------------碰壁
                if (derection == Snake.RIGHT && node.x == 280)
                        return true;
                if (derection == Snake.UP && node.y == 0)
                        return true;
                if (derection == Snake.LEFT && node.x == 0)
                        return true;
                if (derection == Snake.DOWN && node.y == 380)
                        return true;
                // --------------蛇头碰到蛇身
                Node temp = null;
                int i = 0;
                for (i = 3; i < body.size(); i++) {
                        temp = body.get(i);
                        if (temp.x == node.x && temp.y == node.y)
                                break;
                }
                if (i < body.size())
                        return true;
                else
                        return false;
        }

        // -------在随机的地方产生食物
        public void makeFood() {
                Node node = new Node(0, 0);
                boolean isInBody = true;
                int x = 0, y = 0;
                int X = 0, Y = 0;
                int i = 0;
                while (isInBody) {
                        x = (int) (Math.random() * 15);
                        y = (int) (Math.random() * 20);
                        X = x * Node.W;
                        Y = y * Node.H;
                        for (i = 0; i < body.size(); i++) {
                                if (X == body.get(i).x && Y == body.get(i).y)
                                        break;
                        }
                        if (i < body.size())
                                isInBody = true;
                        else
                                isInBody = false;
                }
                food = new Node(X, Y);
        }

        // ---------改变运行方向
        public void changeDerection(int newDer) {
                if (derection % 2 != newDer % 2)// -------如果与原来方向相同或相反,则无法改变
                        derection = newDer;
        }

        public void move() {
                if (isEaten()) {// -----如果食物被吃掉
                        body.add(0, food);// --------把食物当成蛇头成为新的蛇体
                        score += 10;
                        makeFood();// --------产生食物
                } else if (isCollsion())// ---------如果碰壁或自身
                {
                        isRun = false;
                        status = Snake.GAMEOVER;// -----结束
                } else if (isRun) {// ----正常运行(不吃食物,不碰壁,不碰自身)
                        Node node = body.get(0);
                        int X = node.x;
                        int Y = node.y;
                        // ------------蛇头按运行方向前进一个单位
                        switch (derection) {
                        case 1:
                                X -= Node.W;
                                break;
                        case 2:
                                Y -= Node.H;
                                break;
                        case 3:
                                X += Node.W;
                                break;
                        case 4:
                                Y += Node.H;
                                break;
                        }
                        body.add(0, new Node(X, Y));
                        // ---------------去掉蛇尾
                        body.remove(body.size() - 1);
                }
        }
}

// ---------组成蛇身的单位,食物
class Node {
        public static final int W = 20;
        public static final int H = 20;
        int x;
        int y;

        public Node(int x, int y) {
                this.x = x;
                this.y = y;
        }
}

// ------画板
class SnakePanel extends JPanel {
        Snake snake;

        public SnakePanel(Snake snake) {
                this.snake = snake;
        }

        public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Node node = null;
                for (int i = 0; i < snake.body.size(); i++) {// ---红蓝间隔画蛇身
                        if (i % 2 == 0)
                                g.setColor(Color.blue);
                        else
                                g.setColor(Color.yellow);
                        node = snake.body.get(i);
                        g.fillRect(node.x, node.y, node.H, node.W);// *******************试用*********************
                }
                node = snake.food;
                g.setColor(Color.red);
                g.fillRect(node.x, node.y, node.H, node.W);
        }
}

class SnakeFrame extends JFrame {
        private JLabel statusLabel;
        private JLabel speedLabel;
        private JLabel scoreLabel;
        private JPanel snakePanel;
        private Snake snake;
        private JMenuBar bar;
        JMenu gameMenu;
        JMenu helpMenu;
        JMenu speedMenu;
        JMenuItem newItem;
        JMenuItem pauseItem;
        JMenuItem beginItem;
        JMenuItem helpItem;
        JMenuItem aboutItem;
        JMenuItem slowItem;
        JMenuItem midItem;
        JMenuItem fastItem;

        public SnakeFrame() {
                init();
                ActionListener l = new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                if (e.getSource() == pauseItem)
                                        snake.isRun = false;
                                if (e.getSource() == beginItem)
                                        snake.isRun = true;
                                if (e.getSource() == newItem) {
                                        newGame();
                                }
                                // ------------菜单控制运行速度
                                if (e.getSource() == slowItem) {
                                        snake.speed = Snake.SLOW;
                                        speedLabel.setText("Slow");
                                }
                                if (e.getSource() == midItem) {
                                        snake.speed = Snake.MID;
                                        speedLabel.setText("Mid");
                                }
                                if (e.getSource() == fastItem) {
                                        snake.speed = Snake.FAST;
                                        speedLabel.setText("Fast");
                                }
                        }
                };
                pauseItem.addActionListener(l);
                beginItem.addActionListener(l);
                newItem.addActionListener(l);
                aboutItem.addActionListener(l);
                slowItem.addActionListener(l);
                midItem.addActionListener(l);
                fastItem.addActionListener(l);
                addKeyListener(new KeyListener() {
                        public void keyPressed(KeyEvent e) {
                                switch (e.getKeyCode()) {
                                // ------------方向键改变蛇运行方向
                                case KeyEvent.VK_DOWN://
                                        snake.changeDerection(Snake.DOWN);
                                        break;
                                case KeyEvent.VK_UP://
                                        snake.changeDerection(Snake.UP);
                                        break;
                                case KeyEvent.VK_LEFT://
                                        snake.changeDerection(Snake.LEFT);
                                        break;
                                case KeyEvent.VK_RIGHT://
                                        snake.changeDerection(Snake.RIGHT);
                                        break;
                                // 空格键,游戏暂停或继续
                                case KeyEvent.VK_SPACE://
                                        if (snake.isRun == true) {
                                                snake.isRun = false;
                                                snake.status = Snake.PAUSED;
                                                break;
                                        }
                                        if (snake.isRun == false) {
                                                snake.isRun = true;
                                                snake.status = Snake.RUNNING;
                                                break;
                                        }
                                }
                        }

                        public void keyReleased(KeyEvent k) {
                        }

                        public void keyTyped(KeyEvent k) {
                        }
                });
        }

        private void init() {
                speedLabel = new JLabel();
                snake = new Snake();
                setSize(380, 460);
                setLayout(null);
                this.setResizable(false);
                bar = new JMenuBar();
                gameMenu = new JMenu("Game");
                newItem = new JMenuItem("New Game");
                gameMenu.add(newItem);
                pauseItem = new JMenuItem("Pause");
                gameMenu.add(pauseItem);
                beginItem = new JMenuItem("Continue");
                gameMenu.add(beginItem);
                helpMenu = new JMenu("Help");
                aboutItem = new JMenuItem("About");
                helpMenu.add(aboutItem);
                speedMenu = new JMenu("Speed");
                slowItem = new JMenuItem("Slow");
                fastItem = new JMenuItem("Fast");
                midItem = new JMenuItem("Middle");
                speedMenu.add(slowItem);
                speedMenu.add(midItem);
                speedMenu.add(fastItem);
                bar.add(gameMenu);
                bar.add(helpMenu);
                bar.add(speedMenu);
                setJMenuBar(bar);
                statusLabel = new JLabel();
                scoreLabel = new JLabel();
                snakePanel = new JPanel();
                snakePanel.setBounds(0, 0, 300, 400);
                snakePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
                add(snakePanel);
                statusLabel.setBounds(300, 25, 60, 20);
                add(statusLabel);
                scoreLabel.setBounds(300, 20, 60, 20);
                add(scoreLabel);
                JLabel temp = new JLabel("状态");
                temp.setBounds(310, 5, 60, 20);
                add(temp);
                temp = new JLabel("分数");
                temp.setBounds(310, 105, 60, 20);
                add(temp);
                temp = new JLabel("速度");
                temp.setBounds(310, 55, 60, 20);
                add(temp);
                speedLabel.setBounds(310, 75, 60, 20);
                add(speedLabel);
        }

        private void newGame() {
                this.remove(snakePanel);
                this.remove(statusLabel);
                this.remove(scoreLabel);
                speedLabel.setText("Slow");
                statusLabel = new JLabel();
                scoreLabel = new JLabel();
                snakePanel = new JPanel();
                snake = new Snake();
                snakePanel = new SnakePanel(snake);
                snakePanel.setBounds(0, 0, 300, 400);
                snakePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
                Runnable r1 = new SnakeRunnable(snake, snakePanel);
                Runnable r2 = new StatusRunnable(snake, statusLabel, scoreLabel);
                Thread t1 = new Thread(r1);
                Thread t2 = new Thread(r2);
                t1.start();
                t2.start();
                add(snakePanel);
                statusLabel.setBounds(310, 25, 60, 20);
                add(statusLabel);
                scoreLabel.setBounds(310, 125, 60, 20);
                add(scoreLabel);
        }

}

 

还可以从附件中下载:

分享到:
评论

相关推荐

    贪吃蛇经典版游戏java源代码

    开发工具是eclipse,语言是java,源文件有详细的注释供下载着查看学习,并且地图做了封装,可以随意更改

    贪吃蛇-java源代码

    在这个"贪吃蛇-java源代码"项目中,我们可以深入理解如何使用Java语言来实现这样一个游戏。Java是一种广泛应用的面向对象的编程语言,具有平台无关性和强大的类库支持,使得它在开发各种类型的应用程序时都非常方便...

    贪吃蛇Java源代码

    花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了。作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣。世间万物斗转星移,诺基亚曾经作为手机业的龙头...

    贪吃蛇java源代码

    贪吃蛇是一款经典的休闲游戏,源自1976年的“Blockade”游戏,后...通过分析和修改源代码,可以进一步理解和掌握Java语言的特性和编程技巧。同时,这个项目也鼓励大家学习如何在实际项目中应用所学知识,提升编程能力。

    java贪吃蛇小游戏代码java小游戏源码.zip

    【标签】:“java贪吃蛇小游戏代码”是指用于编写这个游戏的Java代码;“java小游戏源码”指的是整个游戏项目的原始代码,可以帮助开发者理解游戏的逻辑和结构;“java贪”和“贪吃蛇小游戏”是关键词,表明这是关于...

    java 贪吃蛇 源代码

    java 贪吃蛇 源代码 java 贪吃蛇 源代码 java 贪吃蛇 源代码

    java小游戏 贪吃蛇 java小游戏 贪吃蛇

    java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 贪吃蛇java小游戏 ...

    java贪吃蛇源代码

    【Java贪吃蛇源代码详解】 Java贪吃蛇游戏是一个经典的编程练习项目,它适合初学者,特别是对Java编程感兴趣的新手和菜鸟。这个项目旨在帮助开发者熟悉基本的编程概念,如控制台输入输出、循环、条件判断以及对象和...

    贪吃蛇 java

    `Worm`类会包含方法来移动蛇,如根据当前方向更新位置、增长蛇身(当吃到食物时)、检查碰撞(边界或自身)以及处理用户输入来改变蛇的方向。此外,该类还可能负责绘制蛇在游戏屏幕上的图像。 2. **WormStage.java*...

    贪吃蛇网络版 java代码

    在这个网络版的贪吃蛇游戏中,我们看到使用Java编程语言实现的版本。Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性而著名。下面我们将详细探讨Java在实现网络版贪吃蛇游戏中的应用。 ...

    Java贪吃蛇毕业设计源代码(配套毕业论文请看我其他资源)

    这个项目的源代码提供了实现这个游戏的全部细节,可以帮助学生深入理解Java编程语言以及游戏开发的基本原理。下面我们将详细探讨其中涉及的主要知识点。 1. **Java编程基础**: - **类与对象**:贪吃蛇游戏的实现...

    Java贪食蛇源代码

    利用Java Swing编写的贪食蛇(GUI),压缩包内为Eclipse创建的工程目录,源代码在Snack/src目录下。利用Eclipse可以直接import该文件夹至Workspace运行查看代码。

    JAVA贪吃蛇游戏毕业设计(源代码+论文)

    JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源代码+论文)JAVA贪吃蛇游戏毕业设计(源...

    JAVA实现贪吃蛇大作战游戏-全部源码

    6、蛇吃了一个食物后,蛇的尾部节点添加一个节点,食物消失。 7、食物每次被蛇吃掉后,要随机再次生成一个新的食物节点。 8、有个计数器,统计蛇的长度和积分,吃一个食物,蛇的长度+1,积分+10 9、通过按空格...

    JAVA贪吃蛇游戏毕业设计(源代码).zip

    JAVA贪吃蛇游戏毕业设计(源代码).zipJAVA贪吃蛇游戏毕业设计(源代码).zipJAVA贪吃蛇游戏毕业设计(源代码).zipJAVA贪吃蛇游戏毕业设计(源代码).zipJAVA贪吃蛇游戏毕业设计(源代码).zipJAVA贪吃蛇游戏毕业设计(源代码)...

    java实现的贪吃蛇小游戏程序源代码

    贪吃蛇游戏是一款经典的像素级游戏,玩家需要控制一条不断增长的蛇,通过移动来吃食物,每吃一次食物,蛇的长度就会增加,同时游戏难度也会相应提高。在此Java实现的版本中,我们将探讨以下几个关键知识点: 1. **...

    java 贪吃蛇源代码

    Java贪吃蛇游戏是一款经典的基于控制台的程序,它展示了基础的编程概念,如循环、条件判断、对象和类的设计。下面将详细讲解这个项目中涉及的Java编程知识点。 1. **面向对象编程**:Java是一种面向对象的语言,...

Global site tag (gtag.js) - Google Analytics