我的任务是模拟人们跑步。
一个是每 300 秒走 2 步,第二个是在 y 秒内走 x 步。
我不想要一个完整的解决方案,而只是想知道哪种机制适合这个以及为什么。
ps - 起初我想使用计时器,但对于第二场比赛,它还不够好。
我的任务是模拟人们跑步。
一个是每 300 秒走 2 步,第二个是在 y 秒内走 x 步。
我不想要一个完整的解决方案,而只是想知道哪种机制适合这个以及为什么。
ps - 起初我想使用计时器,但对于第二场比赛,它还不够好。
您所需要的只是一个公式来计算每个跑步者在特定时间所跑的距离:
runner[n].StepsTraveled = secondsPassed * (runner[n].StepsPerSecond);
无论刷新间隔如何,您都将始终拥有正确的行进距离。您可以使用任何分辨率计时器,甚至可以刷新每个按钮单击。
而且你也不需要多线程。
如果必须使用多线程,则每个线程都可以具有以下结构:
var runner = this runner for the thread;
while(running)
{
Thread.Sleep(runner.Seconds * 1000); // convert to milliseconds
runner.StepsTraveled += runner.Steps;
}
您可以为每个跑步者使用相同的线程代码,您需要更改的是runner
他们将使用哪个对象。
在您的情况下,最简单的解决方案是将委托传递给Timer(C# 有几个多线程 timers\workers 实现)。我已经制作了类似的东西 - Windows 窗体上的 arkanoid 游戏,请查看: https ://github.com/ElliotCoder/GDIPlus_Arkanoid
您不需要多线程,只需使用 2 个计时器:300 / 2
s 和y / x
seconds。或者,如果您真的想要,创建 2 个线程并首先等待300,然后执行 2 步(或均匀地,150 秒和 1 步),然后再等待并x / y
执行 1 步。
您可以使用后台工作人员,通过“进度更改”事件可以轻松更新 GUI 以显示“跑步者”
我会创建自己的Race
(或World
)类来移动所有对象(可能是因为它们实现了IMoveable
)。那么这个类也有一个方法IncrementTime()
(也许还有IncrementTime(TimeSpan timeToElaps)
)。每当调用此方法时,它都会从每个IMoveable
中获取Speed
并Position
根据经过的时间和对象的速度进行相应的更改。
通过使用这种方法,您可以独立于现实世界的时间,并且如果需要,您也可以更快或更慢地运行模拟。尽管如此,您需要在您的应用程序Timer
中触发您的IncrementTime()
规律性,但很容易影响它需要运行的实时性。
以下是您需要的构建块:
代表一个赛跑者的比赛一种方法;为避免使用两种不同的方法,您可以分解公共代码并传递速度参数
要表示两个跑步者比赛的并发执行,您需要在新的上下文中执行每个方法System.Threading.Thread
为了表示时间的流逝,您将使用该Thread.Sleep
方法
代表主线程的等待(说它代表裁判),你将使用该Thread.Join
方法
希望我什么都没错过...