import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class SnakeGame extends JFrame implements KeyListener {
private static final int WIDTH = 400;
private static final int HEIGHT = 400;
private static final int DOT_SIZE = 10;
private static final int DELAY = 100;private List<Point> snake;
private Point food;
private int direction;
private Timer timer;public SnakeGame() {
setTitle("Snake Game");
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);addKeyListener(this);
snake = new ArrayList<>();
snake.add(new Point(50, 50));
snake.add(new Point(40, 50));
snake.add(new Point(30, 50));food = new Point(200, 200);
direction = KeyEvent.VK_RIGHT;
timer = new Timer(DELAY, e -> gameLoop());
timer.start();
}private void gameLoop() {
move();
checkCollision();
repaint();
}private void move() {
Point head = new Point(snake.get(0));
switch (direction) {
case KeyEvent.VK_UP:
head.y -= DOT_SIZE;
break;
case KeyEvent.VK_DOWN:
head.y += DOT_SIZE;
break;
case KeyEvent.VK_LEFT:
head.x -= DOT_SIZE;
break;
case KeyEvent.VK_RIGHT:
head.x += DOT_SIZE;
break;
}
snake.add(0, head);
if (!head.equals(food)) {
snake.remove(snake.size() - 1);
} else {
generateFood();
}
}private void checkCollision() {
Point head = snake.get(0);
if (head.x < 0 || head.x >= WIDTH || head.y < 0 || head.y >= HEIGHT || snake.contains(head)) {
timer.stop();
JOptionPane.showMessageDialog(this, "Game Over", "Game Over", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}private void generateFood() {
Random random = new Random();
int x = random.nextInt(WIDTH / DOT_SIZE) * DOT_SIZE;
int y = random.nextInt(HEIGHT / DOT_SIZE) * DOT_SIZE;
food = new Point(x, y);
}@Override
public void paint(Graphics g) {
super.paint(g);g.setColor(Color.BLACK);
g.fillRect(0, 0, WIDTH, HEIGHT);g.setColor(Color.GREEN);
for (Point point : snake) {
g.fillRect(point.x, point.y, DOT_SIZE, DOT_SIZE);
}g.setColor(Color.RED);
g.fillRect(food.x, food.y, DOT_SIZE, DOT_SIZE);Toolkit.getDefaultToolkit().sync();
g.dispose();
}@Override
public void keyTyped(KeyEvent e) {}@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_UP && direction != KeyEvent.VK_DOWN) {
direction = key;
} else if (key == KeyEvent.VK_DOWN && direction != KeyEvent.VK_UP) {
direction = key;
} else if (key == KeyEvent.VK_LEFT && direction != KeyEvent.VK_RIGHT) {
direction = key;
} else if (key == KeyEvent.VK_RIGHT && direction != KeyEvent.VK_LEFT) {
direction = key;
}
}@Override
public void keyReleased(KeyEvent e) {}public static void main(String[] args) {
new SnakeGame();
}
}