Thread - Hare and Tortoise Program

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Buckaroo Banzai
    New Member
    • Mar 2007
    • 5

    #1

    Thread - Hare and Tortoise Program

    Hello, newbie here...

    I'm writing this program but when I click the start button which should initiate either the Hare or the Tortoise, it does not, this is the first time I use threads, so the problem might be the way I'm passing the value.

    can someone please take a look at this code and maybe give me some guidance on what I'm doing wrong.

    Please note there are 3 separate files with the corresponding classes, I separated it with ===>
    Thank You
    JC
    Code:
    package turtoiseandhare;
     
    import java.awt.*;
    import java.*;
    import javax.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.accessibility.*;
    import java.util.*;
    import java.awt.event.*;
     
    public class TurtoiseAndHare extends JFrame
    {
        private ImageIcon hare;
        private ImageIcon tortoise;
     
        private ImageIcon start;
        private ImageIcon finish;
        int turtle_x = 0;
        int turtle_y = 159;
        int hare_x = 0;
        int hare_y = 35;
        int ha_w;
        int ha_h;
        int to_w;
        int to_h;
        float fastplod;
        float slip;
        float slowplod;
     
        float sleep;
        float bighop;
        float bigslip;
        float smallhop;
        float smallslip;
     
        Display p;
        Move mo;
        TnHThread tornhare;
        Button StartB;
        Button Stop;
        String message = "Who will win this amazing race!";
     
        public TurtoiseAndHare()
        {
            setTitle ("Tortoise and the Hare race!");
            setSize(1000, 405);
            mo = new Move(this);
     
            Container contentPane = this.getContentPane();
            getContentPane().setLayout(new BorderLayout());
     
            p = new Display();
     
            
            JPanel q = new JPanel();
            q.setBorder(BorderFactory.createLineBorder(Color.BLUE));
            StartB = new Button("  Start  ");
            q.add(StartB);
     
            JPanel m = new JPanel();
            m.setBorder(BorderFactory.createLineBorder(Color.BLUE));
            m.setBackground(Color.getHSBColor(25,55,45));
            JLabel msg = new JLabel(message);
            m.add(msg);
     
            hare = new ImageIcon(getClass().getResource("hare.jpg"));
            tortoise = new ImageIcon(getClass().getResource("Turtle.jpg"));
            start = new ImageIcon(getClass().getResource("start.jpg"));
            finish = new ImageIcon(getClass().getResource("finish.jpg"));
     
            contentPane.add(p, BorderLayout.CENTER);
            contentPane.add(q, BorderLayout.SOUTH);
            contentPane.add(m, BorderLayout.NORTH);
     
            Handler handler = new Handler();
            StartB.addActionListener(handler);
        }
        class Display extends Canvas
        {
            public void paint(Graphics  g)
            {
                ha_w = hare.getIconWidth();
                ha_h = hare.getIconHeight();
                to_w = tortoise.getIconWidth();
                to_h = tortoise.getIconHeight();
     
               // super.paint(g);
               for (int i = 0; i < 780; i++)
               {
                   tortoise.paintIcon(p, g, i+5, turtle_y);
      
               };
                tortoise.paintIcon(p, g, turtle_x, turtle_y);
                hare.paintIcon(p, g, hare_x, hare_y);
                start.paintIcon(p, g, 125, 0);
                finish.paintIcon(p, g, 850, 0);
     
                g.drawString(message,170,55);
            }
        } //end of Display
        public void raicing(int animal, int x, int y)
        {
            if (animal == 1)
            {
                hare_x = x;
                hare_y = y;
                message = "the hare is at position " + hare_x;
            }
            if (animal == 2)
            {
                turtle_x = x;
                turtle_y = y;
                message = "The Turtoise is at position " + turtle_x;
            }
            p.repaint();
        }//END of Raicing
        public static void main(String[] args) 
        {
            // TODO Auto-generated method stub
            TurtoiseAndHare myrace = new TurtoiseAndHare();
            myrace.setVisible(true);
      myrace.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }//END of Main
     
        class Handler implements ActionListener
        {
            public void actionPerformed (ActionEvent e)
            {
                int send;
                Random startNo = new Random();
                send = 1 + startNo.nextInt(2);
                //start button was pressed
                if (send == 1)
                {
                    TnHThread h = new TnHThread(send,mo);
                    h.start();
                }
                else if (send == 2)
                {
                    TnHThread t = new TnHThread(send,mo);
                    t.start();
                }
            }
        }
    }
     
    ==================================>
    MOVE class
     
    package Tortoiseandhare;
     
    import java.util.Random;
     
    public class Move {
     
      private boolean lock = true; //1st
     
      TortoiseAndHare frame;
     
      public Move(TortoiseAndHare fr) {frame = fr;}
     
      public void moving(int animal, int hare_x, int hare_y)
      {
          if (animal == 1)moving_hare(animal, hare_x, hare_y);
          if (animal == 2)moving_Tortoise(animal, hare_x, hare_y);
      }//End of moving
      public void moving_hare(int animal, int hare_x, int hare_y)
      {
          hare_start();
          go(animal, hare_x, hare_y);
          hare_stop();
      }//End of Moving_hare
      public synchronized void hare_start()
      {
          while (lock == false)
          {
              try
              {
                  wait();
              }
              catch (InterruptedException e)
              {
                  System.out.println("Interrupted Exception on the hare");
              }
          }//End Of while
          lock = false;
          notifyAll();
      }//END of Synch hare_start
     
      public synchronized void hare_stop()
      {
          lock = true; //3rd
          notifyAll();
      }//END of hare_stop
     
      public void moving_Tortoise(int animal, int hare_x, int hare_y)
      {
          Tortoise_start();
          go(animal, hare_x, hare_y);
          Tortoise_stop();
      }//end of Tortoise_start
      public synchronized void Tortoise_start()
      {
          while (lock == false) //7th
          {
              try
              {
                  wait();
              }
              catch(InterruptedException e)
              {
                  System.out.println("Interrupted Exception on the Tortoise");
              }
          }//END of While
              lock = false; //4th
              notifyAll();
          }   //End of Synch Tortoise_start
     
          public synchronized void Tortoise_stop()
          {
              lock = true; //5th
              notifyAll();
          }
          public void go(int animal, int hare_x, int hare_y)
          {
              if (animal == 1) //if animal == hare
              {
                  hare_y = 35;
                  
                  float RandomNo;
                  Random RandNumber = new Random();
                  RandomNo = RandNumber.nextFloat(); 
                    
                  if ( (RandomNo > 0) && (RandomNo <= 0.2) ) //Sleep
                  {
                      //No Move at all
                      try{Thread.sleep(1000);}
                      catch(Exception e){System.err.println("Exception at the Sleeping Thread");}
                      
                       System.out.println("moving number from Move.go. animal 1  " + animal+ " x = "+hare_x+" y is "+hare_y);
                  }
                  else if ( (RandomNo > 0.2) && (RandomNo <= 0.4 ) ) //Big Hop
                  {
                      System.out.println(" Hare (RandomNo > 0.2) && (RandomNo <= 0.4 ) ");
                      //7 Position to the right
                      hare_x = hare_x + 7;
                      frame.setLocation(hare_x, hare_y);
                      try{Thread.sleep(100);}
                      catch(Exception e){System.err.println("Exception at the Sleeping Thread");}
                      
                  }
                  else if ( (RandomNo > 0.4) && (RandomNo <= 0.5) ) //Big slip
                  {
                      //10 Position to the left
                      hare_x = hare_x - 10;
                      frame.setLocation(hare_x, hare_y);
                      try{Thread.sleep(100);}
                      catch(Exception e){System.err.println("Exception at the Sleeping Thread");}
                      
                  }
                  else if ( (RandomNo > 0.5) && (RandomNo <= 0.8) ) //Small hop
                  {
                      //1 position to the right
                      hare_x = hare_x + 1;
                      frame.setLocation(hare_x, hare_y);
                      try{Thread.sleep(100);}
                      catch(Exception e){System.err.println("Exception at the Sleeping Thread");}
                  }
                  else if ( (RandomNo > 0.8) && (RandomNo <= 1.0) ) //small Slip
                  {
                      //2 position to the left
                      hare_x = hare_x - 2;
                      frame.setLocation(hare_x, hare_y);
                      try{Thread.sleep(100);}
                      catch(Exception e){System.err.println("Exception at the Sleeping Thread");}
                                    }
                  if (hare_x > 770)
                  {
                      System.out.println("The Hare Wins the Race");
                  }
     
              }
              if (animal == 2) //if animal == Tortoise
    {
      hare_y = 159;
      float RandomNo;
      Random RandNumber = new Random();
    Math.abs(RandomNo = RandNumber.nextFloat()); 
     
     
      RandomNo = RandNumber.nextFloat();
      if ( (RandomNo > 0) && (RandomNo <= .5) ) //Fast Plod Right
      {
          //2 Position to the Right
          hare_x = hare_x + 2;
          frame.setLocation(hare_x, hare_y);
          try{Thread.sleep(100);}
                      catch(Exception e){System.err.println("Exception at the Sleeping Thread");}
      }
      else if ( (RandomNo > .5) && (RandomNo <= .7) ) //Slip left
      {
          //Slip 4 Position to the left
          hare_x = hare_x - 4;
          frame.setLocation(hare_x, hare_y);
          try{Thread.sleep(100);}
                      catch(Exception e){System.err.println("Exception at the Sleeping Thread");}
      }
      else if( (RandomNo > .7) && (RandomNo <= 1)) //Slow Plod Right
      {
          //1 Position to the right
          hare_x = hare_x + 1;
          frame.setLocation(hare_x, hare_y);
          try{Thread.sleep(100);}
                      catch(Exception e){System.err.println("Exception at the Sleeping Thread");}
      }
      if (hare_x > 770)
      {
       System.out.println("The Tortoise Wins the Race");
       try{Thread.sleep(100);}
                      catch(Exception e){System.err.println("Exception at the Sleeping Thread");}
      }
    }
          }//END of go
    }//End of Class Move
     
     
    ==================>
    THREAD CLASS
     
    package turtoiseandhare;
     
    import java.util.Random;
    public class TnHThread extends Thread
    {
        public int animal;
        private int x;
        private int y;
     
        Move m;
        
        public TnHThread(int tr, Move m1)
          {
          animal = tr;
     
            m = m1;
            if (animal == 1){x = 0; y = 35;}
            if (animal == 2){x = 0; y = 158;}
        }
     
        public void run()
        {
            m.moving(animal, x, y);
        }
    }
     
     
    ====================>
Working...