content: import java.awt.*;
  import java.awt.event.*;
  
  import javax.swing.*;
  import javax.swing.Timer;
  
  
  
  public class Game extends JApplet // swing applet
  {
      /////// SCREENS
  
      boolean titleScreen = true; // implements the menu screen when true
      boolean gameBegin = false; // Begins the game screen when true
      boolean instruction = false; // Begins the game screen when true
  
      /////// IMAGE
  
      Dimension dim; // buffering
      Image offscreen; // buffering
      static Graphics bufferGraphics; // buffering
  
      static Image h1, h2; // Cursor image
      static Image bg, button1a, button1b, button2a, button2b; // image for menu screen (background, buttons)
      static Image instrbg; // instruction background
      static Image gamebg, m1, m1a, m1b; // image for game screen (background, monkey sprite)
      static Image[] mk = new Image [9]; // image variable for the 9 "moles"
  
      /////// MOUSE
  
      Cursor c; // cursor variable
      boolean myButtonPressed = false; // mouse button pressed (true or false)
      boolean myButtonEntered = false; // mouse enter the screen (true or false)
      int myMouseX = 0, myMouseY = 0; // mouse coordinates x and y from top left
      int myRow = -1, myCol = -1; // mouse coordinate outside of the screen
  
      /////// GAME VARIABLES
  
      private static final int[] mX = {5, 170, 335, 5, 170, 335, 5, 170, 335}; // "mole" (monkey) x coordinates on the game screen
      // grid format going from left to right & down the rows
      private static final int[] mY = {5, 5, 5, 170, 170, 170, 335, 335, 335}; // "mole" y coordinates on the game screen
      // grid format going from left to right & down the rows
      int randm; // randomizes which "mole" will activate
      int rand; // randomizes the time space between the mole activation/deactivation
  
      static boolean mup = false; // a "mole" is activated (true/false)
      static boolean[] mhit = {false, false, false, false, false, false, false, false, false}; // monkey (1 to nine in same grid format as above) hit
  
      private int[] respawnCounter = {0, 0, 0, 0, 0, 0, 0, 0, 0};
      private int[] removeCounter = {0, 0, 0, 0, 0, 0, 0, 0, 0};
  
      static int score = 0; // score counter
  
      /////// IPLEMENTING CLASSES
  
      GameScreen g1 = new GameScreen (); // instantiates the GameScreen Class
      Timer repaintM = null; // sets the repaint timer for monkey
  
      public void init ()  // instantiating variables
      {
          /////// Screen variables
          setSize (600, 500); // sets screensize to 600 by 500 pixels
  
          /////// Buffering variables
          dim = getSize (); // gets the dimension of the screen
          setBackground (Color.white); // sets the background of screen to white
          offscreen = createImage (dim.width, dim.height); // buffering method to the applet screen
          bufferGraphics = offscreen.getGraphics (); // new object for instantiating images on the paint()
  
          /////// Receiving images
          m1a = getImage (getCodeBase (), "m1a.gif"); // monkey up image
          m1b = getImage (getCodeBase (), "m1b.gif"); // monkey hit image
          m1 = getImage (getCodeBase (), "m1.gif"); // monkey none image
  
          h1 = getImage (getCodeBase (), "hammer.gif"); // hammer cursor
          h2 = getImage (getCodeBase (), "hammer2.gif"); // hammer hit cursor
          bg = getImage (getCodeBase (), "mainbg.gif"); // main menu background
          gamebg = getImage (getCodeBase (), "gbg.gif"); // game background
          instrbg = getImage (getCodeBase (), "instruction.gif"); // game background
  
          button1a = getImage (getCodeBase (), "button1a.gif"); // start button
          button1b = getImage (getCodeBase (), "button1b.gif"); // instruction button
          button2a = getImage (getCodeBase (), "button2a.gif"); // start pressed button
          button2b = getImage (getCodeBase (), "button2b.gif"); // instruction pressed button
  
          for (int x = 0 ; x < 9 ; x++) // loops 9 times for each monkey image array
          {
              mk [x] = m1; // monkey [x] is equal to "monkey none image"
          }
  
          /////// MOUSE
          Toolkit tk = Toolkit.getDefaultToolkit ();
          c = tk.createCustomCursor (tk.getImage (""), new Point (0, 0), "invisible"); // creates an invalid cursor thus appears like there is no cursor
          setCursor (c); // activates the cursor
  
          addMouseListener (new MyMouseListener ()); // adds mouse listener class which moniters the status of the mouse button
          addMouseMotionListener (new MyMouseMotionListener ());  // adds mouse motion listener class which moniters the movement of the mouse
  
      } // end init method
  
  
  
      /////////////////////////////////////
      /////// MOUSELISTENER CLASS /////////
      /////////////////////////////////////
  
      public class MyMouseListener implements MouseListener // Mouse Listener Class: "status of mouse button"
      {
          public void mousePressed (MouseEvent me)  // mouse pressed method
          {
              myButtonPressed = true; // mouse pressed becomes true (mouse pressed)
              myMouseX = me.getX (); // returns x coordinate of mouse
              myMouseY = me.getY (); // returns y coordinate of mouse
              handleMouseEvents (); // values are implemented into the handleMouseEvents ()
          }
  
          public void mouseReleased (MouseEvent me)  // mouse released method
          {
              myButtonPressed = false; // mouse pressed becomes false (mouse released)
              myMouseX = me.getX (); // returns x coordinate of mouse
              myMouseY = me.getY (); // returns y coordinate of mouse
              handleMouseEvents (); // values are implemented into the handleMouseEvents ()
          }
  
          public void mouseEntered (MouseEvent me)  // mouse entered method
          {
              myButtonEntered = true; // mouse enters the screen becomes true
              myMouseX = me.getX (); // returns x coordinate of mouse
              myMouseY = me.getY (); // returns y coordinate of mouse
              handleMouseEvents (); // values are implemented into the handleMouseEvents ()
          }
  
          public void mouseExited (MouseEvent me)  // mouse excited method
          {
              myButtonEntered = false; // mouse pressed becomes true
              myMouseX = me.getX (); // returns x coordinate of mouse
              myMouseY = me.getY (); // returns y coordinate of mouse
              handleMouseEvents (); // values are implemented into the handleMouseEvents ()
          }
  
          public void mouseClicked (MouseEvent me)  // mouse clicked method
          {
              // must access all the methods in an interface
          }
      } // end MyMouseListener class
  
  
      public class MyMouseMotionListener implements MouseMotionListener // Mouse Motion Listener class: "movement of mouse"
      {
          public void mouseMoved (MouseEvent me)  // mouse moved class
          {
              myMouseX = me.getX (); // returns x coordinate of mouse
              myMouseY = me.getY (); // returns y coordinate of mouse
              handleMouseEvents (); // values are implemented into the handleMouseEvents ()
          } // end mouseMoved method
  
          public void mouseDragged (MouseEvent me)  // mouse dragged class (pressed and moved simultaneously)
          {
              myMouseX = me.getX (); // returns x coordinate of mouse
              myMouseY = me.getY (); // returns y coordinate of mouse
              handleMouseEvents (); // values are implemented into the handleMouseEvents ()
          } // end mouseDragged method
      } // end MyMouseListener class
  
  
      public Image getMouseImage ()  // method that returns mouse image
      {
          if (myButtonPressed) // when mouse button is pressed
          {
              return h2; // cursor changes to hammer hit image
          }
          return h1; // cursor returns to original hammer image
      }
  
  
      public void handleMouseEvents ()  // the coordinates of the mouse on screen
      {
          int nCol = myMouseX - 50; // variable for x coordinate of mouse
          // variable is subtracted to place the x coordinate of the cursor in the center of the hammer image (size = 100 by 100)
          int nRow = myMouseY - 50; // variable for y coordinate of mouse
          // variable is subtracted to place the x coordinate of the cursor in the center of the hammer image (size = 100 by 100)
  
          if (!myButtonEntered) // if mouse has not entered the screen
              nCol = nRow = -1; // the coordinates of the mouse is out of bounds
          if (nCol != myCol || nRow != myRow) // if the mouse has entered the screen
          {
              myRow = nRow; // cursor x coordinate
              myCol = nCol; // cursor y coordinate
          }
          repaint (); // repaints the cursor as coordinates of the mouse moves
      } // end handleMouseEvents method
  
  
      public void mouse ()  // draws hammer cursor
      {
          if (myRow != -1 && myCol != -1) // if mouse is in the boundaries of the screen
          {
              Image mouseImage = getMouseImage (); // mouse image is rendered depending on the situation
              // see getMouseImage ()
              bufferGraphics.drawImage (mouseImage, myCol, myRow, 100, 100, null, this); // draws the cursor
          } // end if
      }
  
  
      public void paint (Graphics g)  // paint method - handles images
      {
          // buffering tool
          bufferGraphics.clearRect (0, 0, dim.width, dim.height);
  
          if (titleScreen == true) // if screen title is true
          {
              mainScreen (); // main screen appears
          }
          if (gameBegin == true) // if game begin is true
          {
              repaint ();
              game (); // game screen appears
          }
          if (instruction == true) // if game begin is true
          {
              instruction (); // game screen appears
          }
          mouse (); // mouse hammer cursor is repeatedly drawn
  
          // buffering tool
          g.drawImage (offscreen, 0, 0, this);
      } // end Paint method
  
  
      public void update (Graphics g)  // double buffering method
      {
          paint (g);
      }
  
  
      public void instruction ()
      {
          /////// IMAGE
          bufferGraphics.drawImage (instrbg, 0, 0, 600, 500, Color.red, this); // background
          if (myButtonPressed && myRow > (384 - 50) && myRow < (433 - 50)
                  && myCol > (427 - 50) && myCol < (586 - 50)) // if mouse button is pressed and hits start button coordinates
          {
              instruction = false; // instruction screen closes
              gameBegin = true; // game begins
          }
      }
  
  
      public void mainScreen ()  // main screen method
      {
          /////// IMAGE
          bufferGraphics.drawImage (bg, 0, 0, 600, 500, Color.red, this); // background
          bufferGraphics.drawImage (button1a, 427, 384, 159, 49, Color.red, this); // start button
          bufferGraphics.drawImage (button2a, 427, 440, 159, 49, Color.red, this); // instruction button
  
          if (myButtonPressed == true) // if mouse button is pressed
          {
              if (myRow > (384 - 50) && myRow < (433 - 50)
                      && myCol > (427 - 50) && myCol < (586 - 50)) // and hits start button coordinates
              {
                  titleScreen = false; // title screen closes
                  gameBegin = true; // game begins
              }
              else if (myRow > (340 - 50) && myRow < (489 - 50)
                      && myCol > (427 - 50) && myCol < (586 - 50)) // and hits instruction button coordinates
              {
                  titleScreen = false; // title screen closes
                  instruction = true;
              }
          }
      }
  
  
      public void game ()  // Game method
      {
          // new ReminderBeep (5);
  
          Monkey m = new Monkey (); // randomizing which monkey becomes activated
          m.randmonkey ();
  
          /////// IMAGE
          bufferGraphics.drawImage (gamebg, 0, 0, 600, 500, Color.red, this); // game background
          for (int i = 0 ; i < 9 ; i++) // 9 arrays of monkey image
          {
              bufferGraphics.drawImage (mk [i], mX [i], mY [i], 160, 160, Color.red, this);
              // draws the monkey arrays in order from left to right in grid format
          }
  
  
          bufferGraphics.setFont (new Font ("Arial", Font.BOLD, 20));
          bufferGraphics.drawString (String.valueOf (score), 560, 160); // score
      }
  
  
      class Monkey extends JApplet
      {
          public void monkeyhit ()  // monkey collision detector method
          {
              if (myButtonPressed == true) // if mouse button is pressed and...
              {
                  for (int hit = 0 ; hit < 9 ; hit++) // for 9 arrays of monkey image
                      if (mk [hit] == m1a && myRow > (mY [hit] - 50) && myRow < (mY [hit] + 160 - 50)
                              && myCol > (mX [hit] - 50) && myCol < (mX [hit] + 160 - 50))
                          // ... button is in the boundaries of monkey that is activated
                          {
                              mk [hit] = m1b; // monkey image changes to monkey hit image
                              mhit [hit] = false; // monkey that is hit is no longer activated
                              score += 10; // score counts up 10 pts.
                          }
              }
          }
  
  
          public void randmonkey ()  // randomizaing monkey activation method
          {
              repaintM = new Timer (2000, new RepaintAction (this)); // creates a new timer that will delay the repaint of the monkeys (2 seconds
              rand = ((int) (Math.random () * 100)) + 1000; // monkey activation delay in between
              randm = ((int) (Math.random () * 500)); // randomizes the number from 1 to 500 to determine which monkey becomes activated
              // 9 out of 500 chance of monkey appearing
  
              if (randm <= 8) // if random number is between 0 to 8
              {
                  for (int a = 0 ; a < 9 ; a++) // for 9 monkey arrays
                  {
                      if (randm == a) // if random number matches up with the corect monkey coordinates
                      {
                          mhit [randm] = true; // activates the monkey
                          mk [randm] = m1a; // monkey none image changes to monkey image
                      }
                      else if (randm != a) // if random number does not match up
                      {
                          mhit [a] = false; // monkey stays deactivated
                          mk [a] = m1; // monkey none stays monkey none
                      }
                  }
  
                  for (int i = 0 ; i < rand * 100 ; i++) // monkey is activated for a certain time of delay
                  {
                      monkeyhit (); // monkey hit method is activated for player to hit the "mole"
                      if (mhit [randm] = false) // when monkey deactivates (monkey is hit)
                      {
                          mk [randm] = m1; // monkey hit image is changed to money none image
                          break; // the loop discontinues
                      }
                  }
              }
          }
      }
  
  
      class RepaintAction implements ActionListener // Repaint method
      {
          Monkey randmonkey;
  
          public RepaintAction (Monkey randmonkey)
          {
              this.randmonkey = randmonkey; // random monkey is equal to random monkey here
          }
  
  
          public void actionPerformed (ActionEvent e)
          {
              randmonkey.repaint (); // repaints randmonkey method
          }
      }
  }
  