用java贪吃蛇代码
时间: 2023-12-19 09:05:42 浏览: 19
以下是一个简单的Java贪吃蛇代码,其中包含了Snake类和Main类:
Snake类:
```java
package com.snake;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
public class Snake {
public Point point=null; //一直蛇其实就是一个小格子
public final int width=20;
public final int height=20;
public Snake(Point p) {
this.point=p;
}
public void drawSnake(Graphics g) {
g.setColor(Color.black);
g.fillRect(this.point.x,this.point.y, this.width,this.height);
}
}
```
Main类:
```java
package com.snake;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main extends JPanel implements KeyListener{
private static final long serialVersionUID = 1L;
private static final int WIDTH = 400;
private static final int HEIGHT = 400;
private static final int SNAKE_WIDTH = 20;
private static final int SNAKE_HEIGHT = 20;
private static final int FOOD_WIDTH = 20;
private static final int FOOD_HEIGHT = 20;
private static final int SLEEP_TIME = 100; private static final int FOOD_NUM = 5;
private static final int SCORE_PER_FOOD = 10;
private List<Snake> snakeList = new ArrayList<Snake>();
private Point foodPoint = null;
private int score = 0;
public Main() {
init();
}
private void init() {
JFrame frame = new JFrame("贪吃蛇");
frame.setSize(WIDTH, HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.addKeyListener(this);
frame.add(this);
frame.setVisible(true);
snakeList.add(new Snake(new Point(0, 0)));
snakeList.add(new Snake(new Point(SNAKE_WIDTH, 0)));
snakeList.add(new Snake(new Point(SNAKE_WIDTH * 2, 0)));
createFood();
}
private void createFood() {
Random random = new Random();
int x = random.nextInt(WIDTH / FOOD_WIDTH) * FOOD_WIDTH;
int y = random.nextInt(HEIGHT / FOOD_HEIGHT) * FOOD_HEIGHT;
foodPoint = new Point(x, y);
}
private void drawSnake(Graphics g) {
for (Snake snake : snakeList) {
snake.drawSnake(g);
}
}
private void drawFood(Graphics g) {
g.setColor(Color.red);
g.fillRect(foodPoint.x, foodPoint.y, FOOD_WIDTH, FOOD_HEIGHT);
}
private void move() {
Snake head = snakeList.get(snakeList.size() - 1);
int x = head.point.x;
int y = head.point.y;
switch (direction) {
case KeyEvent.VK_UP:
y -= SNAKE_HEIGHT;
break;
case KeyEvent.VK_DOWN:
y += SNAKE_HEIGHT;
break;
case KeyEvent.VK_LEFT:
x -= SNAKE_WIDTH;
break;
case KeyEvent.VK_RIGHT:
x += SNAKE_WIDTH;
break;
}
Snake newHead = new Snake(new Point(x, y));
snakeList.add(newHead);
if (x == foodPoint.x && y == foodPoint.y) {
score += SCORE_PER_FOOD;
createFood();
} else {
snakeList.remove(0);
}
}
private boolean isGameOver() {
Snake head = snakeList.get(snakeList.size() - 1);
if (head.point.x < 0 || head.point.x >= WIDTH || head.point.y < 0 || head.point.y >= HEIGHT) {
return true;
}
for (int i = 0; i < snakeList.size() - 1; i++) {
Snake snake = snakeList.get(i);
if (snake.point.x == head.point.x && snake.point.y == head.point.y) {
return true;
}
}
return false;
}
@Override
public void paint(Graphics g) {
super.paint(g);
drawSnake(g);
drawFood(g);
g.drawString("得分:" + score, 10, 20);
}
private int direction = KeyEvent.VK_RIGHT;
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_RIGHT) {
if (Math.abs(keyCode - direction) != 2) {
direction = keyCode;
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
public static void main(String[] args) {
Main main = new Main();
while (true) {
main.move();
main.repaint();
if (main.isGameOver()) {
break;
}
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```