示例#1
0
        //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);
            }
        }
示例#2
0
        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;
            }
        }