0

我的任务是模拟人们跑步。

一个是每 300 秒走 2 步,第二个是在 y 秒内走 x 步。

我不想要一个完整的解决方案,而只是想知道哪种机制适合这个以及为什么。

ps - 起初我想使用计时器,但对于第二场比赛,它还不够好。

4

6 回答 6

2

您所需要的只是一个公式来计算每个跑步者在特定时间所跑的距离:

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他们将使用哪个对象。

于 2013-11-11T09:43:52.707 回答
0

在您的情况下,最简单的解决方案是将委托传递给Timer(C# 有几个多线程 timers\workers 实现)。我已经制作了类似的东西 - Windows 窗体上的 arkanoid 游戏,请查看: https ://github.com/ElliotCoder/GDIPlus_Arkanoid

于 2013-11-11T09:31:55.287 回答
0

您不需要多线程,只需使用 2 个计时器300 / 2s 和y / xseconds。或者,如果您真的想要,创建 2 个线程并首先等待300,然后执行 2 步(或均匀地,150 秒和 1 步),然后再等待x / y执行 1 步。

于 2013-11-11T09:32:19.800 回答
0

您可以使用后台工作人员,通过“进度更改”事件可以轻松更新 GUI 以显示“跑步者”

于 2013-11-11T09:38:31.450 回答
0

我会创建自己的Race(或World)类来移动所有对象(可能是因为它们实现了IMoveable)。那么这个类也有一个方法IncrementTime()(也许还有IncrementTime(TimeSpan timeToElaps))。每当调用此方法时,它都会从每个IMoveable中获取SpeedPosition根据经过的时间和对象的速度进行相应的更改。

通过使用这种方法,您可以独立于现实世界的时间,并且如果需要,您也可以更快或更慢地运行模拟。尽管如此,您需要在您的应用程序Timer中触发您的IncrementTime()规律性,但很容易影响它需要运行的实时性。

于 2013-11-11T09:47:18.093 回答
0

以下是您需要的构建块:

  • 代表一个赛跑者的比赛一种方法;为避免使用两种不同的方法,您可以分解公共代码并传递速度参数

  • 要表示两个跑步者比赛的并发执行,您需要在新的上下文中执行每个方法System.Threading.Thread

  • 为了表示时间的流逝,您将使用该Thread.Sleep方法

  • 代表主线程的等待(说它代表裁判),你将使用该Thread.Join方法

希望我什么都没错过...

于 2013-11-11T09:47:58.740 回答