/// <summary> /// Обновляет игру при наступлении следующего хода /// </summary> private void UpdateGameBoard(object o) { TurnNumber++; int nextHeadX = Snake[0].X + _snakeHeadDirection.GetDirectionDX(); int nextHeadY = Snake[0].Y + _snakeHeadDirection.GetDirectionDY(); // Змейка врезалась в стенку if (nextHeadX == -1 || nextHeadX == GameBoardSize.Width || nextHeadY == -1 || nextHeadY == GameBoardSize.Height) { StartGame(); _timerManager.StartTimer(); return; } Snake.Insert(0, new Coordinate(nextHeadX, nextHeadY)); // голова подвинулась int indexOfFood = IndexInCoords(Food, nextHeadX, nextHeadY); if (indexOfFood != -1) // змейка съела еду { Food.RemoveAt(indexOfFood); SpawnNewFood(); } else // обычное перемещение змейки { Snake.RemoveAt(Snake.Count - 1); } _timerManager.ResetStopwatch(); }
/// <summary> /// Проверяет обратное ли текущему переданное направление /// (лево/право) || (верх/низ) /// </summary> /// <returns>true, если обратное</returns> public static bool IsDirectionsContrary(this SnakeDirection dir, SnakeDirection dirToCheckWith) { int curDX = dir.GetDirectionDX(); int otherDX = dirToCheckWith.GetDirectionDX(); int curDY = dir.GetDirectionDY(); int otherDY = dirToCheckWith.GetDirectionDY(); if (curDX == otherDX && curDY == otherDY) // направление совпадает { return(false); } int sumX = otherDX + curDX; int sumY = otherDY + curDY; if (sumX == 0 || sumY == 0) // обратное { return(true); } return(false); }