Ejemplo n.º 1
0
 public bool AddMur(Mur mur, bool noValidation = false)
 {
     if (!Murs.Contains(mur) && (noValidation || MurIsValid(mur)))
     {
         Murs.Add(mur);
         var  case1 = GetCase(mur.Pos);
         Case case2;
         if (mur.IsVertical)
         {
             case2 = GetCase(mur.Pos.GetPositionBas());
             case1.RemoveVoisine(GetCase(case1.Pos.GetPositionGauche()));
             case2.RemoveVoisine(GetCase(case2.Pos.GetPositionGauche()));
         }
         else
         {
             case2 = GetCase(mur.Pos.GetPositionDroite());
             case1.RemoveVoisine(GetCase(case1.Pos.GetPositionHaut()));
             case2.RemoveVoisine(GetCase(case2.Pos.GetPositionHaut()));
         }
         return(true);
     }
     else
     {
         return(false);
     }
 }
Ejemplo n.º 2
0
 public bool RemoveMur(Mur mur)
 {
     if (Murs.Contains(mur))
     {
         Murs.Remove(mur);
         var  case1 = GetCase(mur.Pos);
         Case case2;
         if (mur.IsVertical)
         {
             case2 = GetCase(mur.Pos.GetPositionBas());
             case1.AddVoisine(GetCase(case1.Pos.GetPositionGauche()));
             case2.AddVoisine(GetCase(case2.Pos.GetPositionGauche()));
         }
         else
         {
             case2 = GetCase(mur.Pos.GetPositionDroite());
             case1.AddVoisine(GetCase(case1.Pos.GetPositionHaut()));
             case2.AddVoisine(GetCase(case2.Pos.GetPositionHaut()));
         }
         return(true);
     }
     else
     {
         return(false);
     }
 }
Ejemplo n.º 3
0
    public List <Case> Dikstra(Position from, Direction objectif)
    {
        var hashCode = GetDikstraHashCode(from, objectif);

        if (transposition.ContainsKey(hashCode))
        {
            var a = transposition[hashCode];
            if (a.From != from || a.Objectif != objectif || a.Plateau != this)
            {
                //Console.Error.WriteLine("hashCode colission");
                var result = DikstraCalculation(from, objectif);
                a = new InfoDikstra(from, objectif, result, this);
                transposition[hashCode] = a;
            }

            /*if (a.Plateau != this)
             * {
             *  Console.Error.WriteLine("hashCode colission plateau");
             *  if (a.Plateau.Murs.Count == this.Murs.Count)
             *  {
             *      for (int i = 0; i < this.Murs.Count; i++)
             *      {
             *          Console.Error.WriteLine("Mur " + i + " " + a.Plateau.Murs[i] + " " + this.Murs[i]);
             *      }
             *  }
             *  else
             *  {
             *      Console.Error.WriteLine("Mur count " + a.Plateau.Murs.Count + " " + this.Murs.Count);
             *  }
             *  Console.Error.WriteLine("hashCode colission plateau");
             *  if (a.Plateau.Joueurs.Count == this.Joueurs.Count)
             *  {
             *      for (int i = 0; i < this.Joueurs.Count; i++)
             *      {
             *          Console.Error.WriteLine("Joueurs " + i + " " + a.Plateau.Joueurs[i] + " " + this.Joueurs[i]);
             *      }
             *  }
             *  else
             *  {
             *      Console.Error.WriteLine("Joueurs count " + a.Plateau.Joueurs.Count + " " + this.Joueurs.Count);
             *  }
             * }*/
            return(a.Result);
        }
        else
        {
            var lastMur = Murs.LastOrDefault();
            if (lastMur != null)
            {
                var previousHashCode = hashCode ^ Murs.LastOrDefault().GetHashCode() * 100000000;
                if (transposition.ContainsKey(previousHashCode))
                {
                    //Console.Error.WriteLine("diffenrtiel is enough");
                    bool pathOk         = true;
                    var  previousResult = transposition[previousHashCode].Result;
                    if (lastMur.BloqueCases(GetCase(from), previousResult[0], this))
                    {
                        pathOk = false;
                    }
                    for (int i = 1; i < previousResult.Count && pathOk; i++)
                    {
                        if (lastMur.BloqueCases(previousResult[i - 1], previousResult[i], this))
                        {
                            pathOk = false;
                        }
                    }
                    if (pathOk)
                    {
                        //Console.Error.WriteLine("differentiel found");
                        return(previousResult);
                    }
                }
            }
            var result = DikstraCalculation(from, objectif);
            transposition.Add(hashCode, new InfoDikstra(from, objectif, result, this));
            return(result);
        }
    }