/** * This Function Over On The Childrens , And Neighbors Nodes Of Current Node. **/ public List <Node> Neighbors_Function(Node Current, List <Node> List_Of_Nodes) { Point Center_Point_Of_Node = Current.Get_Centre_Node(); List <Node> Neighbors_Nodes = new List <Node>(); foreach (Node Specific_Node in List_Of_Nodes) { if (((Center_Point_Of_Node.X - Sqaure_Size) == Specific_Node.Get_Centre_Node().X) && (Center_Point_Of_Node.Y == Specific_Node.Get_Centre_Node().Y)) { Neighbors_Nodes.Add(Specific_Node); } else if ((Center_Point_Of_Node.X == Specific_Node.Get_Centre_Node().X) && ((Center_Point_Of_Node.Y - Sqaure_Size) == Specific_Node.Get_Centre_Node().Y)) { Neighbors_Nodes.Add(Specific_Node); } else if ((Center_Point_Of_Node.X == Specific_Node.Get_Centre_Node().X) && ((Center_Point_Of_Node.Y + Sqaure_Size) == Specific_Node.Get_Centre_Node().Y)) { Neighbors_Nodes.Add(Specific_Node); } else if (((Center_Point_Of_Node.X + Sqaure_Size) == Specific_Node.Get_Centre_Node().X) && (Center_Point_Of_Node.Y == Specific_Node.Get_Centre_Node().Y)) { Neighbors_Nodes.Add(Specific_Node); } } /* Remain Only The Sibilngs That With Gray / Gold Color */ foreach (Node Specific_Neighbor in Neighbors_Nodes.ToList()) { if (Specific_Neighbor.Get_Color().CompareTo("Black") == 0) { Neighbors_Nodes.Remove(Specific_Neighbor); } } /* Set Property Of Number Of Neighbors */ Current.Set_Number_Of_Neighbors(Neighbors_Nodes.Count); return(Neighbors_Nodes); }
/* ---------------------------------- Not In Used --------------------------------------- */ /** * This Function Check The Number Of Neighbors. **/ public int Check_Number_Of_Neighbors(Node Local_Node, List <Node> List_Of_Nodes) { Point Center_Point_Of_Node = Local_Node.Get_Centre_Node(); List <Node> Neighbors_Nodes = new List <Node>(); foreach (Node Specific_Node in List_Of_Nodes) { if (((Center_Point_Of_Node.X - Sqaure_Size) == Specific_Node.Get_Centre_Node().X) && (Center_Point_Of_Node.Y == Specific_Node.Get_Centre_Node().Y)) { Neighbors_Nodes.Add(Specific_Node); } else if ((Center_Point_Of_Node.X == Specific_Node.Get_Centre_Node().X) && ((Center_Point_Of_Node.Y - Sqaure_Size) == Specific_Node.Get_Centre_Node().Y)) { Neighbors_Nodes.Add(Specific_Node); } else if ((Center_Point_Of_Node.X == Specific_Node.Get_Centre_Node().X) && ((Center_Point_Of_Node.Y + Sqaure_Size) == Specific_Node.Get_Centre_Node().Y)) { Neighbors_Nodes.Add(Specific_Node); } else if (((Center_Point_Of_Node.X + Sqaure_Size) == Specific_Node.Get_Centre_Node().X) && (Center_Point_Of_Node.Y == Specific_Node.Get_Centre_Node().Y)) { Neighbors_Nodes.Add(Specific_Node); } } /* Remain Only The Sibilngs That With Gray / Gold Color */ foreach (Node Specific_Neighbor in Neighbors_Nodes.ToList()) { if (Specific_Neighbor.Get_Color().CompareTo("Black") == 0) { Neighbors_Nodes.Remove(Specific_Neighbor); } } /* Return The Number Of The Node's */ return(Neighbors_Nodes.Count); }
/* ---------------------------------- A Star Algorithm ---------------------------------- */ /** * This Function Is The Original AI A* Function. **/ public void A_Star(List <Node> List_Of_Nodes) { /* List <Node> */ List <Node> Open_List = new List <Node>(); List <Node> Close_List = new List <Node>(); /* Current Node */ Node Current = null; if (List_Of_Nodes.Count > 0) { Current = List_Of_Nodes[0]; } Open_List.Add(Current); while (Open_List.Count > 0 && Close_List.Contains(List_Of_Nodes[List_Of_Nodes.Count - 1]) == false) { /* Assign For Finding The Minimum Value */ Current = Open_List[0]; if (Open_List.Count > 1) { /* Find The Min (H + G) Value */ foreach (Node Specific_Node in Open_List) { /** ----- Note ----- * This 'If Statement' Prevent From Us To Check Node With Himself. **/ if (Specific_Node.Get_Number_Of_Node().CompareTo(Current.Get_Number_Of_Node()) != 0) { if ((Current.Get_G_Function() + Current.Get_H_Function()) >= (Specific_Node.Get_H_Function() + Specific_Node.Get_G_Function())) { Current = Specific_Node; } } } } /* Remove The Item From The Open List */ Open_List.Remove(Current); /* Add The Item To The Close List */ Close_List.Add(Current); /* Loop Throught The Node's Children And Siblings */ foreach (Node Specific_Node in Neighbors_Function(Current, List_Of_Nodes)) { if (Close_List.Contains(Specific_Node) == true) { /* Continue To The Next Iteration */ continue; } /* Otherwise , If It is Already In The Open List */ if (Open_List.Contains(Specific_Node) == true) { /* Check If We Beat The G Function Score */ int New_G_Function = Current.Get_G_Function() + Current.Move_Cost(); /* Update The Node To Have a New Parent */ if (Specific_Node.Get_G_Function() > New_G_Function) { Specific_Node.Set_G_Function(New_G_Function); Specific_Node.Set_Parent(Current); } } /* If Its Isn't In The Open List , Calculate The G , H Score For The Node */ else { Specific_Node.Set_G_Function(Current.Get_G_Function() + Current.Move_Cost()); Specific_Node.Set_H_Function(Manhatten_Function(List_Of_Nodes[0], Specific_Node, List_Of_Nodes[List_Of_Nodes.Count - 1])); Specific_Node.Set_Parent(Current); Open_List.Add(Specific_Node); } } } /* If We In The Last Point , We Return The Optimal Path */ if (Current == List_Of_Nodes[List_Of_Nodes.Count - 1]) { Final_Path = new List <Node>(); while (Current.Get_Parent() != null) { Final_Path.Add(Current); Current = Current.Get_Parent(); } Final_Path.Add(Current); Final_Path.Reverse(); return; } else { /* Show Error Message To The User */ MessageBox.Show("We Cant Get To The Last Point , So Its Mean That We Don't Have Path In This Board !", "Please , Try To Show Another Board", MessageBoxButtons.OK, MessageBoxIcon.Error); /* Update - Flag */ Cant_Get_To_Last_Point = true; } }
/** * In This Function We Make The AI ===> A Star. * In Each Step We Calculate , What Is The Bost Move That We Can Make. **/ private void Button_Show_Steps_Click(object sender, EventArgs e) { /* Boolean For - Exception Case */ bool We_Have_Obstacle_In_Final_Path = false; /* Boolean For Gold - Square */ bool Gold_Square_Exist = false; Button Local_Button = (Button)sender; Local_Button.Enabled = false; /* Calling To The A* Function */ A_Star(List_Of_Nodes); if (Cant_Get_To_Last_Point == false) { /* Check If We Have Black Node */ foreach (Node Specific_Node in Final_Path) { if (Specific_Node.Get_Color().CompareTo("Black") == 0) { We_Have_Obstacle_In_Final_Path = true; /* Show Error Message To The User */ MessageBox.Show("In The Final Path , We Have Obstacle Square's - It's Mean Error In The Code !", "Please , Try To Show Another Board", MessageBoxButtons.OK, MessageBoxIcon.Error); /* Give To The User The Possibility To Show The Steps Again */ Button_Show_Steps.Enabled = true; break; } if (Specific_Node.Get_Color().CompareTo("Gold") == 0) { Gold_Square_Exist = true; } } if (We_Have_Obstacle_In_Final_Path == false) { /* Draw The Path From The Start Until The End Of The Board */ Graphics Board_Graphic = Panel_Obstacle_Board.CreateGraphics(); Pen Pen_Graphics = new Pen(Color.White, 10); SolidBrush Solid_Brush_Red = new SolidBrush(Color.Red); SolidBrush Solid_Brush_Green = new SolidBrush(Color.Green); SolidBrush Solid_Brush_Gray = new SolidBrush(Color.Gray); SolidBrush Solid_Brush_Black = new SolidBrush(Color.Black); SolidBrush Solid_Brush_Yellow = new SolidBrush(Color.Yellow); foreach (Node Specific_Node in List_Of_Nodes) { if (Final_Path.Contains(Specific_Node) == true) { Board_Graphic.DrawLines(Pen_Graphics, Specific_Node.Get_Points()); Board_Graphic.DrawPolygon(Pen_Graphics, Specific_Node.Get_Points()); if ((Specific_Node.Get_Color().CompareTo("Gray") == 0) || (Specific_Node.Get_Color().CompareTo("Gold") == 0)) { Board_Graphic.FillPolygon(Solid_Brush_Yellow, Specific_Node.Get_Points()); } else if (Specific_Node.Get_Color().CompareTo("Green") == 0) { Board_Graphic.FillPolygon(Solid_Brush_Green, Specific_Node.Get_Points()); } else if (Specific_Node.Get_Color().CompareTo("Red") == 0) { Board_Graphic.FillPolygon(Solid_Brush_Red, Specific_Node.Get_Points()); } } else { Board_Graphic.DrawLines(Pen_Graphics, Specific_Node.Get_Points()); Board_Graphic.DrawPolygon(Pen_Graphics, Specific_Node.Get_Points()); if (Specific_Node.Get_Color().CompareTo("Black") == 0) { Board_Graphic.FillPolygon(Solid_Brush_Black, Specific_Node.Get_Points()); } else if (Specific_Node.Get_Color().CompareTo("Gray") == 0) { Board_Graphic.FillPolygon(Solid_Brush_Gray, Specific_Node.Get_Points()); } else if (Specific_Node.Get_Color().CompareTo("Gold") == 0) { Board_Graphic.FillPolygon(new SolidBrush(Color.Gold), Specific_Node.Get_Points()); } } /* -------------------- Note In Used ----------------- */ /** ----- Write The Calculation Inside Each Sqaure ----- * Board_Graphic.DrawString((Specific_Node.Get_G_Function() + Specific_Node.Get_H_Function()).ToString(), * new Font("David", 5), * Brushes.Black, Specific_Node.Get_Centre_Node().X, * Specific_Node.Get_Centre_Node().Y); **/ /* --------------------------------------------------- */ } /* Check The Flag Of - Gold Square */ if (Gold_Square_Exist == true) { /* Show Error Message To The User */ MessageBox.Show("Congratulations! You've Passed On Gold Square !", "Congratulations!", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } }