黑马程序员_交通灯管理系统

来源:互联网 发布:郝斌c语言怎么样 编辑:程序博客网 时间:2024/06/06 02:52

------- android培训、java培训、期待与您交流! ----------

以下仅为个人平时学习笔记,可能有有错误的地方,希望有看到者提出来,共同讨论,谢谢!

一、项目需求

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

Ø 异步随机生成按照各个路线行驶的车辆。

例如:

       由南向而来去往北向的车辆 ---- 直行车辆

       由西向而来去往南向的车辆 ---- 右转车辆

       由东向而来去往南向的车辆 ---- 左转车辆

       。。。

Ø 信号灯忽略黄灯,只考虑红灯和绿灯。

Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

Ø 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

Ø 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

Ø 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

二、系统设计及代码编写


1.先是全部考虑行车路线,总共有12条:S2N,S2W,E2W,E2S,N2S,N2E,W2E,W2N,S2E,E2N,N2W,W2S。
   .左转弯车辆受信号等控制,右转弯车辆不受信号灯控制。所以可以暂不考虑右转弯车辆。
2.
  a.直行.
    南-->北(S2N) 对应 北-->南(N2S)  
    东-->西(E2W) 对应 西-->东(W2E)
  b.左转弯.
    南-->西(S2W) 对应 北-->东(N2E)
    东-->南(E2S) 对应 西-->北(W2N)
  所以真正只需考虑四条路线(而且每一个方向都是先直行再左转)。至于右转弯车辆,
  就认为它的方向绿灯常亮。

3.面向对象设计(有三种对象)。
  a.路线(Road)。
    12条路线:S2N,S2W,E2W,E2S,N2S,N2E,W2E,W2N,S2E,E2N,N2W,W2S。
    public class Road
    {
//车辆集合
List<String> vechicles = new ArrayList<String>();
private String name;//路的名字,此处也对应交通灯的名字

public Road(String name)
{
this.name = name;
//产生一个线程池对象
ExecutorService pool = Executors.newSingleThreadExecutor();
//执行新线程
pool.execute(new Runnable()
{
@Override
public void run()
{
for (int i = 0; i < 1000; i++)
{
try
{
//在1-10秒区间随机出现车辆
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
vechicles.add(Road.this.name + "---" + i);
}


}
});
//制作一个定时器,参数分别是Runnable接口子类对象,延时时间,频率,时间单位
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable()
{
@Override
public void run()
{
if (vechicles.size() > 0)
if (Lamp.valueOf(Road.this.name).isLighted())
System.out.println(vechicles.remove(0) + " is Traversing!");
}
}, 1, 1, TimeUnit.SECONDS);
}
    }
  b.交通灯(Lamp)。
    因为是想象成哪个方向车看到交通灯是绿灯,则哪个方向车行驶,所以12条路线就相当于有
    12个交通灯。
    public enum Lamp
    {
// 每个枚举元素各表示一个方向的控制灯,但由于必须先定义才能使用所以构造方法中用字符串替代了
// 下面这个每个元素可以连同与它相对的方向表示出来
S2N("N2S", "S2W", false), S2W("N2E", "E2W", false), E2W("W2E", "E2S", false), E2S("W2N", "S2N", false),
// 下面元素表示与上面的元素的相反方向的灯,它们的“相反方向灯”和“下一个灯”应忽略不计!
N2S(null, null, false), N2E(null, null, false), W2E(null, null, false), W2N(null, null, false),
// 由南向东和由西向北等右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯
S2E(null, null, true), E2N(null, null, true), N2W(null, null, true), W2S(null, null, true);

private boolean lighted;//该交通灯状态
private String oppsite;//与该交通灯对应交通灯名称
private String next;//该交通灯熄灭后下一个要亮的交通灯名称

private Lamp(String oppsite, String next, boolean lighted)
{
this.oppsite = oppsite;
this.next = next;
this.lighted = lighted;
}

//获得该交通灯状态
public boolean isLighted()
{
return lighted;
}

//点亮该交通灯
public void light()
{
System.out.println(this.name()+" is green!");
lighted = true;
if (oppsite != null)
{
Lamp.valueOf(oppsite).light();//同时点亮与之对应的交通灯
}
}

//熄灭该交通灯
public Lamp unLight()
{
lighted = false;
if (oppsite != null)
{
Lamp.valueOf(oppsite).unLight();//同时熄灭与之对应的交通灯
}
Lamp nextLamp = null;
if (next != null)
{
nextLamp = Lamp.valueOf(next);
nextLamp.light();//点亮该交通灯的下一个交通灯
}
return nextLamp;
}
   }
  c.交通灯控制系统(LampController)。
    控制系统控制交通灯的亮灭,设置的是10秒钟换一组。
    public class LampController
    {
private Lamp currentLamp;

public LampController()
{
this.currentLamp = Lamp.S2N;//设置一个交通灯(非右转弯)为要点亮交通灯
currentLamp.light();//点亮该交通灯

//设置一个定时器,10秒换一组
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable()
{
@Override
public void run()
{
System.out.println("换了");
if (currentLamp != null)
currentLamp = currentLamp.unLight();
}
}, 10, 10, TimeUnit.SECONDS);
}
    }