Java编写俄罗斯方块代码以及每行代码作用
时间: 2024-05-13 07:17:07 浏览: 145
以下是Java编写俄罗斯方块的代码及其每行代码的作用:
```java
import java.util.Random;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
```
这些是需要引入的包,在这里我们需要使用`Random`类和JavaFX相关的类。
```java
public class Tetromino {
private Tetrominoes pieceShape;
private int[][] coords;
private int[][][] coordsTable;
private Board board;
private Color color;
private Random rand;
}
```
这是`Tetromino`类的定义,表示俄罗斯方块的形状、坐标、坐标表、所在的游戏板、颜色以及随机数生成器。
```java
private static final int[][][] coordsTable = {
{{0, 0}, {0, 0}, {0, 0}, {0, 0}},
{{0, -1}, {0, 0}, {-1, 0}, {-1, 1}},
{{0, -1}, {0, 0}, {1, 0}, {1, 1}},
{{0, -1}, {0, 0}, {0, 1}, {0, 2}},
{{-1, 0}, {0, 0}, {1, 0}, {0, 1}},
{{0, 0}, {1, 0}, {0, 1}, {1, 1}},
{{-1, -1}, {0, -1}, {0, 0}, {0, 1}},
{{1, -1}, {0, -1}, {0, 0}, {0, 1}}
};
```
这是一个坐标表,表示所有七种俄罗斯方块的所有可能的形状和方向。每个方块用一个`int[][]`数组表示,其中每个元素都是一个长度为2的`int`数组,表示其在游戏板上的(x,y)坐标。
```java
public Tetromino() {
rand = new Random();
coords = new int[4][2];
coordsTable = new int[][][] {
{{0, 0}, {0, 0}, {0, 0}, {0, 0}},
{{0, -1}, {0, 0}, {-1, 0}, {-1, 1}},
{{0, -1}, {0, 0}, {1, 0}, {1, 1}},
{{0, -1}, {0, 0}, {0, 1}, {0, 2}},
{{-1, 0}, {0, 0}, {1, 0}, {0, 1}},
{{0, 0}, {1, 0}, {0, 1}, {1, 1}},
{{-1, -1}, {0, -1}, {0, 0}, {0, 1}},
{{1, -1}, {0, -1}, {0, 0}, {0, 1}}
};
setShape(Tetrominoes.NoShape);
}
```
这是`Tetromino`类的构造函数,初始化随机数生成器、坐标数组和坐标表,并将形状设置为`NoShape`。
```java
public void setShape(Tetrominoes shape) {
coordsTable = Tetromino.coordsTable;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 2; ++j) {
coords[i][j] = coordsTable[shape.ordinal()][i][j];
}
}
pieceShape = shape;
setColor(Tetromino.colorTable[shape.ordinal()]);
}
```
这是设置方块形状的方法,根据给定的形状从坐标表中获取该形状对应的坐标数组,并将颜色设置为相应的颜色。
```java
private void setColor(Color color) {
this.color = color;
}
```
这是设置方块颜色的方法。
```java
public int getX(int index) {
return coords[index][0];
}
public int getY(int index) {
return coords[index][1];
}
```
这是获取方块某个坐标的x和y值的方法。
```java
public Tetrominoes getShape() {
return pieceShape;
}
public void setX(int index, int x) {
coords[index][0] = x;
}
public void setY(int index, int y) {
coords[index][1] = y;
}
public Color getColor() {
return color;
}
```
这是获取和设置方块形状、坐标和颜色的方法。
```java
public int minX() {
int m = coords[0][0];
for (int i = 0; i < 4; i++) {
m = Math.min(m, coords[i][0]);
}
return m;
}
public int minY() {
int m = coords[0][1];
for (int i = 0; i < 4; i++) {
m = Math.min(m, coords[i][1]);
}
return m;
}
public int maxX() {
int m = coords[0][0];
for (int i = 0; i < 4; i++) {
m = Math.max(m, coords[i][0]);
}
return m;
}
public int maxY() {
int m = coords[0][1];
for (int i = 0; i < 4; i++) {
m = Math.max(m, coords[i][1]);
}
return m;
}
```
这是获取方块在x和y轴上的最小和最大坐标值的方法。
```java
public void rotateLeft() {
if (pieceShape == Tetrominoes.SquareShape) {
return;
}
for (int i = 0; i < 4; i++) {
int x = coords[i][0];
int y = coords[i][1];
coords[i][0] = y;
coords[i][1] = -x;
}
}
public void rotateRight() {
if (pieceShape == Tetrominoes.SquareShape) {
return;
}
for (int i = 0; i < 4; i++) {
int x = coords[i][0];
int y = coords[i][1];
coords[i][0] = -y;
coords[i][1] = x;
}
}
```
这是旋转方块的方法,对于正方形方块不做处理。左旋转将方块坐标(x,y)转换为(y,-x),右旋转将其转换为(-y,x)。
```java
public boolean tryMove(int deltaX, int deltaY) {
for (int i = 0; i < 4; i++) {
int x = coords[i][0] + deltaX;
int y = coords[i][1] + deltaY;
if (x < 0 || x >= Board.BoardWidth || y < 0 || y >= Board.BoardHeight) {
return false;
}
if (board.getShape(x, y) != Tetrominoes.NoShape) {
return false;
}
}
for (int i = 0; i < 4; i++) {
coords[i][0] += deltaX;
coords[i][1] += deltaY;
}
board.update();
return true;
}
```
这是尝试将方块沿x和y轴移动的方法,先检查是否超出游戏板范围或与其他方块重叠,如果没有则更新方块坐标并更新游戏板。如果移动成功则返回true,否则返回false。
```java
private static final Color[] colorTable = {
Color.rgb(0, 0, 0),
Color.rgb(204, 102, 102),
Color.rgb(102, 204, 102),
Color.rgb(102, 102, 204),
Color.rgb(204, 204, 102),
Color.rgb(204, 102, 204),
Color.rgb(102, 204, 204),
Color.rgb(218, 170, 0)
};
```
这是一个颜色表,表示每个形状对应的颜色。
```java
public enum Tetrominoes {
NoShape, ZShape, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape
}
```
这是一个枚举类型,表示所有可能的方块形状。`NoShape`表示空方块,其他几个表示不同形状的方块。
阅读全文