Java俄罗斯方块游戏代码:多样化玩法实现
当然,我可以为您提供一个多样性的玩法俄罗斯方块的Java代码实现。下面是一个简单的示例,您可以根据自己的需求进行修改和扩展。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Tetris extends JPanel implements ActionListener {
private final int BOARD_WIDTH = 10;
private final int BOARD_HEIGHT = 22;
private final int DELAY = 300;
private Timer timer;
private boolean isFallingFinished = false;
private boolean isStarted = false;
private boolean isPaused = false;
private int numLinesRemoved = 0;
private int curX = 0;
private int curY = 0;
private Shape curPiece;
private Shape.Tetrominoes[] board;
public Tetris() {
initBoard();
}
private void initBoard() {
setFocusable(true);
addKeyListener(new TAdapter());
setBackground(Color.BLACK);
curPiece = new Shape();
timer = new Timer(DELAY, this);
timer.start();
board = new Shape.Tetrominoes[BOARD_WIDTH * BOARD_HEIGHT];
clearBoard();
}
private int boardWidth() {
return getWidth() / BOARD_WIDTH;
}
private int boardHeight() {
return getHeight() / BOARD_HEIGHT;
}
private Shape.Tetrominoes shapeAt(int x, int y) {
return board[(y * BOARD_WIDTH) + x];
}
private void start() {
if (isPaused) {
return;
}
isStarted = true;
isFallingFinished = false;
numLinesRemoved = 0;
clearBoard();
newPiece();
timer.start();
}
private void pause() {
if (!isStarted) {
return;
}
isPaused = !isPaused;
if (isPaused) {
timer.stop();
} else {
timer.start();
}
repaint();
}
private void doDrawing(Graphics g) {
var size = getSize();
int boardTop = (int) size.getHeight() - BOARD_HEIGHT * boardHeight();
for (int i = 0; i < BOARD_HEIGHT; i++) {
for (int j = 0; j < BOARD_WIDTH; j++) {
Shape.Tetrominoes shape = shapeAt(j, BOARD_HEIGHT - i - 1);
if (shape != Shape.Tetrominoes.NoShape) {
drawSquare(g, j * boardWidth(), boardTop + i * boardHeight(), shape);
}
}
}
if (curPiece.getShape() != Shape.Tetrominoes.NoShape) {
for (int i = 0; i < 4; i++) {
int x = curX + curPiece.x(i);
int y = curY - curPiece.y(i);
drawSquare(g, x * boardWidth(), boardTop + (BOARD_HEIGHT - y - 1) * boardHeight(), curPiece.getShape());
}
}
}
private void drawSquare(Graphics g, int x, int y, Shape.Tetrominoes shape) {
Color colors[] = {
new Color(0, 0, 0), new Color(204, 102, 102), new Color(102, 204, 102),
new Color(102, 102, 204), new Color(204, 204, 102), new Color(204, 102, 204),
new Color(102, 204, 204), new Color(218, 170, 0)
};
var color = colors[shape.ordinal()];
g.setColor(color);
g.fillRect(x + 1, y + 1, boardWidth() - 2, boardHeight() - 2);
g.setColor(color.brighter());
g.drawLine(x, y + boardHeight() - 1, x, y);
g.drawLine(x, y, x + boardWidth() - 1, y);
g.setColor(color.darker());
g.drawLine(x + 1, y + boardHeight() - 1, x + boardWidth() - 1, y + boardHeight() - 1);
g.drawLine(x + boardWidth() - 1, y + boardHeight() - 1, x + boardWidth() - 1, y + 1);
}
private void dropDown() {
int newY = curY;
while (newY > 0) {
if (!tryMove(curPiece, curX, newY - 1)) {
break;
}
newY--;
}
pieceDropped();
}
private void oneLineDown() {
if (!tryMove(curPiece, curX, curY - 1)) {
pieceDropped();
}
}
private void removeFullLines() {
int numFullLines = 0;
int rowsToDelete = 0;
for (int i = BOARD_HEIGHT - 1; i >= 0; i--) {
boolean lineIsFull = true;
for (int j = 0; j < BOARD_WIDTH; j++) {
if (shapeAt(j, i) == Shape.Tetrominoes.NoShape) {
lineIsFull = false;
break;
}
}
if (lineIsFull) {
rowsToDelete++;
for (int k = i; k < BOARD_HEIGHT - 1; k++) {
for (int j = 0; j < BOARD_WIDTH; j++) {
board[(k * BOARD_WIDTH) + j] = shapeAt(j, k + 1);
}
}
}
}
if (rowsToDelete > 0) {
numLinesRemoved += rowsToDelete;
isFallingFinished = true;
curPiece.setShape(Shape.Tetrominoes.NoShape);
repaint();
}
}
private void newPiece() {
curPiece.setRandomShape();
curX = BOARD_WIDTH / 2 + 1;
curY = BOARD_HEIGHT - 1 + curPiece.minY();
if (!tryMove(curPiece, curX, curY)) {
curPiece.setShape(Shape.Tetrominoes.NoShape);
timer.stop();
isStarted = false;
}
}
private boolean tryMove(Shape newPiece, int newX, int newY) {
for (int i = 0; i < 4; i++) {
int x = newX + newPiece.x(i);
int y = newY - newPiece.y(i);
if (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) {
return false;
}
if (shapeAt(x, y) != Shape.Tetrominoes.NoShape) {
return false;
}
}
curPiece = newPiece;
curX = newX;
curY = newY;
repaint();
return true;
}
private void pieceDropped() {
for (int i = 0; i < 4; i++) {
int x = curX + curPiece.x(i);
int y = curY - curPiece.y(i);
board[(y * BOARD_WIDTH) + x] = curPiece.getShape();
}
removeFullLines();
if (!isFallingFinished) {
newPiece();
}
}
private void clearBoard() {
for (int i = 0; i < BOARD_HEIGHT * BOARD_WIDTH; i++) {
board[i] = Shape.Tetrominoes.NoShape;
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (isFallingFinished) {
isFallingFinished = false;
newPiece();
} else {
oneLineDown();
}
}
private class TAdapter extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
if (!isStarted || curPiece.getShape() == Shape.Tetrominoes.NoShape) {
return;
}
int keycode = e.getKeyCode();
switch (keycode) {
case KeyEvent.VK_P:
pause();
break;
case KeyEvent.VK_LEFT:
tryMove(curPiece, curX - 1, curY);
break;
case KeyEvent.VK_RIGHT:
tryMove(curPiece, curX + 1, curY);
break;
case KeyEvent.VK_DOWN:
tryMove(curPiece.rotateRight(), curX, curY);
break;
case KeyEvent.VK_UP:
tryMove(curPiece.rotateLeft(), curX, curY);
break;
case KeyEvent.VK_SPACE:
dropDown();
break;
}
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
doDrawing(g);
}
@Override
public void setPreferredSize(Dimension dimension) {
super.setPreferredSize(new Dimension(BOARD_WIDTH * 26, BOARD_HEIGHT * 26));
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(() -> {
var game = new Tetris();
game.setPreferredSize(new Dimension(600, 800));
var frame = new javax.swing.JFrame();
frame.setTitle('Tetris');
frame.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.add(game);
frame.pack();
frame.setVisible(true);
});
}
}
请注意,这只是一个简单的实现,只包含了俄罗斯方块的基本功能。您可以根据自己的需求对其进行扩展和改进,添加更多的功能和特性。
原文地址: http://www.cveoy.top/t/topic/bQNq 著作权归作者所有。请勿转载和采集!