예제 #1
0
        private int ChariotProche(Colis colis)
        {
            // initialisation du chariot que l'on teste : ici le premier du tableau
            Chariot chariot_choisit = Program.tab_chariot[0];
            // on met un cout par défaut très grand
            double      cost     = 1000000;
            Emplacement empColis = new Emplacement(colis._x, colis._y, colis._orientation, colis._hauteur);

            // on passe en revue tous les chariots du tableau pour voir quel chariot est le plus proche du colis.
            foreach (Chariot chariot in Program.tab_chariot)
            {
                if (!chariot.enLivraison)
                {
                    Emplacement empChariot = new Emplacement(chariot._x, chariot._y, chariot._orientation, 0);

                    // Calcul du cout théorique du déplacement
                    empChariot.CalculeHCost(empColis);

                    // Comparaison
                    if (empChariot.Estimation() < cost)
                    {
                        chariot_choisit = chariot;
                        cost            = empChariot.Estimation();
                    }
                }
            }
            return(chariot_choisit.Get_cle_chariot() - 1);
        }
예제 #2
0
 /// <summary>
 /// Cette fonction est utilisée lorsque l'on souhaite faire un nouveau colis. Comme les 15 colis
 /// doivent être distincts, on doit donc vérifier à chaque colis que le colis nouvellement créé
 /// n'existe pas déjà. On doit donc chercher un colis dans un tableau de colis
 /// </summary>
 /// <entree>
 ///     <param name="nouveau"> Nouveau colis qui vient d'être fait aléaoiterement </param>
 ///     <param name="compteur"> le compte int permet de savoir jusqu'à quelque point est rempli le tableau
 ///     ppour ne pas avoir des comparaisons avec des objets vides et eviter les exceptions et les erreurs </param>
 /// </entree>
 /// <returns> Cette fonction étant une fonction test, elle renvoie donc un boléen avec true si le colis existe
 /// déjà dans le tableau ou false dans le cas contraire. </returns>
 private bool Doublon(Colis nouveau, int compteur)
 {
     for (int k = 0; k < compteur; k++)
     {
         if (tab_colis[k]._x == nouveau._x && tab_colis[k]._y == nouveau._y)
         {
             return(true);
         }
     }
     return(false);
 }
예제 #3
0
 private int Retrouver_indice_colis_clique(Colis colis)
 {
     for (int k = 0; k < tab_colis.Length; k++)
     {
         if (tab_colis[k]._y == colis._y && tab_colis[k]._x == colis._x && tab_colis[k]._orientation == colis._orientation)
         {
             return(k);
         }
     }
     // le bouton cliqué n'est pas un colis : par défaut
     return(-1);
 }
예제 #4
0
        private void tmpButton_Click(object sender, EventArgs e)
        {
            // Expression regulière pour récuperer la position d'un chariot avec le nom du bouton
            Regex re = new Regex(@"([0-9]*)\.([0-9]*)");


            Button btn          = (Button)sender;
            String sourcestring = btn.Name;
            // Retrouver le bouton et le changer de couleur puis le bloquer
            MatchCollection mc = re.Matches(sourcestring);

            // 1. lors du premier clic après la génération du formulaire, l'utilisateur doit choisir un chariot qui sera le chariot prioritaire
            // on ne comptabilise le clic uniquement si la personne a bien cliqué un chariot
            if (nbChariotsClick == 0 && Program.entrepot.cell[int.Parse(mc[0].Groups[2].Value), int.Parse(mc[0].Groups[1].Value)] == 2)
            {
                // on choisit le chariot prioritaire
                Chariot_p     = new Chariot_prioritaire(int.Parse(btn.Text), int.Parse(mc[0].Groups[1].Value), int.Parse(mc[0].Groups[2].Value), "Est", 0);
                btn.BackColor = Color.Gold;
                btn.Refresh();
                // on augmente la valeur du clic que si la personne a bien choisi un chariot
                nbChariotsClick++;
                Consigne_LBL.Text = " Etape 2 : Choissisez un colis parmi ceux indiqués";
            }
            //2. après le choix du clic, on choisit un colis qui sera attribué au chariot désigné avant
            // dans ce cas la on ne comptabilise aussi le clic uniquement si la case cliquée est bien un chariot.
            else if (nbChariotsClick == 1 && Est_bien_un_colis(int.Parse(mc[0].Groups[1].Value), int.Parse(mc[0].Groups[2].Value)))
            {
                // on choisit le colis du chariot prioritaire
                btn.BackColor = Color.Gold;
                btn.Refresh();
                // si la personne place mal son colis, on ne doit pas compte ce clic
                nbChariotsClick++;
                Aleatoire_BTN.Visible = true;
                // On utilise les informations du bouton cliqué pour refaire et retrouver le colis
                // on retrouver le colis via une autre fonction selon le principe de séparation des tâches
                string orientation = "";
                if (btn.Text == "N")
                {
                    orientation = "Nord";
                }
                else
                {
                    orientation = "Sud";
                }
                Colis_choisi    = Retrouver_colis_clique(int.Parse(mc[0].Groups[1].Value), int.Parse(mc[0].Groups[2].Value), orientation);
                repartition[0]  = new int[] { Chariot_p.Get_cle_chariot() - 1, Retrouver_indice_colis_clique(Colis_choisi) };
                id_colis_choisi = Retrouver_indice_colis_clique(Colis_choisi);
            }
        }
예제 #5
0
        /// <summary>
        /// Cette fonction permet de placer les chariots le long de la premiere colonne lorsque la personne souhaite commencer
        /// à visualiser le déplacement de tous les chariots. Les paramètres sont les paramètres habituels de gestion des evemenemts. Cette fonction
        /// ne renvoie aucun paramètre.
        /// </summary>
        /// <entree>
        ///     <param name="sender"> information sur le bouton cliqué </param>
        ///     <param name="e"> information sur l'évenement </param>
        /// </entree>
        /// <sortie> aucune </sortie>
        private void Aleatoire_BTN_Click(object sender, EventArgs e)
        {
            // 2. on affiche les chariots sur le diagramme
            Aleatoire_BTN.Visible = false;

            // réparition simple des colis
            // le colis que devait initialement récupére le chariot choisi
            Colis temp1 = tab_colis[Chariot_p.Get_cle_chariot() - 1];

            tab_colis[id_colis_choisi] = temp1;
            tab_colis[Chariot_p.Get_cle_chariot() - 1] = Colis_choisi;

            // on répartie les colis
            Repartition_colis_chariots();
            Affichage_des_objectifs();
            Jouer();
            // on lance tous les déplacements
        }
예제 #6
0
        /// <summary>
        /// Cette fonction utilisé permet de créer un colis de façon aléatoire en utilisant des nombres aléatoires pour les différents paramètres et caractéristiques
        /// d'un colis. Elle renvoie donc le colis qui vient d'être fait. On crée des colis en vérifiant que le nouveau colis n'existe pas déjà dans le tableau de colis
        /// via une autre fonction test. L'orientation d'un colis ne peut être que le Nord ou le Sud pour que le chariot puisse ensuite venir le chercher.
        /// </summary>
        /// <entree>
        /// <   param name="rdn"> Nombre Random qui doit venir des niveaux supérieurs du programme pour avoir des chiffres différents à chaque itération </param>
        ///     <param name="compteur"> le compteur entier k est en paraètres car on doit le donner à une des fonction utilisée dans le code pour assurer l'abscende
        ///         des erreurs quand on essaie d'accèder à un colis qui n'a pas encore été crée.</param>
        ///     </entree>
        /// <returns> On renvoie le colis qui vient d'être crée par cette fonction </returns>
        private Colis Faire_colis(Random rdn, int compteur)
        {
            Colis colis_cree = new Colis();

            do
            {
                rdn = new Random();
                string orientation = "";
                int    aleatoire   = 2 * rdn.Next();
                if (aleatoire <= 1)
                {
                    orientation = "Sud";
                }
                else
                {
                    orientation = "Nord";
                }
                colis_cree = new Colis(Choisir_colonne(rdn), Choisir_ligne(rdn), rdn.Next(0, 10), orientation);
            } while (Doublon(colis_cree, compteur));
            return(colis_cree);
        }
예제 #7
0
        /// <summary>
        /// Cette fonction survient après le clic de l'utilisateur sur le bouton "Valider". L'utilisateur vient de choisir les caractéristiques de son colis.
        /// Suite à cette validation, on vérifie l'emplacement du colis pour voir si cet emplacement est bien valide : que le colis est bien sur une étagère.
        /// Si les informations saisies ne sont pas valides comme : un emplacement hors des cases noires ou une hauteur supérieure à 10m, on informe l'utilisateur
        /// dans une message box de son erreur. Les paramètres du colis proposés par défaut donne bien sur une étagère.
        /// Si l'emplacement est correct, on calcule l'emplacement de fin du chariot en fonction des caractèristique du colis.
        /// Elle prend les paramètres habituels des gestionnnaires d'évènement et n'a pas de sortie.
        /// </summary>
        /// <entree>
        ///     <param name="sender"> informations sur le bouton cliqué </param>
        ///     <param name="e"> informations sur l'evenement </param>
        /// </entree>
        /// <sortie> aucune </sortie>
        private void Valider_BTN_Click(object sender, EventArgs e)
        {
            if (Est_un_colis(int.Parse(Colis_TB.Text), int.Parse(Colis_Localisation_TB.Text)) && int.Parse(Colis_Hauteur_TB.Text) < 11)
            {
                //1.l'emplacement du début
                Emplacement depart   = new Emplacement(Chariot_choisi._x, Chariot_choisi._y, Chariot_choisi._orientation, int.Parse(Colis_Hauteur_TB.Text));
                string      position = Chariot_choisi._x + "." + Chariot_choisi._y;
                Program.entrepot.cell[Chariot_choisi._y, Chariot_choisi._x] = 0;
                // colorer le bon bouton
                Button btn = (Button)this.Controls.Find(position, true)[0];
                btn.BackColor = Color.Blue;

                // quand la personne a choisi les caractéristiques de son colis
                string orientation = "";
                try { orientation = Orientation_LIST.SelectedItem.ToString(); }
                catch { orientation = "Nord"; }
                tab_colis[nb_colis] = new Colis(int.Parse(Colis_TB.Text), int.Parse(Colis_Localisation_TB.Text), int.Parse(Colis_Hauteur_TB.Text), orientation);

                // colorer le colis
                string position_2 = int.Parse(Colis_TB.Text) + "." + int.Parse(Colis_Localisation_TB.Text);
                Button btn_2      = (Button)this.Controls.Find(position_2, true)[0];
                btn_2.BackColor = Color.Green;
                if (orientation == "Nord")
                {
                    btn_2.Text = "N";
                }
                else
                {
                    btn_2.Text = "S";
                }
                btn_2.Refresh();

                // 2.trouver l'emplacement d'arrivée
                // en fonction de l'orientation du colis, l'emplacement n'est pas le même
                Emplacement arrivee = new Emplacement();

                // si le colis est au nord, alors le chariot doit se placer sur la case en dessus soit -1 dans la matrice
                if (tab_colis[nb_colis]._orientation == "Nord")
                {
                    arrivee.SetY(tab_colis[nb_colis]._y - 1);
                }
                else
                {
                    arrivee.SetY(tab_colis[nb_colis]._y + 1);
                }
                // la position en x ne change pas
                arrivee.SetX(tab_colis[nb_colis]._x);

                // on fait appel à la fonction pour nous trouver
                nul    = new Graph(arrivee, depart);
                chemin = nul.RechercheSolutionAEtoile();

                // on enleve les controles lors du remplissage du colis
                Valider_BTN.Visible           = false;
                Orientation_LBL.Visible       = false;
                Orientation_LIST.Visible      = false;
                Colis_hauteur_LBL.Visible     = false;
                Colis_Hauteur_TB.Visible      = false;
                Colis_Localisation_TB.Visible = false;
                Colis_Position_LBL.Visible    = false;
                Colis_Position_y_LBL.Visible  = false;
                Colis_TB.Visible    = false;
                Details_BTN.Visible = true;

                Consigne_LBL.Text = "Etape 5 : Evaluer le chemin";
                Final_LBL.Visible = true;
                // si le chemin est null, c'est qu'il n'y a pas de solution pour que le colis puise être pris par le chariot
                if (chemin.Count == 0)
                {
                    Final_LBL.Text       = "Pas de solution possible pour ce chemin";
                    Final_LBL.Visible    = true;
                    Nv_colis_BTN.Visible = true;
                }
                else
                {
                    Deplacement_chariots();
                    //  le bouton du début est en bleu foncé alors que le chariot est en bleu clair
                    btn.BackColor = Color.Blue;
                    double cout = ((Emplacement)chemin[chemin.Count - 1]).GetGCost();
                }
                // s'il n'y a pas de solution, on n'affiche pas le calcul du retour à la plateforme.
                if (chemin.Count > 0)
                {
                    Depot_BTN.Visible = true;
                }

                UnableChariots();
            }
            else
            {
                // si l'utilisateur a mal choisi l'emplacement de son colis
                string       message = "La position du colis ne correspond pas à la disposition de l'entrepot : il doit être sur une étagère et à une hauteur inférieure ou égal à 10.";
                string       caption = "Error Detected in Input";
                DialogResult result  = MessageBox.Show(message, caption);
            }
        }