import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Tetris extends JComponent implements Runnable, KeyListener { private static final int SCORE_WIDTH = 100; private Piece piece, nextPiece; private boolean gameOver; private Score score; public Tetris() { Board.reset(); gameOver = false; piece = new Piece(); piece.putInPlay(); nextPiece = new Piece(); score = new Score(); new Thread(this).start(); } public Dimension getPreferredSize() { return new Dimension(Board.getWidth() + SCORE_WIDTH, Board.getHeight()); } public void keyPressed(KeyEvent e) { if (gameOver) return; int keyCode = e.getKeyCode(); //move the Piece one position left if (keyCode == e.VK_LEFT) piece.left(); //move the Piece one position right else if (keyCode == e.VK_RIGHT) piece.right(); //drop the Piece until it lands and check to see if //lines need to be removed else if (keyCode == e.VK_DOWN || keyCode == e.VK_SPACE) { piece.drop(); Board.place(piece); score.update(Board.coalesce()); piece = nextPiece; piece.putInPlay(); nextPiece = new Piece(); } //rotate the Piece clockwise else if (keyCode == e.VK_UP) piece.rotate(); else return; repaint(); } public void paintComponent(Graphics g) { super.paintComponent(g); final int HGAP = 5, VGAP = 20; final int NUM_SCORE_LINES = 3; Board.draw(g); piece.draw(g); g.setColor(Color.WHITE); g.fillRect(Board.getWidth(), 0, getWidth(), Board.getHeight()); nextPiece.draw(g); g.setColor(Color.BLACK); int x = Board.getWidth() + HGAP; int y = (Board.getHeight() - NUM_SCORE_LINES * VGAP) / 2; g.drawString("Level: " + score.getLevel(), x, y); g.drawString("Lines: " + score.getLines(), x, y += VGAP); g.drawString("Points: " + score.getPoints(), x, y += VGAP); if (gameOver) { g.setColor(Color.RED); g.drawString("Game Over", x, y + VGAP); } } public void run() { try { while (!gameOver) { if (piece.inFreeFall()) piece.down(); else { Board.place(piece); score.update(Board.coalesce()); piece = nextPiece; piece.putInPlay(); nextPiece = new Piece(); gameOver = piece.gameOver(); } Thread.sleep(500 - 30 * score.getLevel()); repaint(); } } catch(InterruptedException e) {} } public void keyTyped(KeyEvent e){} public void keyReleased(KeyEvent e){} public static void main(String[] argv) { JFrame fr = new JFrame("Tetris"); Tetris game = new Tetris(); Dimension size = game.getPreferredSize(); fr.setSize(size.width, size.height + 40); fr.getContentPane().add(game); fr.addKeyListener(game); fr.setVisible(true); } }