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); } }
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); } }
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); } }