随机运动不是那么随机

时间:2015-10-12 21:19:31

标签: c# random console

我遇到了屏幕上某个对象随机移动的问题。它有点来回嘀嗒,所以它的运动根本不是随机的。这只是一个小型的C#控制台程序。

Dim b As Byte() = Convert.FromBase64String(strModified)
strTextOrFile = System.Text.Encoding.UTF8.GetString(b)

基本上,我希望在界限内有一些明显且更随机的动作,而不是在控制台底部来回移动。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

“随机”很好,不知道为什么每个人都会这样做。你的问题是你的初始行是40 - 但你的控制台在窗口时最初不会打开40行。所以它将它绘制在当前可见的最后一行,可能是第20行。这就是控制台的行为方式。

如果你最大化你的控制台窗口,或者将你的初始行设置为更低的值,比如10,你会看到它按预期移动。

答案 1 :(得分:0)

尝试在类上创建一个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;
                }
            }
        }
    }
}