/// <summary> /// Находится ли голова змейки в пределах поля? /// </summary> /// <param name="head">Голова змейки</param> public static bool ГоловаВПределахПоля(SnakeCell head) { // Проверить, что x головы находится в пределах 1..ширина if (head.X < 1 || head.X > Ширина) { return(false); } // Проверить, что y головы находится в пределах 1..высота if (head.Y < 1 || head.Y > Высота) { return(false); } return(true); }
/// <summary> /// Одно движение змейки /// </summary> public void Move() { int lastCell = Cells.Count - 1; // Реализуем рост змеи (добавляем в конец копию последней клетки) if (_grownUp > 0) { SnakeCell tail = Cells[lastCell]; Cells.Add(new SnakeCell(tail.X, tail.Y)); _grownUp--; } // Двигаем все остальные ячейки for (int i = lastCell; i > 0; i--) { Cells[i].X = Cells[i - 1].X; Cells[i].Y = Cells[i - 1].Y; Cells[i].UpdatePictureLocation(); } // Двигаем голову SnakeCell head = Cells[0]; switch (Direction) { case Direction.Up: head.Y--; break; case Direction.Down: head.Y++; break; case Direction.Left: head.X--; break; case Direction.Right: head.X++; break; } head.UpdatePictureLocation(); // Проверяем на самопересечения // Если голова совпала по координатам с другой клеткой, то закачиваем игру for (int i = 1; i < Cells.Count; i++) { if (Cells[i].SamePlace(head)) { _snakeEvents.GameOver("Змейка пересеклась сама с собой!"); _snakeEvents.StartGame(); return; } } if (Поле.ГоловаВПределахПоля(head)) { return; } _snakeEvents.GameOver("За пределами поля!"); _snakeEvents.StartGame(); }