// Функция, здесь перегруженная, pапускает переназначение координат от хвоста до первого элемента за головой. сделана, чтобы обозначить логику происходящего public override void Set_New_Coords() { m_Last_Position = Location; Location = Next_Block.Location; Next_Block.Set_New_Coords(); }
// Одна "итерация " в процессе игры 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); }
} //Проверка, не наткнулась ли змея на препятствия // Переназначаем координаты private void Set_New_Coords(S_Location a_location) { // Начинаем с хвоста m_Snake.Begin_To_Replace_Coords(); // а теперь точно даем голове ее новые координаты m_Snake.Set_Heads_New_Coords(a_location); }
// Добавление нового куска еды 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); }
// Функция, которая по заданным координатам возвращает клетку из списка 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"); }
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(); }
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); } //Проверка, не наткнулась ли змея на препятствия
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); } } }
// Функция рисования 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); }
// С учетом текущего направления выдает новую позицию голову змеи 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); }
public S_Location(S_Location a_Location) { x = a_Location.X; y = a_Location.Y; }
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) { }
public S_Food(S_Location aLocation) : base(aLocation) { }
private S_Location m_Location; // Координаты объекта на игровой доске #endregion Fields #region Constructors public S_Object_on_board(S_Location aLocation) { m_Location = aLocation; Draw_the_object(); }
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); } } }
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; }
// Функция, которая по заданным координатам возвращает клетку из списка 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"); }
// Задать голове новые координаты public void Set_Heads_New_Coords(S_Location a_location) { m_head.Location = a_location; }
public S_Remain(S_Location aLocation) : base(aLocation) { }
public S_Point_on_Board(S_Location aLocation, bool a_f_isfree = true) { m_Location = aLocation; m_f_isFree = a_f_isfree; }
// Переназначаем координаты private void Set_New_Coords(S_Location a_location) { // Начинаем с хвоста m_Snake.Begin_To_Replace_Coords(); // а теперь точно даем голове ее новые координаты m_Snake.Set_Heads_New_Coords(a_location); }
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; }
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(); }
public S_Head(S_Location a_Location, E_Direction a_Direction) : base(a_Location, a_Direction) { }
public S_Object_on_board(S_Location aLocation) { m_Location = aLocation; Draw_the_object(); }