www.SuperMaze.com Simple Java Puzzle Applet

import java.applet.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;

public class Puzzle extends Applet
     {
     static Label stat;
     static Panel controlPanel;
     static Button easy,medium,hard;
     static Panel buttonBar;
     static cmdButton[][] ca = new cmdButton[4][4];
     static Random rand = new Random();     
     static int difficulty = 0;

     static void toggle(int x,int y)
          {
          if( difficulty >= 2 )
               {// wrap button effects
               ca[y & 0x3][x & 0x3].tog();
               }
          else {// no wrap
               if( 0 <= x && x <= 3 && 0 <= y && y <= 3 )
                    ca[y][x].tog();
               }
          }     

     static void checkwin()
          {
          boolean win = true;
          for(int y = 0; y < 4; y++)
               for(int x = 0; x < 4; x++)
                    {
                    if( ca[y][x].isRed )
                         {
                         win = false;
                         break;
                         }
                    }
          if( win )
               switch( rand.nextInt() & 0x3 )
                    {
               case 0:  stat.setText("Wow!"); break;
               case 1:  stat.setText("You win!"); break;
               case 2:  stat.setText("Woo hoo!"); break;
               case 3:  stat.setText("Yowza!"); break;
                    }
          }

     class cmdButton extends Button implements ActionListener
          {
          char op;
          int x,y;
          boolean isRed;
          cmdButton(int px, int py)
               {
               x = px;
               y = py;
               this.addActionListener(this);
               isRed = false;
               setBackground(Color.green);
               }

          public void setLabel(String label)
               {
               super.setLabel(label);
               op = label.charAt(0);
               }

          public void setGreen()
               {
               isRed = false;
               setBackground(Color.green);
               }

          public void tog()
               {
               isRed = !isRed; 
               if( isRed )
                    setBackground(Color.red);
               else setBackground(Color.green);
               }

          // puzzle button pushed
          public void actionPerformed(ActionEvent e)
               {
               switch( op )
                    {
               default:
                    break;
               case '+':
                    toggle(x,y);     
                    toggle(x+1,y);     
                    toggle(x-1,y);     
                    toggle(x,y+1);     
                    toggle(x,y-1);     
                    break;

               case '|':
                    toggle(x,y);     
                    toggle(x,y+1);     
                    toggle(x,y-1);     
                    break;

               case 'x':
                    toggle(x,y);     
                    toggle(x-1,y-1);     
                    toggle(x+1,y-1);     
                    toggle(x-1,y+1);     
                    toggle(x+1,y+1);     
                    break;

               case '-':
                    toggle(x,y);     
                    toggle(x+1,y);     
                    toggle(x-1,y);     
                    break;
                    }
               if( e != null )
                    checkwin();
               }
          }

     public void init() 
          {
          easy = new Button("Easy");
          easy.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e)
                    { difficulty = 0; start(); }
               });
          medium = new Button("Medium");
          medium.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e)
                    { difficulty = 1; start(); }
               });
          hard = new Button("Hard");
          hard.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e)
                    { difficulty = 2; start(); }
               });

          buttonBar = new Panel();
          buttonBar.setLayout( new GridLayout(1,3) );
          buttonBar.add(easy);
          buttonBar.add(medium);
          buttonBar.add(hard);

          controlPanel = new Panel();
          controlPanel.setLayout( new GridLayout(4,4) );
          
          for(int y = 0; y < 4; y++)
               for(int x = 0; x < 4; x++)
                    controlPanel.add(ca[y][x] = new cmdButton(x,y));          

          setLayout(new BorderLayout());
          add(controlPanel);
          add("North",buttonBar);
          add("South",stat = new Label());
          }

     public void start()
          {
          stat.setText("Make all buttons green.");
          // randomize button labels
          for(int y = 0; y < 4; y++)
               for(int x = 0; x < 4; x++)
                    {
                    switch( rand.nextInt() & 0x3 )
                         {
                    default: ca[y][x].setLabel("+"); break;
                    case  1: ca[y][x].setLabel("-"); break;
                    case  2: ca[y][x].setLabel("|"); break;
                    case  3: ca[y][x].setLabel("x"); break;
                         }
                    ca[y][x].setGreen();
                    }

          // push some buttons to mix it up
          int pushes = difficulty==0 ? 3 : 8;
          for(int i = 0; i < pushes; i++)
               {
               int x = rand.nextInt() & 0x3;
               int y = rand.nextInt() & 0x3;
               ca[y][x].actionPerformed(null);
               }          
          }
     }