我的任务是模拟人们跑步。
一个人每300秒做两步, 第二个是在y秒内做x步。
我不想要一个完整的解决方案,只是知道这个机制是正确的,为什么。
p.s - 起初我想过使用计时器,但是对于第二场比赛,它还不够好。
答案 0 :(得分: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
对象。
答案 1 :(得分:0)
最简单的解决方案是将委托传递给计时器(C#有多个多线程计时器\工作者实现)。 我已经在Windows Forms上制作了类似的东西 - arkanoid游戏,请查看: https://github.com/ElliotCoder/GDIPlus_Arkanoid
答案 2 :(得分:0)
您不需要多线程,只需使用2个计时器:300 / 2
和y / x
秒。或者,如果你真的想要,创建2个线程,在第一个等待为300,然后执行2个步骤(或均匀,150秒和1步),在第二个等待 x / y
并执行一步。
答案 3 :(得分:0)
您可以使用后台工作人员,其中"进度已更改"事件很容易更新GUI以显示"跑步者"
答案 4 :(得分:0)
我会创建自己的Race
(或World
)类来获取要移动的所有对象(可能是因为它们实现了IMoveable
)。然后这个类还有一个方法IncrementTime()
(也许IncrementTime(TimeSpan timeToElaps)
)。每当调用此方法时,它都会从每个IMoveable
Speed
获取,并相应地将其Position
更改为传递的时间和对象的速度。
通过使用此方法,您可以独立于实际时间,并且如果需要,您还可以更快或更慢地运行模拟。不过,您需要在您的应用程序中使用某种Timer
来触发您的IncrementTime()
常规,但很容易影响它需要运行的实时。
答案 5 :(得分:0)
以下是您需要的构建模块:
代表一个跑步者的种族方法;为避免使用两种不同的方法,您可以将公共代码分解并传递速度参数
表示您需要在新System.Threading.Thread
表示您将使用Thread.Sleep
方法的时间的推移
表示主线程的等待(假设它代表裁判)你将使用Thread.Join
方法
希望我什么都没有错过......