
/***************************************************************************
 * 
 *                  NE PAS MODIFIER CETTE SECTION 
 *                  
 **************************************************************************/
import java.awt.*;
import Listes.*;

public class Expresso extends FenetreTortue
{ 
     
/***************************************************************************
 * 
 *                      SECTION MODIFIABLE 
 *                  
 **************************************************************************/
 
 
 
/********************** Parametres de l'interface ************************/

    public static int baseFenetre = 600; // Largeur de la fenêtre
    public static int hauteurFenetre = 500; // Hauteur de la fenêtre
    public static String titreFenetre = "Hanoi"; // Titre de la fenêtre
    // Le texte
    public static boolean zoneTexte = false; // Indique si on désire ou non une zone de texte
    // Les boutons
    public static String[] nomsBoutonsLigne1 = {unicode("D#eaigbuter"), "Quitter"}; // Noms des boutons de la ligne 1
    public static String[] nomsBoutonsLigne2 = {unicode("Pas #agra pas"), "Automatique", unicode("Interruption_Arr#ecirt")}; // Noms des boutons de la ligne 2
    // Les menus
    public static String[] nomsMenus1 = {}; // Exemple: private static String[] nomsMenus1 = {"nomMenu", "nomItem_1", ...};
    public static String[] nomsMenus2 = {}; // Laissez vide si vous ne désirez pas de menu
    public static String[] nomsMenus3 = {};
    public static String[] nomsMenus4 = {};
    public static String[] nomsMenus5 = {};
    public static String[] nomsMenus6 = {};
    public static String[] nomsMenus7 = {};
    public static String[] nomsMenus8 = {};
    
    public static void ajoutDeGlissieres(){
        ajouterGlissiereLigne1("Nombre de disques", 2,12,5,0);
        ajouterGlissiereLigne1(unicode("D#eaiflai en 1/1000 sec."), 0,1000,0,0);
    }

/****************** Initialisation *********************************/
   
    public void initialisation(){
    // Placer ici les actions a realiser a l'ouverture
        permettreInterruption(true);
    }
    
/****************** Placer vos procedures ici ****************************/

Liste[] poteaux = new Liste[4];
 int nombreTotalDisques=0, longueurAnneauUn, hauteurAnneau, distHoriz, distVert;
 Color[] couleurs = new Color[13];
 String mode = "manuel";
 double departGlisser;
 boolean stopperSolution = false;
 
     
public void hanoi(int n) {
     initHanoi(n);
 }
 
public void initHanoi(int n) {
     mode = "manuel";
     nombreTotalDisques = n;
     poteaux[1]= listeVide();
     poteaux[2]= listeVide();
     poteaux[3]= listeVide();
     for (int i=n;i>0;i--) {poteaux[1] = metsPremier (i,poteaux[1]);};
     fixeOrigineTortue (largeurZoneGraphique()/2 , hauteurZoneGraphique()/2);
     longueurAnneauUn = largeurZoneGraphique()/(5*n); //en Java, la division de deux entiers est enti?re
     hauteurAnneau = hauteurZoneGraphique()/(n+4);
     distHoriz = 3*largeurZoneGraphique()/10;
     distVert = 2*hauteurAnneau - hauteurZoneGraphique()/2;
     definirCouleurs();
     dessinerSituationInitiale(n);
     //solutionHanoi(n,2);
}

public void definirCouleurs() {
    couleurs[0] = new Color(255,255,255);
    couleurs[1] = new Color(255,0,0);
    couleurs[2] = new Color(0,255,0);
    couleurs[3] = new Color(0,0,255);
    couleurs[4] = new Color(0,255,255);
    couleurs[5] = new Color(255,0,255);
    couleurs[6] = new Color(255,255,0);
    couleurs[7] = new Color(127,0,0);
    couleurs[8] = new Color(0,127,0);
    couleurs[9] = new Color(0,0,127);
    couleurs[10] = new Color(0,127,127);
    couleurs[11] = new Color(127,0,127);
    couleurs[12] = new Color(127,127,0);
}
 
 public void solutionHanoi(int n, int but) {
    int depart = 0; // erreur du compilateur si non initialisŽe ˆ 0
    if (stopperSolution) {return;};
    if (n==0) return;
    for (int i=1; i<4;i++) {if (elementP(n,poteaux[i])) {depart = i; };  };
    if (depart != but) 
        {solutionHanoi(n-1, 6-depart-but);
         if (stopperSolution) {return;};
         deplacerDisque (n, depart, but);
         if (stopperSolution) {return;};}
    solutionHanoi(n-1, but); 
}   

 public void deplacerDisque (int n, int depart, int arrivee) {
    tracerAnneau(distHoriz*(depart-2), distVert+hauteurAnneau*(compte(poteaux[depart])-1), hauteurAnneau-1, n*longueurAnneauUn, couleurs[0]);
    tracerAnneau(distHoriz*(arrivee-2), distVert+hauteurAnneau*(compte(poteaux[arrivee])-0), hauteurAnneau-1, n*longueurAnneauUn, couleurs[n]);
    poteaux[depart] = saufPremier(poteaux[depart]);
    poteaux[arrivee] = metsPremier (n,poteaux[arrivee]);
    //miseAJourGraphique(); // N'est plus nécessaire si fonctionne dans thread séparé
    delai(valEnt(valeurGlissiere(2)));
}

 public void delai(int t) {
    if (mode=="pasApas") {stopperSolution = true; return;};
    if ((mode=="auto") && interruption()) {mode = "manuel"; stopperSolution = true; return;};
    if (mode=="auto")  {attendre(t);} // faire un dŽlai
}

public void deplacementModeManuel(int n, double x1, double x2) {
    int nx1=2, nx2=2;
    if (x1 < -largeurZoneGraphique()/6) {nx1=1;}
    if (x1 >  largeurZoneGraphique()/6) {nx1=3;}
    if (x2 < -largeurZoneGraphique()/6) {nx2=1;}
    if (x2 >  largeurZoneGraphique()/6) {nx2=3;}
    if (nx1 == nx2) {bip(); return;}
    if (videP(poteaux[nx1])) {bip(); return;}
    if (videP(poteaux[nx2])) {deplacerDisque(valEnt(premier(poteaux[nx1])), nx1, nx2); return;}
    if (valEnt(premier(poteaux[nx1])) > valEnt(premier(poteaux[nx2])))  {bip(); return;}
    deplacerDisque(valEnt(premier(poteaux[nx1])), nx1, nx2);
}

public void dessinerSituationInitiale(int n) {
    videGraphique();
    for (int k=n;k>0;k--) {
        tracerAnneau(-distHoriz, distVert+hauteurAnneau*(n-k), hauteurAnneau-1, k*longueurAnneauUn, couleurs[k]);
    }
    delai(valEnt(valeurGlissiere(2)));
}

public void tracerAnneau(int x, int y, int hauteur, int base, Color couleur) {
    couleurRemplissage(couleur);
    if (false) {rectanglePlein(x-base/2, y+hauteur/2, x+base/2, y-hauteur/2);}
    else {
        lc(); fixePos(x-base/2, y+hauteur/2);
        bc(); cc(couleur);
        debutRemplir();  
        av (hauteur); dr(90); av(base); dr(90);av (hauteur); dr(90); av(base); dr(90);
        finRemplir();}
}

/**************  Les actions des boutons  ************************************/

public void actionBouton1(){
    hanoi(valEnt(valeurGlissiere(1)));
} 

public void actionBouton2(){
    quitter();
}

public void actionBouton3(){
    if (mode != "auto" && nombreTotalDisques>0) 
        {mode = "pasApas"; 
         solutionHanoi(nombreTotalDisques,2);
         stopperSolution = false;
         mode = "manuel"; }
}   

public void actionBouton4(){
    if (nombreTotalDisques>0) 
       {mode = "auto"; 
        stopperSolution = false;
        solutionHanoi(nombreTotalDisques,2); 
        stopperSolution = false;
        mode = "manuel"; }
}
/**************  Les actions des menus  ****************************/


   
/*************** Les actions des glissieres *********************************/  

    
  
/**************** Les actions de la souris *******************************/
    
    public void clicSouris(double x, double y){
        
    }
    
    public void debutGlisser(double x, double y){
        departGlisser = x;
    }
    
    public void finGlisser(double x, double y){
        deplacementModeManuel(nombreTotalDisques, departGlisser, x);
    }
    
    public void glisserEnCours(double x, double y){
        
    }
    
/***************************************************************************
 * 
 *                  NE PAS MODIFIER CETTE SECTION 
 *                  
 **************************************************************************/    
     
    public static String[][] Menus = {nomsMenus1, nomsMenus2, nomsMenus3, nomsMenus4, nomsMenus5, nomsMenus6, nomsMenus7, nomsMenus8};    
    
    public Expresso(int l, int h, String titre, String[] nomsBoutons1, String[] nomsBoutons2, String[][] Menus, boolean avecTexte){
        super(l, h, titre, nomsBoutons1, nomsBoutons2, Menus, avecTexte);
    }
    
    public Expresso() {
        this(baseFenetre, hauteurFenetre, titreFenetre, nomsBoutonsLigne1, nomsBoutonsLigne2, Menus, zoneTexte);
    }
    
    public static void executer(boolean applet){
        initGlissieres();
        ajoutDeGlissieres();
        Expresso maFenetre = new Expresso();
        faireApplet(applet);
        maFenetre.toFront();
        maFenetre.initialisation();
    }
    
    public static void main(String[] args){
        executer(false);
    }

     
}  
