示例#1
0
        // Функция, здесь перегруженная, pапускает переназначение координат от хвоста до первого элемента за головой. сделана, чтобы обозначить логику происходящего
        public override void Set_New_Coords()

        {
            m_Last_Position = Location;
            Location        = Next_Block.Location;
            Next_Block.Set_New_Coords();
        }
示例#2
0
        // Одна "итерация " в процессе игры
        public bool One_iteration()
        {
            m_f_is_Replace_over = false;
            bool a_f_result = true;
            // Проверяем не наткнулась ли змея на чего
            S_Location New_Heads_Location = m_Snake.Get_New_Heads_Coords();

            a_f_result = if_Normal_Moving(New_Heads_Location, m_Snake.Head.Direction);
            if (a_f_result == false)
            {
                return(false);
            }

            // Если все норм, то перераспределем координаты, ставим клеткам на которыъ голова и хвост соответствующее значения о блокировке, и перерисовываем

            Set_New_Coords(New_Heads_Location);
            m_Snake.Draw_Objects();
            m_Snake.Set_New_Values_to_Fields(m_Board);

            // Проверяем, съдена ли еда
            bool f_got_food = Is_Eating_Food();

            if (f_got_food)     // Если да, то надо пристроить еще один блок к телу змеи, в хвост
            {
                Add_new_Block();
                Add_new_Food();
                Speed_Mode();
            }
            m_f_is_Replace_over = true;

            return(a_f_result);
        }
示例#3
0
        }    //Проверка, не наткнулась ли змея на препятствия

        // Переназначаем координаты
        private void Set_New_Coords(S_Location a_location)
        {
            // Начинаем с хвоста
            m_Snake.Begin_To_Replace_Coords();
            // а теперь точно даем голове ее новые координаты
            m_Snake.Set_Heads_New_Coords(a_location);
        }
示例#4
0
        // Добавление нового куска еды
        private void Add_new_Food()
        {
            // Кстати, при добавлении еды, поле на котором она находится, занятым не считается
            S_Location[] array_of_free_locations = m_Board.Get_All_Free_Locations_Fileds();
            int          index = m_random_for_food.Next(array_of_free_locations.Length);
            S_Location   New_Foods_Location = array_of_free_locations[index];

            m_Food = new S_Food(New_Foods_Location);
        }
示例#5
0
        // Функция, которая по заданным координатам возвращает клетку из списка

        public S_Point_on_Board Return_Point(S_Location a_location)
        {
            // через координаты можем посчитать номер этой клетки в списке.
            int number = (a_location.Y) * (m_n_right_bound + 1) + (a_location.X);


            return(m_List_of_Points[number]);

            MessageBox.Show("Game over");
        }
示例#6
0
        public S_Game(S_Main_Wnd a_Window)
        {
            m_Main_Window = a_Window;

            m_Main_Window.chkb_Check_speed_mode.Enabled = false;
            Graphics graph_comp = m_Main_Window.P_Game_board.CreateGraphics();

            graph_comp.Clear(m_Main_Window.P_Game_board.BackColor);
            S_Drawning.Set_graph_comp(graph_comp);
            m_Timer_for_One_Iteration          = new Timer();
            m_Timer_for_One_Iteration.Tick    += m_Timer_for_One_Iteration_Tick;
            m_Timer_for_One_Iteration.Interval = S_Constants.S_Constants.c_n_interval_of_game_timer;
            m_Timer_for_Delay          = new Timer();
            m_Timer_for_Delay.Interval = S_Constants.S_Constants.c_n_iterval_of_delay;
            m_Timer_for_Delay.Tick    += m_Timer_for_Delay_Tick;

            m_f_is_Delay_Over = m_f_is_Replace_over = true;

            Speed_Mode_Delegate SMD;

            if (m_Main_Window.chkb_Check_speed_mode.Checked)
            {
                SMD = Increase_Speed;
            }
            else
            {
                SMD = Do_Nothing;
            }
            Speed_Mode += SMD;


            m_random_for_food = new Random();
            // Пока что делаем так, начальные значения в константы не выносятся
            S_Location S1 = new S_Location(12, 0);
            S_Location S2 = new S_Location(13, 0);
            S_Location S3 = new S_Location(14, 0);
            S_Location S4 = new S_Location(15, 0);

            m_Snake = new S_Snake(E_Direction.Right, S4, S3, S2, S1);

            m_Board = new S_Game_Board(a_Window.P_Game_board, S_Drawning.Size_of_obj);
            m_Board.Set_Points_Value(false, new S_Location[] { S1, S2, S3, S4 });

            Add_new_Food();

            m_n_number_of_points = 0;
            Display_the_Score();
            m_Timer_for_One_Iteration.Start();
        }
示例#7
0
        private bool if_Normal_Moving(S_Location a_location, E_Direction a_direction)
        {
            bool f_result = true;

            // Сперва, проверяем не уткнулась ли она в стены
            switch (a_direction)
            {
            case E_Direction.Left:
                if (a_location.X < m_Board.Left_Bound)
                {
                    f_result = false;
                }
                break;

            case E_Direction.Right:
                if (a_location.X > m_Board.Right_Bound)
                {
                    f_result = false;
                }
                break;

            case E_Direction.Up:
                if (a_location.Y < m_Board.Up_bound)
                {
                    f_result = false;
                }
                break;

            case E_Direction.Down:
                if (a_location.Y > m_Board.Low_bound)
                {
                    f_result = false;
                }
                break;
            }
            if (!f_result)
            {
                return(f_result);
            }
            // Проверим не уткнулась ли она в себя или в свои отходы
            if (m_Board.Return_Point(a_location).Is_Free == false)
            {
                f_result = false;
            }
            return(f_result);
        }    //Проверка, не наткнулась ли змея на препятствия
示例#8
0
        public S_Game_Board(Panel a_panel, int a_n_size_of_block)
        {
            m_n_left_bound  = 0;
            m_n_right_bound = a_panel.Width / a_n_size_of_block - 1;
            m_n_up_bound    = 0;
            m_n_low_bound   = a_panel.Height / a_n_size_of_block - 1;

            // Начнем заполнять лист всеми возможными точками на доске

            m_List_of_Points = new List <S_Point_on_Board>();
            for (int i = 0; i <= m_n_low_bound; i++)
            {
                for (int j = 0; j <= m_n_right_bound; j++)
                {
                    S_Location       New_Location = new S_Location(j, i);
                    S_Point_on_Board New_Point    = new S_Point_on_Board(New_Location);
                    m_List_of_Points.Add(New_Point);
                }
            }
        }
示例#9
0
        // Функция рисования
        public static void Draw_an_item(S_Location a_Location, E_Colors_to_paint a_col)
        {
            Brush brush_to_paint = null;

            switch (a_col)
            {
            case E_Colors_to_paint.Part_of_snake:
                brush_to_paint = s_black_brush;
                break;

            case E_Colors_to_paint.Food:
                brush_to_paint = s_red_brush;
                break;

            case E_Colors_to_paint.Void:
                brush_to_paint = s_white_brush;
                break;
            }

            s_Graphic_comp.FillRectangle(brush_to_paint, a_Location.X * s_nsize_of_obj, a_Location.Y * s_nsize_of_obj, s_nsize_of_obj, s_nsize_of_obj);
        }
示例#10
0
        // С учетом текущего направления выдает новую позицию голову змеи
        public S_Location Get_New_Heads_Coords()
        {
            S_Location New_Location = Location;

            switch (Direction)
            {
            case E_Direction.Left:
                New_Location.X--;
                break;

            case E_Direction.Right:
                New_Location.X++;
                break;

            case E_Direction.Down:
                New_Location.Y++;
                break;

            case E_Direction.Up:
                New_Location.Y--;
                break;
            }
            return(New_Location);
        }
示例#11
0
 public S_Location(S_Location a_Location)
 {
     x = a_Location.X;
     y = a_Location.Y;
 }
示例#12
0
 public S_Tail(S_Location a_Location, E_Direction a_Direction, S_Body_Block a_Next_Body_Block = null)
     : base(a_Location, a_Direction, a_Next_Body_Block)
 {
 }
示例#13
0
 public S_Food(S_Location aLocation)
     : base(aLocation)
 {
 }
示例#14
0
        private S_Location m_Location; // Координаты объекта на игровой доске

        #endregion Fields

        #region Constructors

        public S_Object_on_board(S_Location aLocation)
        {
            m_Location = aLocation;
            Draw_the_object();
        }
示例#15
0
        public S_Game_Board(Panel a_panel, int a_n_size_of_block)
        {
            m_n_left_bound = 0;
                m_n_right_bound = a_panel.Width / a_n_size_of_block - 1;
                m_n_up_bound = 0;
                m_n_low_bound = a_panel.Height / a_n_size_of_block - 1;

                // Начнем заполнять лист всеми возможными точками на доске

                m_List_of_Points = new List<S_Point_on_Board>();
                for (int i = 0; i <= m_n_low_bound; i++)
                {
                    for (int j = 0; j <= m_n_right_bound; j++)
                    {
                        S_Location New_Location = new S_Location(j, i);
                        S_Point_on_Board New_Point = new S_Point_on_Board(New_Location);
                        m_List_of_Points.Add(New_Point);
                    }
                }
        }
示例#16
0
        private bool if_Normal_Moving(S_Location a_location, E_Direction a_direction)
        {
            bool f_result = true;

                // Сперва, проверяем не уткнулась ли она в стены
                switch (a_direction)
                {
                    case E_Direction.Left:
                        if (a_location.X < m_Board.Left_Bound)
                            f_result = false;
                        break;
                    case E_Direction.Right:
                        if (a_location.X > m_Board.Right_Bound)
                            f_result = false;
                        break;
                    case E_Direction.Up:
                        if (a_location.Y < m_Board.Up_bound)
                            f_result = false;
                        break;
                    case E_Direction.Down:
                        if (a_location.Y > m_Board.Low_bound)
                            f_result = false;
                        break;

                }
                if (!f_result)
                    return f_result;
                // Проверим не уткнулась ли она в себя или в свои отходы
                if (m_Board.Return_Point(a_location).Is_Free == false)
                    f_result = false;
                return f_result;
        }
示例#17
0
        // Функция, которая по заданным координатам возвращает клетку из списка
        public S_Point_on_Board Return_Point(S_Location a_location)
        {
            // через координаты можем посчитать номер этой клетки в списке.
                int number = (a_location.Y) * (m_n_right_bound+1) + (a_location.X);

                    return m_List_of_Points[number];

                    MessageBox.Show("Game over");
        }
示例#18
0
        // Функция рисования
        public static void Draw_an_item(S_Location a_Location, E_Colors_to_paint a_col)
        {
            Brush brush_to_paint = null;
            switch (a_col)
            {
                case E_Colors_to_paint.Part_of_snake:
                    brush_to_paint = s_black_brush;
                    break;
                case E_Colors_to_paint.Food:
                    brush_to_paint = s_red_brush;
                    break;
                case E_Colors_to_paint.Void:
                    brush_to_paint = s_white_brush;
                    break;

            }

            s_Graphic_comp.FillRectangle(brush_to_paint, a_Location.X * s_nsize_of_obj, a_Location.Y * s_nsize_of_obj, s_nsize_of_obj, s_nsize_of_obj);
        }
示例#19
0
 public S_Tail(S_Location a_Location, E_Direction a_Direction, S_Body_Block a_Next_Body_Block = null)
     : base(a_Location, a_Direction, a_Next_Body_Block)
 {
 }
示例#20
0
 // Функция, здесь перегруженная, pапускает переназначение координат от хвоста до первого элемента за головой. сделана, чтобы обозначить логику происходящего
 public override void Set_New_Coords()
 {
     m_Last_Position = Location;
         Location = Next_Block.Location;
         Next_Block.Set_New_Coords();
 }
示例#21
0
 // Задать голове новые координаты
 public void Set_Heads_New_Coords(S_Location a_location)
 {
     m_head.Location = a_location;
 }
示例#22
0
 public S_Remain(S_Location aLocation)
     : base(aLocation)
 {
 }
示例#23
0
 public S_Point_on_Board(S_Location aLocation, bool a_f_isfree = true)
 {
     m_Location = aLocation;
     m_f_isFree = a_f_isfree;
 }
示例#24
0
 public S_Location(S_Location a_Location)
 {
     x = a_Location.X;
     y = a_Location.Y;
 }
示例#25
0
 public S_Food(S_Location aLocation)
     : base(aLocation)
 {
 }
示例#26
0
        // Задать голове новые координаты

        public void Set_Heads_New_Coords(S_Location a_location)
        {
            m_head.Location = a_location;
        }
示例#27
0
 public S_Remain(S_Location aLocation)
     : base(aLocation)
 {
 }
示例#28
0
 // Переназначаем координаты
 private void Set_New_Coords(S_Location a_location)
 {
     // Начинаем с хвоста
         m_Snake.Begin_To_Replace_Coords();
         // а теперь точно даем голове ее новые координаты
         m_Snake.Set_Heads_New_Coords(a_location);
 }
示例#29
0
 public S_Body_Block(S_Location a_Location, E_Direction a_Direction, S_Body_Block a_Next_Body_Block = null)
     : base(a_Location)
 {
     m_Direction  = a_Direction;
     m_Next_Block = a_Next_Body_Block;
 }
示例#30
0
        public S_Game(S_Main_Wnd a_Window)
        {
            m_Main_Window = a_Window;

                m_Main_Window.chkb_Check_speed_mode.Enabled = false;
                Graphics graph_comp = m_Main_Window.P_Game_board.CreateGraphics();
                graph_comp.Clear(m_Main_Window.P_Game_board.BackColor);
                S_Drawning.Set_graph_comp(graph_comp);
                m_Timer_for_One_Iteration = new Timer();
                m_Timer_for_One_Iteration.Tick += m_Timer_for_One_Iteration_Tick;
                m_Timer_for_One_Iteration.Interval = S_Constants.S_Constants.c_n_interval_of_game_timer;
                m_Timer_for_Delay = new Timer();
                m_Timer_for_Delay.Interval = S_Constants.S_Constants.c_n_iterval_of_delay;
                m_Timer_for_Delay.Tick += m_Timer_for_Delay_Tick;

                m_f_is_Delay_Over = m_f_is_Replace_over = true;

                Speed_Mode_Delegate SMD;
                if (m_Main_Window.chkb_Check_speed_mode.Checked)
                    SMD = Increase_Speed;
                else
                    SMD = Do_Nothing;
                Speed_Mode += SMD;

                m_random_for_food = new Random();
                // Пока что делаем так, начальные значения в константы не выносятся
                S_Location S1 = new S_Location(12, 0);
                S_Location S2 = new S_Location(13, 0);
                S_Location S3 = new S_Location(14, 0);
                S_Location S4 = new S_Location(15, 0);
                m_Snake = new S_Snake(E_Direction.Right, S4, S3, S2, S1);

                m_Board = new S_Game_Board(a_Window.P_Game_board, S_Drawning.Size_of_obj);
                m_Board.Set_Points_Value(false, new S_Location[] { S1, S2, S3, S4 });

                Add_new_Food();

                m_n_number_of_points = 0;
                Display_the_Score();
                m_Timer_for_One_Iteration.Start();
        }
示例#31
0
 public S_Head(S_Location a_Location, E_Direction a_Direction)
     : base(a_Location, a_Direction)
 {
 }
示例#32
0
 public S_Object_on_board(S_Location aLocation)
 {
     m_Location = aLocation;
     Draw_the_object();
 }
示例#33
0
 public S_Head(S_Location a_Location, E_Direction a_Direction)
     : base(a_Location, a_Direction)
 {
 }
示例#34
0
 public S_Point_on_Board(S_Location aLocation, bool a_f_isfree = true)
 {
     m_Location = aLocation;
     m_f_isFree = a_f_isfree;
 }
示例#35
0
 public S_Body_Block(S_Location a_Location, E_Direction a_Direction, S_Body_Block a_Next_Body_Block = null)
     : base(a_Location)
 {
     m_Direction = a_Direction;
     m_Next_Block = a_Next_Body_Block;
 }