貪吃蛇是一款經典的小游戲,玩家通過控制蛇的移動來吃食物,蛇每吃到一個食物就會變長,游戲的目標是盡可能吃到更多的食物而不撞到墻壁或自己的身體。本文將介紹如何使用Java和JFrame來實現一個簡單的貪吃蛇小游戲。
首先,我們需要創建一個Java項目,并導入javax.swing
和java.awt
包。這些包提供了創建圖形用戶界面(GUI)和繪制圖形所需的基本類。
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import java.util.Random;
我們使用JFrame
來創建游戲窗口,并設置窗口的大小、標題和關閉操作。
public class SnakeGame extends JFrame {
private static final int WIDTH = 600;
private static final int HEIGHT = 600;
public SnakeGame() {
setTitle("貪吃蛇小游戲");
setSize(WIDTH, HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(false);
add(new GamePanel());
setVisible(true);
}
public static void main(String[] args) {
new SnakeGame();
}
}
接下來,我們創建一個GamePanel
類,繼承自JPanel
,并實現KeyListener
接口來處理鍵盤輸入。
class GamePanel extends JPanel implements KeyListener {
private static final int TILE_SIZE = 20;
private static final int ROWS = HEIGHT / TILE_SIZE;
private static final int COLS = WIDTH / TILE_SIZE;
private LinkedList<Point> snake;
private Point food;
private int direction; // 0: up, 1: right, 2: down, 3: left
private boolean running;
public GamePanel() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setBackground(Color.BLACK);
setFocusable(true);
addKeyListener(this);
initGame();
}
private void initGame() {
snake = new LinkedList<>();
snake.add(new Point(5, 5));
direction = 1;
spawnFood();
running = true;
}
private void spawnFood() {
Random random = new Random();
int x = random.nextInt(COLS);
int y = random.nextInt(ROWS);
food = new Point(x, y);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
drawSnake(g);
drawFood(g);
}
private void drawSnake(Graphics g) {
g.setColor(Color.GREEN);
for (Point p : snake) {
g.fillRect(p.x * TILE_SIZE, p.y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
}
}
private void drawFood(Graphics g) {
g.setColor(Color.RED);
g.fillRect(food.x * TILE_SIZE, food.y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_UP && direction != 2) {
direction = 0;
} else if (key == KeyEvent.VK_RIGHT && direction != 3) {
direction = 1;
} else if (key == KeyEvent.VK_DOWN && direction != 0) {
direction = 2;
} else if (key == KeyEvent.VK_LEFT && direction != 1) {
direction = 3;
}
}
@Override
public void keyReleased(KeyEvent e) {}
@Override
public void keyTyped(KeyEvent e) {}
}
在GamePanel
類中,我們需要實現游戲的主要邏輯,包括蛇的移動、食物的生成、碰撞檢測等。
private void move() {
Point head = snake.getFirst();
Point newHead = new Point(head);
switch (direction) {
case 0: newHead.y--; break;
case 1: newHead.x++; break;
case 2: newHead.y++; break;
case 3: newHead.x--; break;
}
if (newHead.equals(food)) {
snake.addFirst(newHead);
spawnFood();
} else {
snake.addFirst(newHead);
snake.removeLast();
}
if (checkCollision(newHead)) {
running = false;
}
}
private boolean checkCollision(Point head) {
if (head.x < 0 || head.x >= COLS || head.y < 0 || head.y >= ROWS) {
return true;
}
for (Point p : snake) {
if (p.equals(head) && p != snake.getFirst()) {
return true;
}
}
return false;
}
最后,我們需要創建一個游戲循環,不斷更新游戲狀態并重新繪制游戲面板。
public void startGame() {
while (running) {
move();
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
JOptionPane.showMessageDialog(this, "游戲結束!");
}
在GamePanel
的構造函數中調用startGame()
方法,啟動游戲循環。
public GamePanel() {
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setBackground(Color.BLACK);
setFocusable(true);
addKeyListener(this);
initGame();
startGame();
}
通過以上步驟,我們實現了一個簡單的貪吃蛇小游戲。這個游戲使用了Java的JFrame
和JPanel
來創建圖形界面,并通過鍵盤輸入來控制蛇的移動。雖然這個游戲還有很多可以改進的地方,比如增加分數顯示、難度調整等,但它已經具備了基本的游戲功能。希望這篇文章能幫助你理解如何使用Java和JFrame來實現一個簡單的游戲。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。