示例截图:
俄罗斯方块是一款极具有挑战性的经典益智游戏,其核心是通过简洁的移动和旋转操作拼接方块以获得高分。本文将以Java为例,讲解如何从零开始实现这款游戏的核心功能。
项目结构
在开始代码细节之前,我们先简要说明项目结构:
- TetrisGame:主类,负责游戏逻辑的总体控制
- TetrisBoard:游戏板类,负责存储和操作方块
- TetrisPiece:方块类,表示和控制各个方块
- TetrisViewer:视图类,负责图形界面的绘制
初始化界面
首先,我们需要一个主类 TetrisGame
来初始化和运行游戏界面:
java
import javax.swing.JFrame;
public class TetrisGame extends JFrame {
private TetrisBoard board;
public TetrisGame() {
board = new TetrisBoard();
add(board);
setTitle("Tetris Game");
setSize(300, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
public static void main(String[] args) {
TetrisGame game = new TetrisGame();
game.setVisible(true);
game.startGame();
}
private void startGame() {
board.start();
}
}
游戏板
TetrisBoard
类是游戏的核心,负责处理方块的移动、旋转和消行等操作。
java
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TetrisBoard extends JPanel implements ActionListener {
private final int BOARD_WIDTH = 10;
private final int BOARD_HEIGHT = 20;
private Timer timer;
private boolean isFallingFinished = false;
private TetrisPiece currentPiece;
private int currentX = 0;
private int currentY = 0;
public TetrisBoard() {
setFocusable(true);
currentPiece = new TetrisPiece();
timer = new Timer(400, this);
}
public void start() {
currentPiece.newPiece();
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
if (isFallingFinished) {
isFallingFinished = false;
currentPiece.newPiece();
} else {
movePieceDown();
}
repaint();
}
private void movePieceDown() {
if (!tryMove(currentPiece, currentX, currentY + 1)) {
pieceDropped();
}
}
private void pieceDropped() {
currentPiece = new TetrisPiece();
}
private boolean tryMove(TetrisPiece newPiece, int newX, int newY) {
// 省略检查新位置是否有效的代码
currentPiece = newPiece;
currentX = newX;
currentY = newY;
return true;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
drawBoard(g);
}
private void drawBoard(Graphics g) {
// 绘制逻辑
}
}
方块类
TetrisPiece
类表示一个方块及其操作。为了简单起见,我们只定义了几种基本的方块。
java
import java.util.Random;
public class TetrisPiece {
enum Shape {
NoShape, ZShape, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape
}
private Shape pieceShape;
private int[][] coords;
private Random random = new Random();
public TetrisPiece() {
coords = new int[4][2];
setShape(Shape.NoShape);
}
public void newPiece() {
Shape[] values = Shape.values();
setShape(values[random.nextInt(values.length)]);
}
public void setShape(Shape shape) {
pieceShape = shape;
// 依据形状设置坐标
}
public Shape getShape() {
return pieceShape;
}
}
控制机制
为了让玩家能控制方块的移动和旋转,我们需要添加键盘事件监听:
java
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class TetrisBoard extends JPanel implements ActionListener {
// 省略前述内容
public TetrisBoard() {
// 省略前述内容
addKeyListener(new TAdapter());
}
private class TAdapter extends KeyAdapter {
public void keyPressed(KeyEvent e) {
int keycode = e.getKeyCode();
switch (keycode) {
case KeyEvent.VK_LEFT:
tryMove(currentPiece, currentX - 1, currentY);
break;
case KeyEvent.VK_RIGHT:
tryMove(currentPiece, currentX + 1, currentY);
break;
case KeyEvent.VK_UP:
// 旋转方块实现
break;
case KeyEvent.VK_DOWN:
movePieceDown();
break;
case KeyEvent.VK_SPACE:
// 立即下降实现
break;
}
}
}
// 省略后续内容
}