贪吃蛇java源代码

原创 2016年04月20日 21:03:58

这个贪吃蛇是我学完Java之后的课程设计作业,做了有挺久的,做完这个小游戏,自己对Java的一些知识也更了解了些。其中包括按完按钮后焦点的处理啊,还有就是图形的闪烁问题。我当时做的时候基本是在自己电脑上完成的,后来才放到学校机房测试的。说来也奇怪,这个代码开始在我自己电脑上运行的时候并没有闪烁,所以我也就没想过要处理闪烁的问题,可是后来在学校机房闪烁的十分严重,所以才又用双缓冲来处理闪烁。

双缓冲解决图形闪烁源代码:

@Override
    public void update(Graphics g) {
        // TODO Auto-generated method stub
        ImageBuffer = createImage(this.getWidth(), this.getHeight());
        GraImage = ImageBuffer.getGraphics(); // 获取图形缓冲区的图形上下文
        paint(GraImage); // 用paint方法中编写的绘图过程对图形缓冲区绘图
        GraImage.dispose(); // 释放图形上下文资源
        g.drawImage(ImageBuffer, 0, 0, this); // 将图形缓冲区绘制到屏幕上
    }

运行效果:

下面是贪吃蛇完整源代码:

SnakeBody.java

package com.java.snake;

import java.awt.Color;

public class SnakeBody {
    private int x;
    private int y;
    private Color color;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public Color getColor() {
        return color;
    }
    public void setColor(Color color) {
        this.color = color;
    }
}

GameUi.java

package com.java.snake;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;

import javax.swing.*;

public class GameUi extends JFrame {
    int flag = 1;
    JLabel jl = new JLabel();
    JLabel fs = new JLabel();
    JButton start = new JButton("开始");
    JButton stop = new JButton("暂停");
    JButton restart = new JButton("重玩");
    JButton exit = new JButton("退出");
    boolean p = true;

    JPanel pan = new JPanel();

    GridLayout grid = new GridLayout(1, 5);

    Random r1 = new Random();
    Random r2 = new Random();
    int a = (r1.nextInt(53) + 1) * 10 - 4;
    int b = (r2.nextInt(35) + 6) * 10 - 1;

    int score = 0;
    int foodNumber = 0;

    final int HW = 9;
    int x = (r1.nextInt(35) + 10) * 10 - 4;
    int y = (r2.nextInt(35) + 6) * 10 - 1;
    LinkedList<SnakeBody> snake = new LinkedList<SnakeBody>();
    int direction = 1;
    SnakeBody tail;
    SnakeBody head;

    class Mytask implements Runnable{
        @Override
        public void run() {
            // TODO Auto-generated method stub
            ALL: while (true) {
                head = snake.getFirst();
                /*
                 * 判断蛇是否吃到食物,如果吃到食物则产生一个随机数,若产生的随机数在蛇的身体上则重新再产生一个随机数
                 */
                if (head.getX() == a && head.getY() == b) {
                    SnakeBody c = new SnakeBody();
                    snake.add(c);
                    ++foodNumber;
                    score += 10;
                    fs.setText("分数:" + score);
                    /* 判断生成的食物是不是在蛇的身体里 */
                    for (int i = 0; i < snake.size(); i++) {
                        SnakeBody d = snake.get(i);
                        if (d.getX() == a && d.getY() == b) {
                            a = (r1.nextInt(53) + 1) * 10 - 4;
                            b = (r2.nextInt(35) + 6) * 10 - 1;
                        }
                    }
                }

                int x1 = head.getX();
                int y1 = head.getY();
                /* 判断是否触到边缘 */
                if (x1 < 6 || x1 > 536 || y1 < 59 || y1 > 419) {

                    gameover();
                    break ALL;
                }
                /* 判断是否吃到自己的身体 */
                else {
                    for (int i = 3; i < snake.size(); i++) {
                        SnakeBody d = snake.get(i);
                        if (d.getX() == x1 && d.getY() == y1) {
                            gameover();
                            break ALL;
                        }
                    }
                }
                if (p != false) {
                    moving(direction);
                    update(getGraphics());
                }

                try {
                    //Thread.sleep(500 - foodNumber / 2 * 100);
                    //可设置等级,等级不同可以有不同的速度
                    Thread.sleep(100);
                } catch (Exception e) {
                }
            }
        }

        private void gameover() {
            // TODO Auto-generated method stub
            jl.setText("GAME OVER");
            jl.setBounds(150, 150, 400, 100);
            jl.setForeground(Color.red);
            jl.setFont(new Font("宋体", Font.BOLD, 55));
            add(jl);
            update(getGraphics());
        }
    }

    Thread timer = new Thread(new Mytask());

    public GameUi() {
        // TODO Auto-generated constructor stub
        this.setTitle("我的贪吃蛇");
        this.setSize(552, 435);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        initSnakeBody();
        initEvent();
        fs.setText("分数:" + score);

        add(pan, BorderLayout.NORTH);
        pan.setLayout(grid);
        pan.add(start);
        pan.add(stop);
        pan.add(restart);
        pan.add(exit);
        pan.add(fs);
        this.requestFocus();
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if (e.getSource() == start) {
                    p = true;
                }
                GameUi g = getUi();
                g.requestFocus();
            }

        });
        stop.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if (e.getSource() == stop)
                    p = false;
            }
        });
        restart.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if (e.getSource() == restart) {
                    new GameUi();
                    dispose();
                }
            }
        });
        exit.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                if (e.getSource() == exit)
                    System.exit(EXIT_ON_CLOSE);
            }
        });
        timer.start();
    }

    protected GameUi getUi() {
        return this;
    }

    @Override
    /* 画边缘,蛇身,食物 */
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g);
        Graphics2D g_2d = (Graphics2D) g;
        g_2d.setColor(Color.BLACK);
        g_2d.setStroke(new BasicStroke(2f));
        g_2d.drawLine(5, 58, 547, 58);// 上面的那根线
        g_2d.drawLine(5, 58, 5, 430);// 左边的那根线
        g_2d.drawLine(5, 430, 547, 430);// 下面的那根线
        g_2d.drawLine(547, 58, 547, 430);// 右边的那根线
        g_2d.setColor(Color.black);
        for (int i = 0; i < snake.size(); i++) {
            SnakeBody b = snake.get(i);
            g.fillRect(b.getX(), b.getY(), HW, HW);
        }
        g.setColor(Color.red);
        g.fillRect(a, b, HW, HW);
    }

    Image ImageBuffer = null;
    Graphics GraImage = null;

    @Override
    public void update(Graphics g) {
        // TODO Auto-generated method stub
        ImageBuffer = createImage(this.getWidth(), this.getHeight());
        GraImage = ImageBuffer.getGraphics(); // 获取图形缓冲区的图形上下文
        paint(GraImage); // 用paint方法中编写的绘图过程对图形缓冲区绘图
        GraImage.dispose(); // 释放图形上下文资源
        g.drawImage(ImageBuffer, 0, 0, this); // 将图形缓冲区绘制到屏幕上
    }

    /* 初始化蛇身 */
    public void initSnakeBody() {
        // TODO Auto-generated method stub
        for (int i = 0; i < 5; i++) {
            SnakeBody b = new SnakeBody();
            b.setX(x + i * HW + i);
            b.setY(y);
            snake.add(b);
        }
        tail = snake.getLast();
        head = snake.getFirst();
    }

    /* 蛇移动的时候身体的变化 */
    public void moving(int direction) {
        tail = snake.removeLast();
        head = snake.getFirst();
        switch (direction) {
        // 1:左;2:上;3:右;4:下
        case 1:
            tail.setX(head.getX() - HW - 1);
            tail.setY(head.getY());
            break;
        case 2:
            tail.setX(head.getX());
            tail.setY(head.getY() - HW - 1);
            break;
        case 3:
            tail.setX(head.getX() + HW + 1);
            tail.setY(head.getY());
            break;
        case 4:
            tail.setX(head.getX());
            tail.setY(head.getY() + HW + 1);
            break;
        }
        snake.addFirst(tail);
    }

    /* 方向控制 */
    public void initEvent() {
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent event) {
                // TODO Auto-generated method stub
                switch (event.getKeyCode()) {
                case KeyEvent.VK_UP:
                    if (direction == 2 || direction == 4) {
                        break;
                    }
                    direction = 2;
                    break;
                case KeyEvent.VK_DOWN:
                    if (direction == 2 || direction == 4) {
                        break;
                    }
                    direction = 4;
                    break;
                case KeyEvent.VK_LEFT:
                    if (direction == 1 || direction == 3) {
                        break;
                    }
                    direction = 1;
                    break;
                case KeyEvent.VK_RIGHT:
                    if (direction == 1 || direction == 3) {
                        break;
                    }
                    direction = 3;
                    break;
                }
            }
        });
    }
}

Test.java

package com.java.snake;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new GameUi();

    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java swing 写的贪吃蛇代码200行

刚学完书上java的swing,无聊做个贪吃蛇练练, 200多行的代码也写了好几个小时 0.0! 代码整体分成三块: * greedySnackMain:框架类 * snackWin: 面板...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

java贪吃蛇源代码

java贪吃蛇源代码,代码下载地址:http://www.zuidaima.com/share/1737620634422272.htm
  • yaerfeng
  • yaerfeng
  • 2014年04月09日 10:54
  • 17229

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

贪吃蛇的java代码分析(一)

自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步。今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

java版 贪吃蛇小游戏 完整源码 (测试100%无误

package mvcTest;       //July、06.11(完成测试)。     //根据以下代码,编译,游戏运行界面如下:    贪吃蛇小游戏 完整源码 (测试1...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:贪吃蛇java源代码
举报原因:
原因补充:

(最多只允许输入30个字)