交通灯模拟:改变交通灯的颜色

时间:2016-05-21 14:55:14

标签: c#

我正在进行交通信号灯模拟,现在我正试图让交通信号灯切换颜色(汽车和行人交通信号灯)。问题是我每个交叉路口有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。

2 个答案:

答案 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,因为更改颜色的所有逻辑都包含在实例本身中,该实例本身可以使用自己的红色和绿色设置