public static int AFFF; //статическое пля для перехода в форму "старт" public FormGame() { InitializeComponent(); // условная высота поля H = (Size.Height - 2 * SystemInformation.CaptionHeight) / sConst * sConst; // условная ширина поля W = (Size.Width - 2 * SystemInformation.FrameBorderSize.Width) / sConst * sConst; if (AFFF == 3) { Paint += new PaintEventHandler(WallBarrier); //прорисовка сетки для 3-го уровня } Paint += new PaintEventHandler(FormGame_Paint); // прорисовка if (AFFF == 1) { Paint += new PaintEventHandler(DrawGrid); //прорисовка сетки для 1-го уровня } KeyDown += new KeyEventHandler(FormGame_KeyDown); // нажатие на кнопки timer.Interval = 120; // таймер срабатывает раз в 120 милисекунд timer.Tick += new EventHandler(timer_Tick); // привязываем обработчик таймера timer.Start(); //добавляем элементы змеи. здесь мы будем приводить координаты к константе размера элемента змеи. // сначала мы координату делем на S ( в нашем случае 10), отбрасываем дробную часть, а потом // умножаем на S - и унас получается координаты кратны размеру элемента змеи snake.Add(new CoordSnake() { X = W / 2 / sConst * sConst, Y = H / 2 / sConst * sConst }); snake.Add(new CoordSnake() { X = W / 2 / sConst * sConst - sConst, Y = H / 2 / sConst * sConst }); snake.Add(new CoordSnake() { X = W / 2 / sConst * sConst - 2 * sConst, Y = H / 2 / sConst * sConst }); // координаты яблока apple = new CoordSnake() { X = rand.Next(20, W - 20) / sConst * sConst, Y = rand.Next(30, H - 20) / sConst * sConst }; // координаты преграды wall = new CoordSnake() { X = rand.Next(Size.Width / sConst) * sConst, Y = rand.Next(Size.Height / sConst) * sConst }; }
public void timer_Tick(object sender, EventArgs e) { int x = snake[0].X, y = snake[0].Y; // координаты головы змеи switch (way) { case Direction.Up: y = y - 10; if (y < 0) { y = H - 10; } break; case Direction.Right: x = x + 10; if (x >= W) { x = 0; } break; case Direction.Down: y = y + 10; if (y >= H) { y = 0; } break; case Direction.Left: x = x - 10; if (x < 0) { x = W - 10; } break; } CoordSnake c = new CoordSnake() { X = x, Y = y }; // сегмент с новыми координатами головы snake.Insert(0, c); // вставляем его в начало списка сегментов змеи(змея выросла на один сегмент) for (int i = 0; i < wConst; i++) //проверка на пересечение с препятствием { if (snake[0].X == barrier[i].X && snake[0].Y == barrier[i].Y) { timer.Stop(); MessageBox.Show($"К сожалению вы поиграли. Но вы набрали {apples} яблок", "Инфа", MessageBoxButtons.OK); Close(); } } if (snake[0].X == apple.X && snake[0].Y == apple.Y) // если координаты головы и яблока совпали { // располагаем яблоко в новых случайных координатах apple = new CoordSnake() { X = rand.Next(20, W - 20) / sConst * sConst, Y = rand.Next(30, H - 20) / sConst * sConst }; apples++; // увеличиваем счетчик собранных яблок if (apples % 5 == 0) // после каждого пятого яблока увеличиваем скорость { timer.Interval -= 10; } } // если координаты головы и яблока не совпали - убираем последний сегмент змеи else { snake.RemoveAt(snake.Count - 1); } Invalidate(); // перерисовываем, }