/* de.java - 18/06/01 - 04/02/02 - 04/02/03
 * simulation d'un lancer de dé, diagramme
 * ajout de main() le 31/01/18
 */

import java.awt.event.*;
import java.awt.*;
import java.applet.*;
import java.util.*;

public class de extends java.applet.Applet {
  static final long serialVersionUID = 180131L;
  controles C;
  dessin D;
  table T;
  int Ndes = 2;
  int Nsimul = 10;

  public void init () {
    setLayout (new BorderLayout ());
    
    try {
	  String s = getParameter ("nd");
	  Ndes = Integer.parseInt (s);
      s = getParameter ("ns");
      Nsimul = Integer.parseInt (s);
	}
    catch (NumberFormatException nfe) {}
	catch (NullPointerException e) {}
	if (Ndes <= 0)
	  Ndes = 1;
    if (Nsimul <= 0)
	  Nsimul = 1;
    
    D = new dessin ();
    T = new table ();
    C = new controles ();
    add ("North", C);
    add ("South", T);
    add ("Center", D);
  }

  public String getAppletInfo () {
    return "de par j.-p. Quelen";
  }

////////////////////////////////////////////////////////////////////////////////
protected class dessin extends Panel {
  static final long serialVersionUID = 180131L;
  Image img;
  Graphics g;
  int bsup, nfaces;
  int histogramme [];
  Random r;
  boolean retrace;

  public dessin () {
    r = new Random ();
    retrace = false;
    nfaces = 6;
    bsup = (nfaces - 1) * Ndes + 1;
    histogramme = new int [bsup];
  }

  private void h (Graphics g, int i)
  { g.setColor (Color.white);
    g.fillRect (1, 1, getSize().width - 2, getSize().height - 2);
    g.setColor (Color.yellow);
    g.drawLine (20, getSize().height - 40, getSize().width, getSize().height - 40);
    g.drawLine (20, 40, 20, getSize().height - 40);
    g.setColor (Color.blue);
    g.drawString ("0", 5, getSize().height - 40);
    g.drawString (Integer.toString (i + 1), 5, 40);

    for (int j = 0; j < bsup; j ++)
    { int x = j * (getSize().width - 50) / bsup + 50;
      int y = getSize().height - 40 - histogramme [j] * (getSize().height - 80) / (i + 1);
      g.setColor (Color.black);
      g.drawLine (x, y, x, getSize().height - 40);
      g.setColor (Color.blue);
      g.drawString (Integer.toString (j + Ndes), x, getSize().height - 10);
    }
      g.setColor (Color.black);
      g.drawRect (0, 0, getSize().width - 1, getSize().height - 1);
  }

  private int c16 () { return (int)(r.nextDouble () * nfaces); }

  public void update (Graphics g)
  { paint (g); }

  public void paint (Graphics g1)
  {  if (img == null)
      { img = createImage (getSize().width, getSize().height);
        g = img.getGraphics ();
        g.setColor (Color.white);
        g.fillRect (1, 1, getSize().width - 2, getSize().height - 2);
        g.setColor (Color.black);
        g.drawRect (0, 0, getSize().width - 1, getSize().height - 1);
      }
    if (retrace)
    { retrace = false;
      for (int i = 0; i < bsup; i ++) histogramme [i] = 0;
      for (int i = 0; i < Nsimul; i ++)
      { int som = 0;
        for (int j = 0; j < Ndes; j ++) som += c16 ();
        histogramme [som] ++;
        h (g, i);
        g1.drawImage (img, 0, 0, this);
        double khi2 = 0.0;
        for (int j = 0; j < bsup; j ++)
        { double diff = histogramme [j] - (double)(Nsimul) / nfaces;
          khi2 += diff * diff;
        }
        khi2 /= Nsimul * Nsimul;
        g.drawString ("d2 = " + khi2, 50, 10);
        g1.drawImage (img, 0, 0, this);
      }
    }
    else g1.drawImage (img, 0, 0, this);
//    else h (g, Nsimul -1);
  }
}
////////////////////////////////////////////////////////////////////////////////
protected class controles extends Panel implements ActionListener {
  static final long serialVersionUID = 180131L;
  TextField tNdes, tNsimul, tfaces;
  Button ok;
  Font f;

  private Label ajoutlbl (String s)
  { Label lbl = new Label (s);
    lbl.setBackground (Color.lightGray);
    lbl.setFont (f);
    return lbl;
  }

  public controles () {
    setLayout (new FlowLayout());
    setBackground (Color.lightGray);
    f = new Font ("Arial", Font.PLAIN, 10);
    String s = "Lancer de " + Integer.toString (Ndes) + " dé";
    if (Ndes > 1) s += "s";
    s += " à";
    add (ajoutlbl (s));
    add (tfaces = new TextField ("6", 2));
    add (ajoutlbl ("faces       Nb simulations :"));
    add (tNsimul = new TextField (5));
    tNsimul.setFont (f);
    tNsimul.setText (Integer.toString (Nsimul));
    add (ok = new Button ("Ok"));
    ok.setFont (f);
    ok.addActionListener (this);
  }

  public void actionPerformed (ActionEvent e)
  { if (e.getSource () == ok)
    { try { Nsimul = Integer.parseInt (tNsimul.getText ()); }
      catch (NumberFormatException nfe) { }
      if (Nsimul <= 0) Nsimul = 1;
      tNsimul.setText (Integer.toString (Nsimul));
      int nfaces = D.nfaces;
      try { nfaces = Integer.parseInt (tfaces.getText ()); }
      catch (NumberFormatException nfe) { }
      if ((nfaces > 0) && (nfaces != D.nfaces))
      { D.nfaces = nfaces;
        D.bsup = (nfaces - 1) * Ndes + 1;
        if (nfaces > D.histogramme.length) D.histogramme = new int [D.bsup];
      }
      tfaces.setText (Integer.toString (D.nfaces));
      D.retrace = T.retrace = true;
      D.repaint ();
      T.repaint ();
    }
  }
}

////////////////////////////////////////////////////////////////////////////////
protected class table extends Panel {
  static final long serialVersionUID = 180131L;
  TextArea ta;
  boolean retrace;

  public table () {
	setLayout (new FlowLayout());
    setBackground (Color.lightGray);
    add (ta = new TextArea ("", 3, 50, TextArea.SCROLLBARS_HORIZONTAL_ONLY));
    retrace = false;
  }

  public void paint (Graphics g)
  { if (retrace)
    { retrace = false;
      String s1 = "résultat\t";
      String s2 = "effectif\t";
      for (int i = 0; i < D.bsup; i ++)
      { s1 = s1 + Integer.toString (i + Ndes) + "\t";
        s2 = s2 + Integer.toString (D.histogramme [i]) + "\t";
      }
      ta.setText (s1 + "\n" + s2);
    }
  }
}

////////////////////////////////////////////////////////////////////////////////

  public static void main (String [] args) {
    int w = 500;
    int h = 400;

    de d = new de ();
    d.Ndes = 1;
    d.Nsimul = 100;
    d.init();
    d.start();

    Frame f = new Frame ("de");
    f.addWindowListener (new fermer ());
    f.add (d);
    f.setSize (w, h);
    f.setVisible (true);
  }

  protected static final class fermer extends WindowAdapter {
    public void windowClosing (WindowEvent e) {
      System.exit (0);
    }
  }

}
