贪吃蛇是一款休闲小游戏,相信很多小伙伴都玩过,如果我们会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工具网。
推荐阅读: