Esempio n. 1
0
        /**
         * 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);
        }
Esempio n. 2
0
        /* ---------------------------------- 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);
        }
Esempio n. 3
0
        /* ---------------------------------- 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;
            }
        }
Esempio n. 4
0
        /**
         * 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);
                    }
                }
            }
        }