Случайное движение не так случайно

У меня проблема со случайным движением объекта на экране. Это вроде тикает взад и вперед, поэтому его движение вовсе не случайно. Это всего лишь небольшая консольная программа на C#.

namespace MorgSimulator
{
    class Program
    {
        static void Main(string[] args)
        {
            Morg A = new MorgA();
            A.MovingTime();

            Console.ReadKey();
        }
    }
   class Morg
    {
        public Morg()
        {}

        protected MoveBehavior moveBehavior;

        public void MovingTime()
        {
            moveBehavior.move();
        }
 class MorgA : Morg
    {
        public MorgA()
        {
            moveBehavior = new Ooze();
        }
interface MoveBehavior
    {
        void move();
    }
class Ooze : MoveBehavior
    {
        public void move()
        {
            int row = 40, col = 25;
            Console.CursorVisible = false;
            Console.SetCursorPosition(col, row);

            int direction = 0;
            Random r = new Random();

            for (int i = 0; i < 25; i++)   // count of movement
            {
                Console.Write("<(._.)>");
                System.Threading.Thread.Sleep(100);
                Console.Clear();

                direction = r.Next(5);

                while (direction == 0)
                    direction = r.Next(5);

                switch (direction)
                {
                    case 1:
                        if (row + 1 >= 80)
                            row = 0;
                        Console.SetCursorPosition(col, row++);
                        break;
                    case 2:
                        if (row - 1 <= 0)
                            row = 79;
                        Console.SetCursorPosition(col, row--);
                        break;
                    case 3:
                        if (col + 1 >= 50)
                            col = 0;
                        Console.SetCursorPosition(col++, row);
                        break;
                    case 4:
                        if (col - 1 <= 0)
                            col = 49;
                        Console.SetCursorPosition(col--, row);
                        break;
                }
            }
        }
    }

По сути, мне нужно несколько более очевидных и более случайных движений в пределах границ, а не сдвиг назад и вперед в нижней части консоли. Может ли кто-нибудь указать мне правильное направление?

2 ответа

Решение

Случайность - это хорошо, не уверен, почему все так к этому относятся. Ваша проблема в том, что ваша начальная строка 40 - но ваша консоль изначально не открывается с 40 строками, когда она оконная. Таким образом, он рисует его в последней видимой в данный момент строке, вероятно, в строке 20. Вот как ведет себя консоль.

Если вы развернете окно консоли или установите начальный ряд на что-то более низкое, например 10, вы увидите, что он движется так, как вы ожидаете.

Попробуйте сделать Random свойством класса и инициализировать его один раз, а не снова и снова в методе move. Что-то вроде этого...

namespace MorgSimulator
{
    class Program
    {
        static void Main(string[] args)
        {
            Morg A = new MorgA();
            A.MovingTime();

            Console.ReadKey();
        }
    }

    class Morg
    {
        public Morg()
        {}

        protected MoveBehavior moveBehavior;

        public void MovingTime()
        {
            moveBehavior.move();
        }
    }

    class MorgA : Morg
    {
        public MorgA()
        {
            moveBehavior = new Ooze();
        }
    }

    interface MoveBehavior
    {
        void move();
    }

    class Ooze : MoveBehavior
    {
        private readonly Random randomizer;

        public Ooze()
        {
            this.randomizer = new Random();
        }

        public void move()
        {
            int row = 40, col = 25;
            Console.CursorVisible = false;
            Console.SetCursorPosition(col, row);

            int direction = 0;

            for (int i = 0; i < 25; i++)   // count of movement
            {
                Console.Write("<(._.)>");
                System.Threading.Thread.Sleep(100);
                Console.Clear();

                direction = this.randomizer.Next(5);

                while (direction == 0)
                    direction = this.randomizer.Next(5);

                switch (direction)
                {
                    case 1:
                        if (row + 1 >= 80)
                            row = 0;
                        Console.SetCursorPosition(col, row++);
                        break;
                    case 2:
                        if (row - 1 <= 0)
                            row = 79;
                        Console.SetCursorPosition(col, row--);
                        break;
                    case 3:
                        if (col + 1 >= 50)
                            col = 0;
                        Console.SetCursorPosition(col++, row);
                        break;
                    case 4:
                        if (col - 1 <= 0)
                            col = 49;
                        Console.SetCursorPosition(col--, row);
                        break;
                }
            }
        }
    }
}
Другие вопросы по тегам