您的位置:首页 > 职场人生

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

2012-12-02 01:56 190 查看
-------
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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: