このことを知りたい。コンソールで 1 つのシンボルを一方の側から他方の側に移動する方法。コンソールでブリップを移動するための関数 walk() があります。基本的な条件システムを使用し、位置に速度値を追加します。しかし、これが問題です。0、0 から 60、80 に移動したい場合、このように動作します。最小位置 (60) に達すると、通常は斜めに移動します。次に、Y 座標で 80 にスライドします。60 の位置で斜めにスライドします。60 に達すると、x60 にとどまり、y80 にスライドします。しかし、それは論理的です。座標をぶら下げることなく、出発地と目的地の間をスライドする方法を見つけたいです。うーん、私の英語。ビデオはこちら: https://dl.dropboxusercontent.com/u/89067882/problem.avi ビデオですべてが説明されています。
2 に答える
水平距離と垂直距離を計算します。それらから比率を作成します。つまり、垂直/水平です。その比率を使用して、ある方向に移動する可能性を決定します。
たとえば、水平距離が 40 で垂直距離が 20 の場合、比率は 0.5 になります。つまり、1 回の水平移動ごとに 0.5 回の垂直移動、または 2 回の水平移動ごとに 1 回の垂直移動が必要です。目的地に非常に近づくまでこれを行います。その後、通常の walk() 関数を使用して、次の 2,3 ブロックを歩きます。
これは、事前定義された速度と更新間隔でブリップを動かす方法を示す例です。実行して、何が起こるか見てみましょう...
※構造体が使えるようにSystem.Drawingへの参照Point
を追加しました。
@Arsalan00 のように、最初に A から B に到達するために必要な X と Y の変化を計算します。次に、事前に定義された速度を考慮して、A と B の間の距離を移動するのに必要な時間を計算します。次に、ループとStopwatch
クラスを使用して、ブリップの移動を開始してから経過した時間を判断し、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();
}
}
}