我正在进行交通信号灯模拟,现在我正试图让交通信号灯切换颜色(汽车和行人交通信号灯)。问题是我每个交叉路口有8个红绿灯和12个交叉路口。我试过一个计时器和一个计数器,但问题是间隔不受尊重:
如果起始颜色为红色,红色时间为8,绿色时间为10,那么当颜色变为绿色时,在两秒钟内它将变回红色。 这是计时器代码:
private void timerTrafficLights_Tick(object sender, EventArgs e)
{
counter++;
foreach(TrafficLight t in trafficLights)
{
if(counter%t.RedTime==0 &&t.TrafficColor==TrafficLightColor.RED)
{
t.SwitchLight(t, TrafficLightColor.GREEN, t.ID);
}
else if(counter % t.GreenTime==0 && t.TrafficColor==TrafficLightColor.GREEN)
{
t.SwitchLight(t, TrafficLightColor.RED, t.ID);
}
}
foreach(PedestrianLight p in pedestrianLights)
{
if(counter % p.RedTime==0 && p.LightColor == PedestrianLightColor.RED)
{
p.SwitchLight(p, p.ID, PedestrianLightColor.GREEN);
}
else if (counter % p.GreenTime ==0 && p.LightColor == PedestrianLightColor.GREEN)
{
p.SwitchLight(p, p.ID, PedestrianLightColor.RED);
}
}
UI.InvalidateEvent.InvalidatePanel();
}
private void TimerTrafficLights()
{
timerTrafficLights.Interval = 1000;
timerTrafficLights.Tick += new EventHandler(timerTrafficLights_Tick);
timerTrafficLights.Start();
}
模拟开始时计时器启动,模拟开始时计数器的值为0。
答案 0 :(得分:0)
将类似的内容添加到交通/行人灯类
public int startTime;
这样你只需要存储开始时间。在每个刻度线处,您将检查差异是否大于阈值。更改后,将时间重置为当前。
答案 1 :(得分:0)
我会从面向对象的方式接近这个任务。不是你的Timer改变了TrafficLight(和PedestrianLight)的颜色,但它本身就知道什么时候改变颜色。
在这种情况下,您的TrafficLight类可能是这样的
conda install redis
现在,Timer Tick事件只是为TrafficLight(和PedestrianLight)的每个实例调用Tick方法。
// I show just the TrafficLight class, but the same is true for the
// PedestrianLight class (better if both derives from the same base class)
public class TrafficLight
{
private int counter = 0;
public TrafficLightColor TrafficColor { get; set; }
public int ID {get;set;}
public int RedTime { get; set; }
public int GreenTime { get; set; }
public void SwitchLight(TrafficLightColor color)
{
if(color != TrafficColor)
{
TrafficColor = color;
// Restart the counter everytime the color changes.....
// So the next change happens for the current color.
counter = 0;
}
}
public void Tick()
{
if (this.TrafficColor == TrafficLightColor.RED && counter == RedTime)
SwitchLight(TrafficLightColor.GREEN);
else if ((this.TrafficColor == TrafficLightColor.GREEN && counter == GreenTime)
SwitchLight(TrafficLightColor.RED);
}
}
通过这种方式,您不需要在课堂外保留一个外部计数器。每个实例都知道它的边界,并在时间合适时改变颜色。您甚至可以为红灯和绿灯设置不同时间的TrafficLights,因为更改颜色的所有逻辑都包含在实例本身中,该实例本身可以使用自己的红色和绿色设置