advertisement
javaboutique
Search Tips
Articles  |   Tutorials  |   Reviews  |   Tools  |   by Category  |   by Date  |   by Name  |   Submit  |   Source  |   Forums  |  
javaboutique
Browse DevX


Partners & Affiliates











advertisement


Jatris


Java Source:

// Java Tetris
// Created on a boring sunday.....
//
// (c)2001 by Brian Postma
// e-mail: B.Postma@HetNet.nl
// homepage: http://www.homepages.hetnet.nl/~brianpostma
//

import java.awt.*;
import java.applet.Applet;

public class jatris extends Applet implements Runnable
{
  Dimension	d;
  Font 		largefont = new Font("Helvetica", Font.BOLD, 28);
  Font		smallfont = new Font("Helvetica", Font.BOLD, 10);

  Color		textcolor1= new Color(96,128,255);
  Color		textcolor2= new Color(255,160,64);

  FontMetrics	fmsmall, fmlarge;  
  Graphics	goff;
  Image		ii;
  Thread	thethread;

  boolean	ingame=false;

  final short	xblocks=10;
  final short   yblocks=20;
  final int	blocksize=16;
  final int	width=xblocks*blocksize;
  final int	height=yblocks*blocksize;

  short[][]	screendata;

  final short	maxcolors=6;
  Color[]	blocks;

  final int	barwidth=8;
  final Color	barcolor=new Color(128,255,64);
  final Color   background=new Color(0,0,0);

  int		score;
  short		emptyline;

  int		objectx, objecty;
  int		objectdx;

  short		objecttype;
  short		objectcolor;
  int		objectrotation;
  int		objectrotationd=0;
  short		objectptr;
  short		checkptr;

  final short	itemcount=7;
  final short   itemrotlen=8;
  final short	itemlen=itemrotlen*4;

  short 	count;
  final short	maxcount=5;
  short		curcount;
  boolean	fast=false;

  final	short	screendelay=40;
  short		screencount=40;
  boolean	showtitle=true;

  int           items[]={
                          0,0,   -1,0,  0,-1, -1,-1,     // cube, normal
                          0,0,   -1,0,  0,1,  -1,1,      // rotated 90 degrees
			  0,0,   1,0,   0,1,   1,1,      // rotated 180 degrees
                          0,0,   1,0,   0,-1,  1,-1,     // rotated 270 degrees

                          0,0,   0,-1,  0,-2, 0,-3,      // straight line
                          0,0,  -1,0,  -2,0, -3,0,
                          0,0,   0,1,   0,2,  0,3, 
                          0,0,   1,0,   2,0,  3,0,

			  0,0,   1,0,   0,-1, -1,-1,     // stupid block
                          0,0,   0,-1,  -1,0, -1, 1,
			  0,0,  -1,0,   0,1,  1,1,
                          0,0,   0,1,   1,0,  1,-1,

                          0,0,   -1,0,  0,-1,  1,-1,     // stupid block 2
			  0,0,   0,1,   -1,0,  -1,-1,
			  0,0,   1,0,   0,1,   -1,1,
			  0,0,   0,-1,  1,0,   1,1,

			  0,0,   1,0,   -1,0,  0,-1,     // another one
                          0,0,   0,1,   0,-1,  -1,0,
			  0,0,   0,1,   -1,0,  1,0,
			  0,0,   1,0,   0,-1,  0,1,

			  0,0,   0,-1,  1,-1,  0,1,	// hook one
			  0,0,   -1,0,  -1,-1, 1,0,
			  0,0,   -1,1,  0,1,   0,-1,
			  0,0,   -1,0,  1,0,   1,1,

			  0,0,   0,1,  0,-1,  -1,-1,	// hook two
			  0,0,   1,0, -1,0,   -1,1,
			  0,0,   0,-1,  0,1,  1,1,
			  0,0,   -1,0, 1,0,   1,-1
                        };

  int           checks[]={ 
                           -1,1, 0,1, -1,1,  0,1,        // check cube, normal
                           -1,2, 0,2, -1,2,  0,2,        // check, rotated 90 degrees
			   0,2,  1,2,  0,2,  1,2,        // check, rotated 180 degrees
                           0,1,  1,1,  0,1,  1,1,        // check, rotated 270 degrees

                           0,1,  0,1,  0,1,  0,1,
                           0,1, -1,1, -2,1, -3,1,
                           0,4,  0,4,  0,4,  0,4,        // straight line
                           0,1,  1,1,  2,1,  3,1,
 
			   0,1,  -1,0, 1,1,  0,1,	// stupid block one
			   0,1,  -1,2, 0,1, -1,2,
			   0,2,  1,2,  -1,2, 0,2,
			   0,2,  1,1,  0,2,  1,1,

			   -1,1,  0,1, 1,0,  1,0,	// stupid block two
			   -1,1,  0,2, 0,2,  -1,1,
			   -1,2,  0,2, 1,1,  1,1,
			   0,1,   1,2,  0,1,  1,2,

			   -1,1,  0,1,  1,1, 1,1,	// block three
			   -1,1,  0,2,  0,2, -1,1,
			   -1,1,  0,2,  1,1, 1,1,
			   0,2,   1,1,  0,2, 1,1,

			   0,2,   1,0,  1,0, 0,2,	// hook one
			   -1,1,  0,1,  1,1, 1,1,
			   -1,2,  0,2,  0,2, -1,2,
			   -1,1,  0,1,  1,2, 1,2,

			   -1,0,  0,2,  0,2, -1,0,	// hook two
			   -1,2,  0,1,  1,1,  1,1,
			   0,2,   1,2,  1,2,  0,2,
			   -1,1,  0,1,  1,1,  1,1
                         };

  public String getAppletInfo()
  {
    return("Jatris - by Brian Postma");
  }

  public void init()
  {
    short i;

    screendata=new short[xblocks][yblocks];
    blocks=new Color[maxcolors+1];
    blocks[0]=background;
    blocks[1]=new Color(255,0,0);
    blocks[2]=new Color(0,255,0);
    blocks[3]=new Color(0,0,255);
    blocks[4]=new Color(255,255,0);
    blocks[5]=new Color(255,0,255);
    blocks[6]=new Color(0,255,255);

    Graphics g;
    resize(width+2*barwidth,height+30);
    d = size();
    setBackground(background);
    g=getGraphics();
    g.setFont(smallfont);
    fmsmall = g.getFontMetrics();
    g.setFont(largefont);
    fmlarge = g.getFontMetrics();
    gameInit();
  }


  public void gameInit()
  {
    short i,j;

    for (i=0; i<xblocks; i++)
    {
      for (j=0; j<yblocks; j++)
      {
        screendata[i][j]=0;
      }
    }

    score=0;
    emptyline=-1;

    newObject();
    fast=false;
    curcount=maxcount;
  }


  public void newObject()
  {
    short i;
    int   y;

    objectx=xblocks/2-1;
    objectdx=0;
    objecty=0;
    objecttype=(short)(Math.random()*itemcount);
    if (objecttype>=itemcount)
      objecttype=itemcount-1;

    objectptr=(short)(objecttype*itemlen);
    checkptr=(short)(objecttype*itemlen);

    objectcolor=(short)(Math.random()*maxcolors+1);
    if (objectcolor>maxcolors)
      objectcolor=maxcolors;
    objectrotation=0;
    count=maxcount;

    // check if game has ended
    for (i=0; i<4; i++)
    {
      y=items[objectptr+i*2+1];
      if (y>=0 && screendata[objectx+items[objectptr+i*2]][y]!=0)
      {
        ingame=false;
        showtitle=true;
      }
    }
  }


  public boolean keyDown(Event e, int key)
  {
    if (ingame)
    {
      if (key == Event.LEFT)
      {
        objectdx=-1;
      }
      else if (key == Event.RIGHT)
      {
        objectdx=1;
      }
      else if (key == Event.UP)
      {
        objectrotationd=1;
      }
      else if (key == Event.DOWN)
      {
        fast=true;
      }
      else if (key == Event.ESCAPE)
      {
        ingame=false;
      }
    }
    else
    {
      if (key == 's' || key == 'S')
      {
        ingame=true;
        gameInit();
      }
    }
    return true;
  }


  public boolean keyUp(Event e, int key)
  {
    if (key == Event.DOWN)
    {
      fast=false;
    }
    return true;
  }


  public void paint(Graphics g)
  {
    Graphics gg;

    if (goff==null && d.width>0 && d.height>0)
    {
      ii = createImage(d.width, d.height);
      goff = ii.getGraphics();
    }
    if (goff==null || ii==null)
      return;

    goff.setColor(background);
    goff.fillRect(0, 0, d.width, d.height);

    if (ingame)
      playGame();
    else
      showIntro();
    showScore();

    g.drawImage(ii, 0, 0, this);
  }


  public void playGame()
  {
    boolean bottomreached=false;
    boolean stillscrolling=false;

    if (emptyline<0)
    {
      bottomreached=drawObject();
    }
    else
    {
      scrollDown();
      stillscrolling=true;
    }
    drawBars();
    drawBlocks();
    if (stillscrolling || bottomreached)
    {
      checkFull();
    }
  }


  public void showIntro()
  {
    String s;
 
    drawBars();
    drawBlocks();


    if (showtitle)
    {
      goff.setFont(largefont);
      s="JATRIS";
      goff.setColor(textcolor1);
      goff.drawString(s,barwidth+(width-fmlarge.stringWidth(s)) / 2 -2, height/2 - 22);
      goff.setColor(Color.white);
      goff.drawString(s,barwidth+(width-fmlarge.stringWidth(s)) / 2, height/2 - 20);

      goff.setFont(smallfont);
      s="(c)2001 by Brian Postma";
      goff.setColor(textcolor2);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2 -1,height/2 + 9);
      goff.setColor(Color.white);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2 + 10);

      s="b.postma@hetnet.nl";
      goff.setColor(textcolor2);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2 -1,height/2 + 29);
      goff.setColor(Color.white);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2 + 30);
    }
    else
    {
      goff.setFont(smallfont);
      s="'S' to start game";
      goff.setColor(textcolor1);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2 -1,height/2 - 31);
      goff.setColor(Color.white);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2 - 30);

      s="Use cursor left+right to move";
      goff.setColor(textcolor2);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2 -1,height/2 - 11);
      goff.setColor(Color.white);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2 - 10);

      s="Use cursor up to rotate";
      goff.setColor(textcolor2);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2 -1,height/2 + 9);
      goff.setColor(Color.white);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2 + 10);

      s="Use cursor down to drop";
      goff.setColor(textcolor2);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2 -1,height/2 + 29);
      goff.setColor(Color.white);
      goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2 + 30);
    }
    screencount--;
    if (screencount<=0)
    { screencount=screendelay; showtitle=!showtitle; }
  }


  public void drawBars()
  {
    goff.setColor(barcolor);
    goff.fillRect(0,0,barwidth,blocksize*yblocks);
    goff.fillRect(barwidth+blocksize*xblocks,0,barwidth,blocksize*yblocks);
    goff.fillRect(0,blocksize*yblocks,xblocks*blocksize+2*barwidth,barwidth);
  }


  public boolean drawObject()
  {
    short	i;
    boolean	bottomreached=false;
    int		x,y,checkx,checky;

    // clear old
    for (i=0; i<4; i++)
    {
      x=objectx+items[objectptr+i*2+objectrotation*itemrotlen];
      y=objecty+items[objectptr+i*2+objectrotation*itemrotlen+1];
      checkx=objectx+checks[objectptr+i*2+objectrotation*itemrotlen];
      checky=objecty+checks[objectptr+i*2+objectrotation*itemrotlen+1];
      if (y>=0)
        screendata[x][y]=0;
      if (screendata[checkx][checky]!=0)
        bottomreached=true;

    }

    if (!bottomreached)
    {
      count--;
      if (count<=0 || fast)
      {
        objecty++;
        count=curcount;
      }
      checkRotation();
      objectdx=0;
      objectrotationd=0;
    }

    // draw new
    for (i=0; i<4; i++)
    {
      x=objectx+items[objectptr+i*2+objectrotation*itemrotlen];
      y=objecty+items[objectptr+i*2+objectrotation*itemrotlen+1];

      if (y>=0)
        screendata[x][y]=objectcolor;
      if (y>=(yblocks-1))
        bottomreached=true;
    }
    if (bottomreached)
    {
      score++;
      newObject();
    }
    return bottomreached;
  }


  public void checkRotation()
  {
    int		dummyx;
    int		dummyrot;
    int		x,y;
    short	i;
    boolean	cando=true;

    dummyrot=(objectrotation+objectrotationd)%4;
    dummyx=objectx+objectdx;

    // make sure the part doesn't rotate of the playscreen
    for (i=0; i<4; i++)
    {
      x=dummyx+items[objectptr+i*2+dummyrot*itemrotlen];
      if (x>=xblocks)
        dummyx-=(x-xblocks+1);
      else if (x<0)
        dummyx-=x;
    }

    for (i=0; (i<4 && cando); i++)
    {
      x=dummyx+items[objectptr+i*2+dummyrot*itemrotlen];
      y=objecty+items[objectptr+i*2+dummyrot*itemrotlen+1];
      if (y>=0)
        cando=cando&&(screendata[x][y]==0);
      if (y>=yblocks || x<0 || x>=xblocks)
        cando=false;
    }
    if (cando)
    {
      objectrotation=dummyrot;
      objectx=dummyx;
    }
  }


  public void drawBlocks()
  {
    short x,y;

    for (x=0; x<xblocks; x++)
    {
      for (y=0; y<yblocks; y++)
      {
        goff.setColor(blocks[screendata[x][y]]);
        goff.drawRect(x*blocksize+barwidth,y*blocksize,blocksize-1,blocksize-1);
        goff.fillRect(x*blocksize+barwidth+3,y*blocksize+3,blocksize-6,blocksize-6);
      }
    }
  }


  public void checkFull()
  {
    short	x,y;
    boolean	found=false;

    for (y=yblocks-1; ( y>=0 && !found); y--)
    {
      found=true;
      for (x=0; x<xblocks; x++)
      {
        if (screendata[x][y]==0)
          found=false;
      }
      if (found)
      {
        score+=10;

	// increase speed when you've got a lot of points
        if (score>800)
          curcount=1;
        else if (score>600)
          curcount=2;
        else if (score>400)
          curcount=3;
        else if (score>200)
          curcount=4;

        for (x=0; x<xblocks; x++)
        {
          screendata[x][y]=0;
        }
        emptyline=y;
      }
    }
  }


  public void scrollDown()
  {
    short x,y;

    for (y=emptyline; y>0; y--)
    {
      for (x=0; x<xblocks; x++)
      {
        screendata[x][y]=screendata[x][y-1];
      }
    }
    for (x=0; x<xblocks; x++)
    {
      screendata[x][0]=0;
    }
    emptyline=-1;
  }


  public void showScore()
  {
    String s;
    goff.setFont(smallfont);
    goff.setColor(Color.white);

    s="Score: "+score;
    goff.drawString(s,width/2-40,(yblocks+1)*blocksize+10);
  }


  public void run()
  {
    long  starttime;
    Graphics g;

    Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    g=getGraphics();

    while(true)
    {
      starttime=System.currentTimeMillis();
      try
      {
        paint(g);
        starttime += 60;
        Thread.sleep(Math.max(0, starttime-System.currentTimeMillis()));
      }
      catch (InterruptedException e)
      {
        break;
      }
    }
  }


  public void start()
  {
    if (thethread == null) {
      thethread = new Thread(this);
      thethread.start();
    }
  }


  public void stop()
  {
    if (thethread != null) {
      thethread.stop();
      thethread = null;
    }
  }
}

Back to Jatris

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.

 Microsoft RIA Development Center
 IBM Rational Resource Center
 Destination .NET
XML error: not well-formed (invalid token) at line 33
advertisement
Receive Articles via our XML/RSS feed
Receive Articles via our XML/RSS feed

JavaBytes
Internet Cyclone
This powerful, easy-to-use, internet optimizer is for Windows 95, 98, ME, NT, 2000 and XP. It's designed to automatically optimize your Windows settings, boosting your Internet connection up to 200%.

Free VMware Server 2.0 Now Release Candidate
Linux Player Xandros Grabs Storied Rival Linspire
Hey Enterprise: Here Comes the 3G iPhone
MySpace Opens Profile Portability API
Microsoft Jumps Into Virtualization Fray
Eclipse Ganymede Makes It Easier for Devs
Open Source Nokia a Threat to Microsoft, Google?
Salesforce, Google Head for 2nd on Apps
HP Open Sources Unix File System for Linux
Red Hat Opens Its Network to Space

Build a Generic Histogram Generator for SQL Server
Beyond XML and JSON: YAML for Java Developers
Mastering the Windows Mobile Emulators
Avaya AE Services Provide Rapid Telephony Integration with Facebook
Featured Algorithm: Intel Threading Building Blocks: parallel_reduce
Getting Started with Windows Live Admin Center
Eight Key Practices for ASP.NET Deployment
Java ME User Interfaces: Do It with LWUIT!
Talking VPro: Transcript
Bringing Semantic Technology to the Enterprise

Advertising Info  |   Member Services  |   Contact Us  |   Help  |   Feedback  |   Site Map  |   Network Map  |   About



JupiterOnlineMedia

internet.comearthweb.comDevx.commediabistro.comGraphics.com

Search:

Jupitermedia Corporation has two divisions: Jupiterimages and JupiterOnlineMedia

Jupitermedia Corporate Info


Legal Notices, Licensing, Reprints, & Permissions, Privacy Policy.

Advertise | Newsletters | Tech Jobs | Shopping | E-mail Offers

Solutions
Whitepapers and eBooks
IBM eBook: Planning a Service Oriented Architecture
IBM eBook: Choosing the Right Architecture--What It Means for You and Your Business
Microsoft Article: Will Hyper-V Make VMware This Decade's Netscape?
Avaya Article: Using Intelligent Presence to Create Smarter Business Applications
Intel Go Parallel Article: Getting Started with TBB on Windows
Microsoft Article: 7.0, Microsoft's Lucky Version?
Avaya Article: How to Feed Data into the Avaya Event Processor
IBM Article: Developing a Software Policy for Your Organization
Microsoft Article: Managing Virtual Machines with Microsoft System Center
Intel Go Parallel Article: Intel Threading Tools and OpenMP
HP eBook: Storage Networking , Part 1
Microsoft Article: Solving Data Center Complexity with Microsoft System Center Configuration Manager 2007
MORE WHITEPAPERS, EBOOKS, AND ARTICLES
Webcasts
HP Video: StorageWorks EVA4400 and Oracle
HP Webcast: Storage Is Changing Fast - Be Ready or Be Left Behind
Microsoft Silverlight Video: Creating Fading Controls with Expression Design and Expression Blend 2
MORE WEBCASTS, PODCASTS, AND VIDEOS
Downloads and eKits
Red Gate Download: SQL Toolbelt and free High-Performance SQL Code eBook
Iron Speed Designer Application Generator
MORE DOWNLOADS, EKITS, AND FREE TRIALS
Tutorials and Demos
Silverlight 2 App and Walkthrough: Leverage Silverlight 2 with SQL Server and XML
IBM Article: Enterprise Search--Do You Know What's Out There?
HP Demo: StorageWorks EVA4400
Microsoft Article: The Progress and Promise of Deep Zoom
Microsoft How-to Article: Get Going with Silverlight and Windows Live
MORE TUTORIALS, DEMOS AND STEP-BY-STEP GUIDES