Java编写俄罗斯方块代码是什么
时间: 2024-04-30 11:19:19 浏览: 9
以下是一个简单的 Java 俄罗斯方块游戏的代码示例,仅供参考:
```java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Tetris extends JPanel {
private static final long serialVersionUID = -8715353373678321308L;
enum Tile {
NoShape(new int[][] { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }),
ZShape(new int[][] { { 0, -1 }, { 0, 0 }, { -1, 0 }, { -1, 1 } }),
SShape(new int[][] { { 0, -1 }, { 0, 0 }, { 1, 0 }, { 1, 1 } }),
LineShape(new int[][] { { 0, -1 }, { 0, 0 }, { 0, 1 }, { 0, 2 } }),
TShape(new int[][] { { -1, 0 }, { 0, 0 }, { 1, 0 }, { 0, 1 } }),
SquareShape(new int[][] { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } }),
LShape(new int[][] { { -1, -1 }, { 0, -1 }, { 0, 0 }, { 0, 1 } }),
MirroredLShape(new int[][] { { 1, -1 }, { 0, -1 }, { 0, 0 }, { 0, 1 } });
private int[][] coords;
private Tile(int[][] coords) {
this.coords = coords;
}
}
private ArrayList<Point> tiles = new ArrayList<Point>();
private Tile currentTile;
private int[][][] coordsTable;
private Random rand = new Random();
private int deltaX = 0;
private int score = 0;
private long time;
private boolean gameOver = false;
private final int squareWidth = 30;
public Tetris() {
setPreferredSize(new Dimension(200, 400));
initCoordsTable();
newTile();
time = System.currentTimeMillis();
Timer timer = new Timer(50, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
update();
repaint();
}
});
timer.start();
}
void initCoordsTable() {
coordsTable = new int[Tile.values().length][4][2];
for (int i = 0; i < Tile.values().length; ++i) {
for (int j = 0; j < 4; ++j) {
coordsTable[i][j][0] = Tile.values()[i].coords[j][0];
coordsTable[i][j][1] = Tile.values()[i].coords[j][1];
}
}
}
public void newTile() {
int i = rand.nextInt(7) + 1;
currentTile = Tile.values()[i];
tiles.clear();
for (int[] arr : currentTile.coords) {
tiles.add(new Point(arr[0] + 5, arr[1]));
}
deltaX = 0;
}
public void update() {
long newTime = System.currentTimeMillis();
if (move(0, 1)) {
if (newTime - time > 500) {
newTile();
}
} else {
for (Point p : tiles) {
if (p.y < 2) {
gameOver = true;
return;
}
}
checkLine();
newTile();
}
time = newTime;
}
public boolean move(int dx, int dy) {
for (Point p : tiles) {
int newX = p.x + dx + deltaX;
int newY = p.y + dy;
if (newX < 1 || newX > 10 || newY < 1 || newY > 20) {
return false;
}
if (tiles.contains(new Point(newX, newY))) {
return false;
}
}
for (Point p : tiles) {
p.x += dx + deltaX;
p.y += dy;
}
repaint();
return true;
}
public void rotate() {
if (currentTile == Tile.SquareShape) {
return;
}
ArrayList<Point> newTiles = new ArrayList<Point>();
for (Point p : tiles) {
newTiles.add(new Point(-p.y, p.x));
}
for (Point p : newTiles) {
int newX = p.x + currentTile.coords[0][0] + deltaX;
int newY = p.y + currentTile.coords[0][1];
if (newX < 1 || newX > 10 || newY < 1 || newY > 20) {
return;
}
}
tiles = newTiles;
repaint();
}
public void checkLine() {
ArrayList<Integer> fullLines = new ArrayList<Integer>();
for (int i = 1; i <= 20; ++i) {
int count = 0;
for (Point p : tiles) {
if (p.y == i) {
count++;
}
}
if (count == 10) {
fullLines.add(i);
}
}
score += fullLines.size() * 10;
for (int i : fullLines) {
for (int j = 0; j < tiles.size(); ++j) {
if (tiles.get(j).y == i) {
tiles.remove(j);
}
}
for (int j = 0; j < tiles.size(); ++j) {
if (tiles.get(j).y < i) {
tiles.get(j).y += 1;
}
}
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(0, 0, 100, 200);
for (Point p : tiles) {
g.setColor(Color.RED);
g.fillRect(p.x * squareWidth, (p.y - 2) * squareWidth, squareWidth, squareWidth);
}
for (int i = 0; i < 11; ++i) {
g.drawLine(i * squareWidth, 0, i * squareWidth, 400);
}
for (int i = 0; i < 21; ++i) {
g.drawLine(0, i * squareWidth, 200, i * squareWidth);
}
g.drawString("Score: " + score, 10, 220);
if (gameOver) {
g.drawString("Game Over!", 50, 100);
}
}
public static void main(String[] args) {
JFrame f = new JFrame("Tetris");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(200, 400);
f.add(new Tetris());
f.setVisible(true);
}
}
```