Anonymous user
Tetris/Java: Difference between revisions
→{{header|Java}}: cleaned up code a bit, calculate preview offsets
m (turn previewOffsets into EnumMap) |
(→{{header|Java}}: cleaned up code a bit, calculate preview offsets) |
||
Line 1:
==Code==
{{works with|java|8}}
<lang java>
import java.awt.event.*;
import static java.lang.String.format;
import java.util.
▲import java.util.Random;
▲import java.util.EnumMap;
import javax.swing.*;
import static tetris.Config.*;
public class Tetris extends JPanel implements Runnable {
right(1, 0), down(0, 1), left(-1, 0);
Dir(int x, int y) {
this.x = x;
this.y = y;
}▼
};
public static final int EMPTY = -1;
public static final int BORDER = -2;
Shape fallingShape;
Shape
// position of falling shape
int fallingShapeRow;
int fallingShapeCol;
▲ final int nRows = Config.nRows;
final int[][] grid = new int[nRows][nCols];
Line 33 ⟶ 39:
public Tetris() {
setPreferredSize(
setBackground(
setFocusable(true);
Line 67 ⟶ 73:
case KeyEvent.VK_LEFT:
if (canMove(fallingShape,
move(fallingShape,
break;
case KeyEvent.VK_RIGHT:
if (canMove(fallingShape,
move(fallingShape,
break;
Line 79 ⟶ 85:
if (!fastDown) {
fastDown = true;
while (canMove(fallingShape,
move(fallingShape,
repaint();
}
Line 99 ⟶ 105:
fallingShapeRow = 1;
fallingShapeCol = 5;
fallingShape =
Shape[] shapes = Shape.values();
if (fallingShape != null)
fallingShape.reset();
Line 139 ⟶ 145:
try {
Thread.sleep(scoreboard.getSpeed());
} catch (InterruptedException
return;
}
if (!scoreboard.isGameOver()) {
if (canMove(fallingShape,
move(fallingShape,
} else {
shapeHasLanded();
Line 154 ⟶ 161:
void drawStartScreen(Graphics2D g) {
g.setFont(
g.setColor(
g.fill(
g.fill(
g.setColor(
g.drawString("Tetris",
g.setFont(
g.drawString("click to start",
}
void drawSquare(Graphics2D g, int colorIndex, int r, int c) {
g.setColor(
g.fillRect(leftMargin + c * blockSize, topMargin + r * blockSize,
blockSize, blockSize);
g.setStroke(
g.setColor(
g.drawRect(leftMargin + c * blockSize, topMargin + r * blockSize,
blockSize, blockSize);
Line 180 ⟶ 187:
void drawUI(Graphics2D g) {
// grid background
g.setColor(
g.fill(
// the blocks dropped in the grid
Line 193 ⟶ 200:
// the borders of grid and preview panel
g.setStroke(
g.setColor(
g.draw(
g.draw(
// scoreboard
int x =
int y =
g.setColor(
g.setFont(
g.drawString(format("hiscore %6d", scoreboard.getTopscore()), x, y);
g.drawString(format("level %6d", scoreboard.getLevel()), x, y + 30);
Line 209 ⟶ 216:
// preview
int
minX = min(minX, p[0]);
minY = min(minY, p[1]);
maxY = max(maxY, p[1]);
}
▲ for (int[] p : preSelectedShape.shape)
double cx = previewCenterX -
double cy = previewCenterY - ((minY + maxY + 1) / 2.0 * blockSize);
g.translate(
for (int[] p : nextShape.shape)
drawSquare(g, nextShape.ordinal(), p[1], p[0]);
g.translate(-cx, -cy);
}
Line 279 ⟶ 290:
}
void move(Shape s,
fallingShapeRow +=
fallingShapeCol +=
}
boolean canMove(Shape s,
for (int[] p : s.pos) {
int newCol = fallingShapeCol +
int newRow = fallingShapeRow +
if (grid[newRow][newCol] != EMPTY)
return false;
Line 348 ⟶ 359:
});
}
}</lang>
<lang java>package tetris;
class Scoreboard {
Line 455 ⟶ 468:
return score;
}
}</lang>
<lang java>package tetris;
enum Shape {
ZShape(new int[][]{{0, -1}, {0, 0}, {-1, 0}, {-1, 1}}),
SShape(new int[][]{{0, -1}, {0, 0}, {1, 0}, {1, 1}}),
TShape(new int[][]{{-1, 0}, {0, 0}, {1, 0}, {0, 1}}),
Square(new int[][]{{0, 0}, {1, 0}, {0, 1}, {1, 1}}),
Line 479 ⟶ 494:
final int[][] pos, shape;
}</lang>
<lang java>package tetris;
import java.awt.*;
final class Config {
final static Color[] colors = {Color.green, Color.red, Color.blue,
Color.pink, Color.orange, Color.cyan, Color.magenta};
▲ static {
▲ }
final static Font mainFont = new Font("Monospaced", Font.BOLD, 48);
Line 501 ⟶ 508:
final static Dimension dim = new Dimension(640, 640);
final static Rectangle clickRect = new Rectangle(50, 375, 252, 40);
final static int blockSize = 30;
Line 513 ⟶ 525:
final static int clickX = 120;
final static int clickY = 400;
final static int previewCenterX = 467;
final static
▲ final static Rectangle previewRect = new Rectangle(387, 47, 200, 200);
▲ final static Rectangle titleRect = new Rectangle(100, 85, 252, 100);
▲ final static Rectangle clickRect = new Rectangle(50, 375, 252, 40);
final static Stroke largeStroke = new BasicStroke(5);
|