//TODO: Слишком много явных приведений к типу и циклов. Стена текста. Попробуй вместо массива использовать коллекцию типа списка. //TODO: Тогда это все может сократиться до пары циклов foreach или LINQ-запросов private void Form1_Paint(object sender, PaintEventArgs e) { if (_level == 0) { change_Form1(true); } else if (_level == 1) { for (var i = 0; i < _cur; ++i) { _obj[i].Paint(e.Graphics, WIDTH); } var xLast = _obj[_cur - 1].X; var yLast = _obj[_cur - 1].Y; //TODO: Двигаешь и рисуешь змею одновременно. Неплохо бы разнести эти обязанности for (var i = _cur - 1; i >= 0; --i) { if (_obj[i].GetType() == typeof(Tail)) { var x = _obj[i - 1].X; var y = _obj[i - 1].Y; ((Tail)_obj[i]).Move(x, y); } if (_obj[i].GetType() == typeof(Head)) { ((Head)_obj[i]).Move(); for (var j = 0; j < _cur; ++j) { if (i != j) { if (_obj[i].X == _obj[j].X && _obj[i].Y == _obj[j].Y) { if (_obj[j].GetType() == typeof(Meal)) { _cnt++; _obj[j] = new Meal(_rnd); _obj[_cur++] = new Tail(xLast, yLast); } else { _level = 0; var t = new Form2(_step * 10 + _cnt); t.Show(); } } } } } } if (_cnt == SZ) { _step++; UpdStep(); } Invalidate(); Thread.Sleep(100 - _step * 5); } else if (_level == 2) { change_Form1(false); } else { change_Form1(false); } }
static void Main(string[] args) { Console.CursorVisible = false; // usuniecie migajacego kursora bool exit = false; double frameRate = 1000 / 5.0; DateTime lastDate = DateTime.Now; Meal meal = new Meal(); Snake snake = new Snake(); //game loop while (!exit) { if (Console.KeyAvailable) { ConsoleKeyInfo input = Console.ReadKey(); switch (input.Key) { case ConsoleKey.Escape: exit = true; break; case ConsoleKey.LeftArrow: snake.Direction = Direction.Left; break; case ConsoleKey.RightArrow: snake.Direction = Direction.Right; break; case ConsoleKey.UpArrow: snake.Direction = Direction.Up; break; case ConsoleKey.DownArrow: snake.Direction = Direction.Down; break; } } } if ((DateTime.Now - lastDate).TotalMilliseconds >= frameRate) { //game action snake.Move(); if (meal.CurrentTarget.X == snake.HeadPosition.X && meal.CurrentTarget.Y == snake.HeadPosition.Y) { snake.EatMeal(); meal = new Meal(); frameRate /= 1.1; } if (snake.GameOver) { Console.Clear(); Console.WriteLine($"GAME OVER. YOUR SCORE IS: {snake.Lenght}"); exit = true; Console.ReadLine(); } lastDate = DateTime.Now; } }