正在移动控制台中的光点



我想知道这件事。如何在Console中将一个符号从一侧移动到另一侧。我有在控制台上移动blip的函数walk()。它使用基本的条件系统,并将速度值添加到位置。但问题是:当我想从0,0移动到60,80时,它的行为是这样的。当它到达最小位置(60)时,它通常会以对角线的方式移动。然后它将在Y坐标上滑动到80。因此:直到60岁;60将其以对角线方式滑动。当它达到60时,它将停留在x60并滑动到y80。但这是合乎逻辑的。我想找到一种在出发地和目的地之间滑动的方式,而不挂coords。我的英语。以下是视频:https://dl.dropboxusercontent.com/u/89067882/problem.avi视频解释了一切。

这里有一个示例,演示了如何使blip以预定义的速度和更新间隔移动。运行它,看看会发生什么。。。

*我在System.Drawing中添加了一个引用,以便使用Point结构。

像@Arsalan00一样,我们首先计算从A到B所需的X和Y的变化。然后,给定预定义的速度,我们计算在A和B之间移动距离所需的时间。接下来,我们使用循环和Stopwatch类来确定自开始移动blip以来经过了多少时间,并使用Sleep()暂停预定义的更新间隔时间。根据秒表的运行时间,我们可以计算出运行时间占所需总行程时间的"百分比"。通过时间百分比,我们可以计算出沿着X和Y的计算变化我们应该在多大程度上,并将其添加到起点:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Diagnostics;
namespace ConsoleApplication1
{
    class Program
    {
        public const double MillisecondsBetweenMoves = (double)100;
        public const double DistancePerSecond = (double)10;
        static void Main(string[] args)
        {
            Point ptStart = new Point(0, 0);
            Point ptStop = new Point(70, 15);
            int deltaX = ptStop.X - ptStart.X;
            int deltaY = ptStop.Y - ptStart.Y;
            double DistanceToTravel = Math.Sqrt((deltaX * deltaX) + (deltaY * deltaY));
            Console.Clear();
            Console.SetCursorPosition(ptStart.X, ptStart.Y);
            Console.Write("a");
            Console.SetCursorPosition(ptStop.X, ptStop.Y);
            Console.Write("b");
            double TimeRequiredInMilliseconds = DistanceToTravel / DistancePerSecond * (double)1000;
            Stopwatch SW = new Stopwatch();
            SW.Start();
            while (SW.ElapsedMilliseconds < TimeRequiredInMilliseconds)
            {
                System.Threading.Thread.Sleep((int)MillisecondsBetweenMoves);
                Point position = new Point(
                    ptStart.X + (int)((double)SW.ElapsedMilliseconds / TimeRequiredInMilliseconds * (double)deltaX),
                    ptStart.Y + (int)((double)SW.ElapsedMilliseconds / TimeRequiredInMilliseconds * (double)deltaY)
                    );
                Console.Clear();
                Console.SetCursorPosition(ptStart.X, ptStart.Y);
                Console.Write("a");
                Console.SetCursorPosition(ptStop.X, ptStop.Y);
                Console.Write("b");
                Console.SetCursorPosition(position.X, position.Y);
                Console.Write("X");
            }
            Console.Clear();
            Console.SetCursorPosition(ptStart.X, ptStart.Y);
            Console.Write("a");
            Console.SetCursorPosition(ptStop.X, ptStop.Y);
            Console.Write("b");
            Console.SetCursorPosition(ptStop.X, ptStop.Y);
            Console.Write("X");
            Console.ReadLine();
        }
    }
}

计算水平距离和垂直距离。将它们按比例排列,即垂直/水平。用这个比例来决定你朝某个方向前进的机会。

例如,如果水平距离为40,垂直距离为20,则该比率为0.5。这意味着每1次水平移动需要进行0.5次垂直移动,或者每2次水平移动需进行1次垂直移动。这样做直到你到达离目的地很近的地方。之后,使用常规walk()函数遍历接下来的2,3个街区。

最新更新