/* * Tetris by Eric Idema - idemaeri@cps.msu.edu * * This code is for educational purposes only. */ import java.awt.*; import java.applet.*; import Shape; public class Tetris extends Applet implements Runnable { Color[][] alley; Shape shape, nextShape; Thread engine; Image buffer, alley_buffer, //used in double buffering bground, title; //snazzy background and title MediaTracker tracker; boolean gameStarted, gameOver, update_alley = true; //used in double buffering int level = 0, points = 0, lines = 0; public void init() { gameStarted = false; gameOver = false; tracker = new MediaTracker( this ); //get the images bground = getImage( getCodeBase(), "bground.gif" ); title = getImage( getCodeBase(), "title.gif" ); tracker.addImage( bground, 0 ); tracker.addImage( title, 0 ); buffer = createImage( 250, 300 ); //create buffer images alley_buffer = createImage( 250, 300 ); alley = new Color[10][20]; engine = new Thread( this ); //wait for all the images to load in before starting try{ tracker.waitForAll(); } catch( Exception e ) {} } public void gameStart() { gameOver = false; for( int i = 0; i < 10; i++ ) { //set the alley to Color.white for( int j = 0; j < 20; j++ ) { //this never gets painted, but alley[i][j] = Color.white; //is used to signal and unoccupied } } update_alley = true; shape = new Shape(); nextShape = new Shape(); repaint(); if( !gameStarted ) { gameStarted = true; engine.start(); } else engine.resume(); } public void stop() { engine.suspend(); } public boolean mouseDown( Event evt, int x, int y ) { if( !gameStarted || gameOver ) { points = lines = level = 0; gameStart(); return true; } return false; } public boolean keyDown( Event evt, int keyCode ) { if( gameOver ) return true; if( keyCode == Event.LEFT || keyCode == 'j' ) { shape.moveLeft( alley ); repaint(); return true; } if( keyCode == Event.RIGHT || keyCode == 'l' ) { shape.moveRight( alley ); repaint(); return true; } if( keyCode == Event.DOWN || keyCode == 'k' ) { while( !shape.isFrozen( alley ) ) shape.drop(); shape.frozen( alley ); checkForLine(); points += 5; update_alley = true; shape = nextShape; nextShape = new Shape(); repaint(); return true; } else if( keyCode == Event.UP || keyCode == 'i' ) { shape.rotate( alley ); repaint(); return true; } return false; } public void update( Graphics g ) { Graphics backgraphics = buffer.getGraphics(); Graphics alleygraphics = alley_buffer.getGraphics(); if( update_alley ) { paint_alley( alleygraphics ); update_alley = false; } paint( backgraphics ); g.drawImage( buffer, 0, 0, this ); } public void paint_alley( Graphics g ) { g.drawImage( bground, 0, 0, this ); for( int i = 0; i < 10; i++ ) { for( int j = 0; j < 20; j++ ) { if( alley[i][j] != Color.white ) { g.setColor( alley[i][j] ); g.fillRect( i*15, j*15, 15, 15 ); g.setColor( Color.white ); g.drawRect( i*15, j*15, 15, 15 ); g.drawLine( i*15, j*15, i*15+15, j*15+15 ); g.drawLine( i*15+15, j*15, i*15, j*15+15 ); } } } } public void paint( Graphics g ) { if( !gameStarted ) { g.drawImage( title, 0, 0, this ); return; } if( gameOver ) { g.drawImage( bground, 0, 0, this ); g.setColor( Color.red ); g.drawString( "Game Over", 40, 150 ); // g.drawString( "Click Here", 38, 160 ); return; } g.drawImage( alley_buffer, 0, 0, this ); shape.paint( g ); g.setColor( Color.white ); g.fillRect( 150, 0, 100, 300 ); g.setColor( Color.black ); g.drawLine( 150, 0, 150, 300 ); // g.drawLine( 0, 0, 150, 0 ); nextShape.paintNext( g ); g.setColor( Color.black ); g.drawString( "Level: " + level, 155, 90 ); g.drawString( "Lines: " + lines, 155, 110 ); g.drawString( "Points: " + points, 155, 130 ); } public void run() { if( shape.isFrozen( alley ) ) { shape.frozen( alley ); points += 5; checkForLine(); shape = nextShape; nextShape = new Shape(); update_alley = true; if( gameOver = shape.checkGameOver( alley ) ) { repaint(); stop(); } } else { shape.drop(); } repaint(); try { engine.sleep( 500 - 30*level ); } catch( Exception e ) {} run(); } public void checkForLine() { boolean remove; int lines_removed = 0; for( int j = 0; j < 20; j++ ) { remove = true; for( int i = 0; i < 10 && remove; i++ ) { if( alley[i][j] == Color.white ) remove = false; } if( remove ) { for( int i = j; i > 0; i-- ) { for( int p = 0; p < 10; p++ ) { alley[p][i] = alley[p][i-1]; } } lines_removed++; } } lines += lines_removed; switch( lines_removed ) { case 1: points += 100; break; case 2: points += 300; break; case 3: points += 800; break; case 4: points += 1500; break; } level = lines / 10; } }