public List<String> getYol(string basalangic, string bitis , Graph graph) { List<String> yol = new List<String>(); yol.Add(bitis); foreach (Node n in graph.Nodes.Values) { if (n.parent != null) { if (n.Name == bitis) { Node temp = n; while (temp.parent.Name != basalangic) { yol.Add(temp.parent.Name); temp = temp.parent; } break; } } } return yol; }
public IDictionary<string, double> CalculateDistances(Graph graph, string startingNode) { if (!graph.Nodes.Any(n => n.Key == startingNode)) throw new ArgumentException("Starting node must be in graph."); InitialiseGraph(graph, startingNode); ProcessGraph(graph, startingNode); return ExtractDistances(graph); }
private void ProcessGraph(Graph graph, string startingNode) { bool finished = false; var queue = graph.Nodes.Values.ToList(); while (!finished) { Node nextNode = queue.OrderBy(n => n.DistanceFromStart).FirstOrDefault(n => !double.IsPositiveInfinity(n.DistanceFromStart)); if (nextNode != null) { ProcessNode(nextNode, queue); queue.Remove(nextNode); } else { finished = true; } } }
private void InitialiseGraph(Graph graph, string startingNode) { foreach (Node node in graph.Nodes.Values) node.DistanceFromStart = double.PositiveInfinity; graph.Nodes[startingNode].DistanceFromStart = 0; }
private IDictionary<string, double> ExtractDistances(Graph graph) { return graph.Nodes.ToDictionary(n => n.Key, n => n.Value.DistanceFromStart); }
public override bool devam(GameData f1) { durum3SaldiriIndexleri.Clear(); if (southAmericaBendeMi(f1)) { //Ordusu diğerlerinin toplamından buyuk olduğunda her tarafa saldıracak... if (getToplamDusmanSayisi(f1)/2 < f1.players[f1.turn].getTotalNumberOfArmies()) { foreach (Bolge b in f1.players[f1.turn].bolgeler) { foreach (Bolge komsu in b.komsular) { if (b.ordu.askerSayisi > komsu.ordu.askerSayisi && b.sahip != komsu.sahip) { return true; } } } return false; } else { return false; } } else//Güney Amerikayı ele geçirmeye çalışacak... { if (southAmericadaToprakVarMi(f1)!=-1) { foreach (Bolge b in f1.players[f1.turn].bolgeler) { if (getKomsuDusmanSayisi(b) > 0) { foreach (Bolge b2 in b.komsular) { if (b2.sahip != b.sahip) { if (b.ordu.askerSayisi > b2.ordu.askerSayisi+10 && buBolgeGuneyAmerikadaMi(b2)) { return true; } } } } } } else//Guney Amerikada Toprak yoksa... { Graph graph = new Graph(); foreach (Bolge b in f1.bolgeler) { graph.AddNode(b.index.ToString()); } foreach (Bolge b in f1.bolgeler) { foreach (Bolge b2 in b.komsular) { if (b2.sahip != f1.players[f1.turn]) { graph.AddConnection(b.index.ToString(), b2.index.ToString(), b2.ordu.askerSayisi, false); } } } var calculator = new DistanceCalculator(); var distances = calculator.CalculateDistances(graph, getEnGucluBolgemIndex(f1).ToString()); // Start from "G" String temp = ""; //SA Sınırları List<int> gaSinirlari = new List<int>(); gaSinirlari.Add(0); gaSinirlari.Add(0); foreach (var d in distances) { temp += d.Key + " - " + d.Value + "-"; if (d.Key == "9") { gaSinirlari[0] = (int)d.Value; } if (d.Key == "11") { gaSinirlari[1] = (int)d.Value; } } int min = gaSinirlari.Min(); int minIndex = gaSinirlari.IndexOf(min); int minBolgeIndex = 0; if (minIndex == 0) { minBolgeIndex = 9; } if (minIndex == 1) { minBolgeIndex = 11; } List<String> gidilecekyol = new List<String>(); //calculator = new DistanceCalculator(); gidilecekyol = calculator.getYol(getEnGucluBolgemIndex(f1).ToString(), minBolgeIndex.ToString(), graph); if (f1.bolgeler[getEnGucluBolgemIndex(f1)].ordu.askerSayisi > min + 10)//Gideceğiz Avrupaya { if (f1.bolgeler[getEnGucluBolgemIndex(f1)].komsular.Contains(f1.bolgeler[Convert.ToInt32(gidilecekyol[gidilecekyol.Count - 1])])) { saldirmaDurumu = 3; durum3SaldiriIndexleri.Add(getEnGucluBolgemIndex(f1)); durum3SaldiriIndexleri.Add(Convert.ToInt32(gidilecekyol[gidilecekyol.Count - 1])); return true; } else { return false; } } else//Biraz daha büyüyeceğiz... { return false; } } return false; } }
public override bool devam(GameData f1) { durum3SaldiriIndexleri.Clear(); saldirmaDurumu = 0; //19-25 arasını almak amaç öncelikle if (avrupaBendeMi(f1))//avrupa onda { foreach (Bolge b in f1.players[f1.turn].bolgeler) { foreach (Bolge komsu in b.komsular) { if (b.ordu.askerSayisi > komsu.ordu.askerSayisi + 10 && b.sahip != komsu.sahip) { saldirmaDurumu = 1; return true; } } } return false; } else if (avrupadaToprakVarMi(f1))//avrupada toprağm var sadece { if (getAvrupadakiAskerSayisi(f1) > getAvrupadakiDusmanSayisi(f1))//Toplam Düşmandan daha fazlaysa Saldırıya geçer //Avrupaya karşı { //Eğer Avrupada tek başına komsusundan güçlü olan varsa saldırırız //Toplamımız daha büyük olabilir ama tek tek hiçbir bölgemiz daha güçlü olmayabilir foreach (Bolge b in f1.players[f1.turn].bolgeler) { if (getKomsuDusmanSayisi(b) > 0) { foreach (Bolge b2 in b.komsular) { if (b2.sahip != b.sahip) { if (b.ordu.askerSayisi > b2.ordu.askerSayisi && buBolgeAvrupadaMi(b2)) { saldirmaDurumu = 2; return true; } } } } } return false; } else//Düşman daha fazlaysa bekler devam etmez { return false; } } else//Avrupayla alakamız yoksa Avrupaya ulaşmaya çalışacağız. { Graph graph = new Graph(); foreach (Bolge b in f1.bolgeler) { graph.AddNode(b.index.ToString()); } foreach (Bolge b in f1.bolgeler) { foreach (Bolge b2 in b.komsular) { if (b2.sahip != f1.players[f1.turn]) { graph.AddConnection(b.index.ToString(), b2.index.ToString(), b2.ordu.askerSayisi, false); } } } var calculator = new DistanceCalculator(); var distances = calculator.CalculateDistances(graph, getEnGucluBolgemIndex(f1).ToString()); // Start from "G" String temp=""; //Avrupa Sınırları List<int> avrupaSinirlari = new List<int>(); avrupaSinirlari.Add(0); avrupaSinirlari.Add(0); avrupaSinirlari.Add(0); avrupaSinirlari.Add(0); foreach (var d in distances) { temp+= d.Key+" - "+d.Value+"-"; if (d.Key == "19") { avrupaSinirlari[0] =(int)d.Value; } if (d.Key == "21") { avrupaSinirlari[1] = (int)d.Value; } if (d.Key == "24") { avrupaSinirlari[2] = (int)d.Value; } if (d.Key == "25") { avrupaSinirlari[3] = (int)d.Value; } } int min = avrupaSinirlari.Min(); int minIndex = avrupaSinirlari.IndexOf(min); int minBolgeIndex = 0; if (minIndex == 0) { minBolgeIndex = 19; } if (minIndex == 1) { minBolgeIndex = 21; } if (minIndex == 2) { minBolgeIndex = 24; } if (minIndex == 3) { minBolgeIndex = 25; } List<String> gidilecekyol = new List<String>(); //calculator = new DistanceCalculator(); gidilecekyol = calculator.getYol(getEnGucluBolgemIndex(f1).ToString(),minBolgeIndex.ToString(), graph); if (f1.bolgeler[getEnGucluBolgemIndex(f1)].ordu.askerSayisi > min + 10)//Gideceğiz Avrupaya { if (f1.bolgeler[getEnGucluBolgemIndex(f1)].komsular.Contains(f1.bolgeler[Convert.ToInt32(gidilecekyol[gidilecekyol.Count - 1])])) { saldirmaDurumu = 3; durum3SaldiriIndexleri.Add(getEnGucluBolgemIndex(f1)); durum3SaldiriIndexleri.Add(Convert.ToInt32(gidilecekyol[gidilecekyol.Count - 1])); return true; } else { return false; } } else//Biraz daha büyüyeceğiz... { return false; } } }