java贪吃蛇怎么可以让食物不闪屏?如何做一个简单的java贪吃蛇游戏?

贪吃蛇是一款休闲小游戏,相信很多小伙伴都玩过,如果我们会java的话,那么可以使用java开发贪吃蛇,那java贪吃蛇怎么可以让食物不闪屏?下面来我们就来给大家讲解一下。

主要用到双缓冲技术:

public void update(Graphics g)
    {
        Image bgImage = createImage(this.getSize()
            .width, this.getSize()
            .height);
        Graphics bg = bgImage.getGraphics();
        g.setColor(Color.black); //设置背景 g.fillRect(0, 0, 480, 480); bg.setColor(Color.green); // 食物颜色 bg.fill3DRect(foodx, foody, 10, 10, true); bg.setColor(Color.pink); for(i=0;i<=length-1;i++) bg.fill3DRect(m[i],n[i],10,10,true); //m[]x坐标 n[]y坐标 g.drawImage (bgImage, 0, 0, this); } public void paint(Graphics g){ update(g); }

如何做一个简单的java贪吃蛇游戏?

主要有三个类,一个主类,一个食物类,一个贪吃蛇类。

1、首先定义主类,主类中主要用来创建窗口

public class Main
{
    public static final int WIDTH = 600;
    public static final int HEIGHT = 600;
    public static void main(String[] args)
    {
        JFrame win = new JFrame();
        win.setVisible(true);
        win.setSize(WIDTH, HEIGHT);
        win.setDefaultCloseOperation(3);
        win.setLocationRelativeTo(null);
        SnakePanel panle = new SnakePanel();
        win.add(panle);
        SnakePanel.Key l = panle.new Key();
        win.addKeyListener(l);
        panle.addKeyListener(l);
        panle.run();
    }
}

2、其次是定义食物类,食物有长和宽,还有在窗口中的位置

import java.util.Random;
public class Cell
{
    protected int x;
    protected int y;
    protected int width;
    protected int height;
    Random ran = new Random();
    public Cell()
    {
        Random ran = new Random();
        this.x = ran.nextInt(25) * 15 + 60;
        this.y = ran.nextInt(25) * 15 + 50;
        this.width = 15;
        this.height = 15;
    }
    public Cell(int x, int y)
    {
        this();
        this.x = x;
        this.y = y;
    }
    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 int getWidth()
    {
        return width;
    }
    public void setWidth(int width)
    {
        this.width = width;
    }
    public int getHeight()
    {
        return height;
    }
    public void setHeight(int height)
    {
        this.height = height;
    }
}

3、最后是蛇类

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JPanel;
public class SnakePanel extends JPanel
{
    final int RIGHT = 1;
    final int LEFT = 2;
    final int UP = 3;
    final int DOWN = 4;
    int moved = 1;
    Cell food;
    Cell[] snake;
    public SnakePanel()
    {
        food = new Cell();
        snake = new Cell[5];
        for (int i = 0; i < snake.length; i++)
        {
            < p = "" >
                snake[i] = new Cell(210 + i * 15, 50);
        }
    }
    class Key extends KeyAdapter
    {
        @Override
        public void keyPressed(KeyEvent e)
        {
            int code = e.getKeyCode();
            //System.out.println(code);
            if (code == 37 && moved != RIGHT)
            {
                moved = LEFT;
            }
            if (code == 39 && moved != LEFT)
            {
                moved = RIGHT;
            }
            if (code == 38 && moved != DOWN)
            {
                moved = UP;
            }
            if (code == 40 && moved != UP)
            {
                moved = DOWN;
            }
        }
    }
    public void paint(Graphics g)
    {
        super.paint(g);
        g.setFont(new Font(Font.SERIF, Font.BOLD, 28));
        g.drawRect(60, 50, 450, 450);
        for (int i = 15; i <= 450; i += 15)
        {
            g.drawLine(60 + i, 50, 60 + i, 500);
        }
        for (int i = 15; i <= 450; i += 15)
        {
            g.drawLine(60, 50 + i, 510, 50 + i);
        }
        g.setColor(Color.BLUE);
        g.drawString("欢迎来到贪吃蛇大战", 140, 40);
        g.fillRect(food.x, food.y, food.width, food.height);
        for (int i = 0; i < snake.length; i++)
        {
            < p = "" >
                g.fillRect(snake[i].x, snake[i].y, snake[i].width, snake[i].height);
        }
    }
    int speed = 250;
    public void run()
    {
        Timer timer = new Timer();
        TimerTask task = new TimerTask()
        {
            @Override
            public void run()
            {
                step();
                repaint();
            }
        };
        if (snake.length >= 10)
        {
            speed = 125;
        }
        else if (snake.length >= 20)
        {
            speed = 60;
        }
        else if (snake.length >= 30)
        {
            speed = 30;
        }
        else if (snake.length >= 40)
        {
            speed = 15;
        }
        timer.schedule(task, 1000, speed);
    }
    public void step()
    {
        for (int i = 1; i < snake.length; i++)
        {
            < p = "" >
                snake[i - 1] = snake[i];
        }
        Cell c = new Cell(snake[snake.length - 1].getX(), snake[snake.length - 1].getY());
        if (moved == RIGHT)
        {
            c.setX(c.getX() + 15);
        }
        if (moved == UP)
        {
            c.setY(c.getY() - 15);
        }
        if (moved == DOWN)
        {
            c.setY(c.getY() + 15);
        }
        if (moved == LEFT)
        {
            c.setX(c.getX() - 15);
        }
        snake[snake.length - 1] = c;
        //System.out.println(c.getX()+","+c.getY());
        if (snake[snake.length - 1].getX() > 510 ||
            snake[snake.length - 1].getX() < 60 ||
            snake[snake.length - 1].getY() > 500 ||
            snake[snake.length - 1].getY() < 50)
        {
            System.exit(0);
        }
        if (snake[snake.length - 1].x == food.x && snake[snake.length - 1].y == food.y)
        {
            snake = Arrays.copyOf(snake, snake.length + 1);
            snake[snake.length - 1] = food;
            food = new Cell();
        }
    }
}

到这里一个简单的贪吃蛇小游戏就完成了,其实开发贪吃蛇游戏主要就是开发思路,将思路理清,开发起来就会顺利很多!最后大家如果想要了解更多java实例知识,敬请关注奇Q工具网。

推荐阅读:

java多线程的使用场景有哪些?java多线程如何创建?

哪里刷java面试题?Java有哪些常见面试题?

Spring如何入门?spring入门教程