Back to index

wims  3.65+svn20090927
ballenbak.java
Go to the documentation of this file.
00001 // ballenbak.java - jpq - 09/01/03
00002 import java.awt.event.* ;
00003 import java.awt.* ;
00004 import java.applet.* ;
00005 import java.util.* ;
00006 
00007 public class ballenbak extends java.applet.Applet
00008 { controles C ;
00009   dessin D ;
00010 //
00011   String START="Drop all balls";
00012   String OK="OK";
00013   String numgate="number of gates";
00014   String oneextra="drop one ball";
00015   String numballs="number of balls";
00016   String droptime="droptime";
00017   int result[];
00018   int totalballs;
00019   int bars;
00020 
00021 //
00022   public String ReadApplet(){
00023     String reply="";int t;
00024 //    bars = getparam ("bars", 6) ;
00025     for(int p=0;p<bars+1;p++){
00026        t=result[p];
00027        if(p!=0){reply=reply+","+t;}else{reply=reply+t;}   
00028     }                                                                                                                                  
00029         return reply;                                                                                                                      
00030   }
00031 
00032 
00033   private int getparam (String s, int n)
00034   { int nn = n ;
00035     s = getParameter (s) ;
00036     if (s != null)
00037     { try { nn = Integer.parseInt (s) ; }
00038       catch (NumberFormatException nfe) { }
00039       if (nn <= 0) nn = n ;
00040     }
00041     return nn ;
00042   }
00043 
00044   public void init ()
00045   { setLayout (new BorderLayout ()) ;
00046     bars = getparam ("bars", 1) ;
00047     int balls = getparam ("balls", 1) ;
00048     int delay = getparam ("delay", 0) ;
00049     if(delay*balls>120){delay=1;}
00050     String lang=getParameter("lang");
00051     if(lang!=null){
00052        if(lang.equals("nl")){START="Alles in 1 keer";OK="OK";numgate="aantal rijen poortjes";oneextra="1 bal";numballs="aantal ballen";droptime="valtijd";}
00053        if(lang.equals("fr")){START="MARCHE";OK="RAZ";numgate="clous";oneextra="1 bille";numballs="billes";droptime="temps";}
00054     }
00055     D = new dessin (bars, delay, balls) ;
00056     C = new controles (D) ;
00057     D.C = C ;
00058     add (C, BorderLayout.NORTH) ;
00059     add (D, BorderLayout.CENTER) ;
00060   }
00061 
00062   public void destroy ()
00063   { remove (D) ; remove (C) ; }
00064 
00065   public String getAppletInfo ()
00066   { return "ballebak par j.-p. Quelen" ; }
00067 
00069 protected class dessin extends Canvas
00070 
00071 { int bars, n, delay, boucle ;
00072   int L, H, Ls2, Hs4, Hb, Hb1 ;
00073   Random rnd ;
00074   int [] classes ;
00075   controles C ;
00076   gtab gt ;
00077   Image img ;
00078   Graphics g ;
00079 
00080   public dessin (int bars, int delay, int n)
00081   { this.bars = bars ;
00082     this.delay = delay ;
00083     this.n = n ;
00084     classes = new int [bars + 1] ;
00085     gt = new gtab () ;
00086     gt.maj (classes.length, classes) ;
00087     rnd = new Random () ;
00088   }
00089 
00090 // dessin de l'entonnoir
00091 
00092   private void ent (Graphics g)
00093   { g.setColor (Color.white) ;
00094     g.fillRect (1, 1, L, Hs4 - 10) ;
00095     g.setColor (Color.black) ;
00096     g.drawLine (Ls2 - Hs4, 1, Ls2 - 10, Hs4 - 10) ;
00097     g.drawLine (Ls2 + 10, Hs4 - 10,  Ls2 + Hs4, 1) ;
00098     g.setColor (Color.blue) ;
00099     for (int i = 0 ; i < n ; i ++)
00100     { int x = (int)(rnd.nextDouble () * (Math.max (0, Hs4 - 15))) ;
00101       int y = (int)(rnd.nextDouble () * (Math.max (0, Hs4 - x - 15))) ;
00102       x *= (int)(rnd.nextDouble () * 2) * 2 - 1 ;
00103       g.fillOval (Ls2 + x, y, 7, 7) ;
00104     }
00105     g.setColor (Color.black) ;
00106     g.drawLine (0, 0, L, 0) ;
00107   }
00108 
00109   public void update (Graphics g)
00110   { paint (g) ; }
00111 
00112   public void paint (Graphics g)
00113   { // if (img == null)
00114     Font f = new Font ("Arial", Font.BOLD, 16) ;
00115   g.setFont (f) ;
00116     { L = getSize().width ;
00117       H = getSize().height ;
00118 //      img = createImage (L, H) ;
00119 //      g = img.getGraphics () ;
00120       L -= 2 ; H -= 2 ;
00121       Ls2 = L / 2 ;
00122       Hs4 = H / 4 ;
00123       Hb = H - 50 ;
00124     }
00125     g.setColor (Color.black) ;
00126     g.drawRect (0, 0, L + 1, H + 1) ;
00127     g.setColor (Color.white) ;
00128     g.fillRect (1, 1, L, H) ;
00129 // dessin de l'entonnoir
00130     ent (g) ;
00131 // dessin des clous
00132     g.setColor (Color.green) ;
00133     int pas = (Hb - Hs4) / bars ;
00134     int dec = 0 ;
00135     int x = Ls2 - 2 ;
00136     int x1 = x ;
00137     int y = Hs4 - 2 ;
00138     for (int i = 0 ; i < bars ; i ++)
00139     { while (x1 - 3 - dec > 0)
00140       { g.fillOval (x, y, 5, 5) ;
00141         g.fillOval (x1, y, 5, 5) ;
00142         x += pas ;
00143         x1 -= pas ;
00144       }
00145       y += pas ;
00146       if (dec == 0) dec = pas / 2 ; else dec = 0 ;
00147       x = Ls2 - 2 + dec ;
00148       x1 = x ;
00149     }
00150 // dessin des bacs
00151     Hb1 = y ;
00152     g.setColor (Color.black) ;
00153     g.drawLine (1, H, L, H) ;
00154     int dec1 = 0 ;
00155     if (dec == 0) dec1 = pas / 2 ;
00156     x = Ls2 + dec1 ;
00157     x1 = x ;
00158     int ind = bars / 2 ;
00159     int ind1 = ind ;
00160     while (x1 + pas > 0)
00161     { g.setColor (Color.black) ;
00162       g.drawLine (x, H, x, Hb1) ;
00163       g.drawLine (x1, H, x1, Hb1) ;
00164       g.setColor (Color.blue) ;
00165       if ((ind >= 0) && (ind < classes.length))
00166       { int ci = classes [ind] ;
00167         if (ci > 0) g.fillRect (x - pas, H - ci, pas, ci) ;
00168       }
00169       if ((ind1 >= 0) && (ind1 < classes.length))
00170       { int ci = classes [ind1] ;
00171         if (ci > 0) g.fillRect (x1 - pas, H - ci, pas, ci) ;
00172       }
00173       result=classes;
00174       x += pas ;
00175       x1 -= pas ;
00176       ind ++ ;
00177       ind1 -- ;
00178     }
00179 //   g1.drawImage (img, 0, 0, this) ;
00180 // dessin de la bille qui tombe
00181     while (boucle > 0)
00182     { boucle -- ;
00183       n -- ;
00184       ent (g) ;
00185       C.tn.setText (Integer.toString (n)) ;
00186       dec = 0 ;
00187       int xp = 10000 ;
00188       int yp = 10000 ;
00189       x = Ls2 - 3 ;
00190       y = Hs4 - pas / 2 - 3 ;
00191       ind = 0 ;
00192       for (int i = 0 ; i < bars ; i ++)
00193       { boolean brnd = (rnd.nextDouble () >= 0.5) ;
00194         if (brnd) x += pas / 2 ; else x -= pas / 2 ;
00195         if (brnd) ind ++ ;
00196         for (int k = 0 ; k < pas ; k ++)
00197         { g.setColor (Color.white) ;
00198           g.fillOval (xp, yp, 7, 7) ;
00199           g.setColor (Color.blue) ;
00200           g.fillOval (x, y, 7, 7) ;
00201 //          g1.drawImage (img, 0, 0, this) ;
00202           xp = x ; yp = y ++ ;
00203           if (delay > 0)
00204           { try { Thread.sleep (delay); }
00205             catch (InterruptedException e) {}
00206           }
00207         }
00208         if (i == 0)
00209         { g.setColor (Color.black) ;
00210           g.drawLine (Ls2 - Hs4, 1, Ls2 - 10, Hs4 - 10) ;
00211           g.drawLine (Ls2 + 10, Hs4 - 10,  Ls2 + Hs4, 1) ;
00212 //          g1.drawImage (img, 0, 0, this) ;
00213         }
00214       }
00215       g.setColor (Color.white) ;
00216       g.fillOval (xp, yp, 7, 7) ;
00217       if ((ind >= 0) && (ind < classes.length)) classes [ind] ++ ;
00218     x = Ls2 + dec1 ;
00219     x1 = x ;
00220     ind = bars / 2 ;
00221     ind1 = ind ;
00222     while (x1 + pas > 0)
00223     { g.setColor (Color.black) ;
00224       g.drawLine (x, H, x, Hb1) ;
00225       g.drawLine (x1, H, x1, Hb1) ;
00226       g.setColor (Color.blue) ;
00227       if ((ind >= 0) && (ind < classes.length))
00228       { int ci = classes [ind] ;
00229         if (ci > 0) g.fillRect (x - pas, H - ci, pas, ci) ;
00230       }
00231       if ((ind1 >= 0) && (ind1 < classes.length))
00232       { int ci = classes [ind1] ;
00233         if (ci > 0) g.fillRect (x1 - pas, H - ci, pas, ci) ;
00234       }
00235        x += pas ;
00236       x1 -= pas ;
00237       ind ++ ;
00238       ind1 -- ;
00239     }
00240     
00241     int cnt=0;
00242     g.setColor (Color.black) ;
00243     for(int p=0;p<pas;p++){
00244        g.drawString(" "+cnt+" ",p*pas-pas/2,H);
00245        cnt++;
00246     }
00247 //    g1.drawImage (img, 0, 0, this) ;
00248 // 
00249     gt.maj (bars + 1, classes) ;
00250     }
00251   }
00252 }
00254 protected class controles extends Panel implements ActionListener
00255 { dessin D ;
00256   TextField tn, tdt, tbars ;
00257   Button ok, plus, etoile ;
00258   Font f ;
00259 
00260   private Label ajoutlbl (String s)
00261   { Label l = new Label (s) ;
00262     l.setBackground (Color.white) ;
00263     l.setFont (f) ;
00264     return l ;
00265   }
00266 
00267   private TextField ajouttf (int i, int j)
00268   { TextField T = new TextField (Integer.toString (i), j) ;
00269   T.setBackground (Color.yellow) ; 
00270     T.setFont (f) ;
00271     return T ;
00272   }
00273 
00274   private Button ajoutb (String s)
00275   { Button b = new Button (s) ;
00276     b.addActionListener (this) ;
00277     b.setFont (f) ;
00278     return b ;
00279   }
00280 
00281 
00282   public controles (dessin D)
00283   { this.D = D ;
00284     f = new Font ("Arial", Font.PLAIN, 10) ;
00285     setBackground (Color.white) ;
00286     setLayout (new GridLayout(2, 1)) ;
00287     Panel p = new Panel () ;
00288     add (p) ;
00289     p.add (tdt = ajouttf (D.delay, 2)) ;
00290     p.add (ajoutlbl (droptime)) ;
00291     p.add (ajoutlbl (numgate)) ;
00292     p.add (tbars = ajouttf (D.bars, 2)) ;
00293     p.add (ok = ajoutb (OK)) ;
00294     p = new Panel () ;
00295     add (p) ;
00296     p.add (ajoutlbl (numballs)) ;
00297     p.add (tn = ajouttf (D.n, 3)) ;
00298     p.add (plus = ajoutb (oneextra)) ;
00299     p.add (etoile = ajoutb (START)) ;
00300   }
00301 
00302   private int maj (TextField T, int n)
00303   { try { n = Integer.parseInt (T.getText ()) ; }
00304       catch (NumberFormatException nfe) { }
00305     if (n <= 0) n = 1 ;
00306     return n ;
00307   }
00308 
00309   public void actionPerformed (ActionEvent e)
00310   { 
00311     Object obj = e.getSource () ;
00312     if (( obj == ok) || (obj == plus) || (obj == etoile))
00313     { int n = maj (tn, D.n) ;
00314       if (n >= 0) D.n = n ;
00315       tn.setText (Integer.toString (D.n)) ;
00316       try { D.delay = Integer.parseInt (tdt.getText ()) ; }
00317       catch (NumberFormatException nfe) { }
00318       tdt.setText (Integer.toString (D.delay)) ;
00319       if (obj == ok)
00320       { bars = maj (tbars, D.bars) ;
00321         if (bars > 0) D.bars = bars ;
00322         if (D.classes.length < bars + 1) D.classes = new int [bars + 1] ;
00323         else for (int i = 0 ; i < D.classes.length ; i ++) D.classes [i] = 0 ;
00324         D.gt.maj (D.bars + 1, D.classes) ;
00325       }
00326       else if (obj == plus) D.boucle = 1 ;
00327            else D.boucle = D.n ;
00328       tbars.setText (Integer.toString (D.bars)) ;
00329       tdt.setText (Integer.toString (D.delay)) ;
00330       D.repaint () ;
00331     }
00332   }
00333 }
00334 
00335 }
00337 class gtab
00338 { static boolean change ;
00339   static int dim ;
00340   static int [] tableau ;
00341 
00342   static public void maj (int d, int [] tab)
00343   { dim = d ;
00344     tableau = tab ;
00345     change = true ;
00346   }
00347 
00348 }