黑马程序员--交通灯管理系统
2013-05-14 10:52
176 查看
-----------------------android培训、java培训、java学习型技术博客、期待与您交流!
----------------------
交通灯管理系统
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
Ø
异步随机生成按照各个路线行驶
4000
的车辆。
例如:
由南向而来去往北向的车辆 ----直行车辆
由西向而来去往南向的车辆 ----右转车辆
由东向而来去往南向的车辆 ----左转车辆
。。。
Ø 信号灯忽略黄灯,只考虑红灯和绿灯。
Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
Ø 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
Ø 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
Ø 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。 Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
根据上面的分析,我们可以画图解析:
(1-1)
由图(1-1)我们可以知道的是:总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。
友情提示:
(1):红绿灯,红绿灯的控制系统,汽车,路线。汽车看到自己所在路线对应的灯绿了就穿过路口吗?不是,还需要看其前面是否有车,看前面是否有车,该问哪个对象呢?该问路,路中存储着车辆的集合,显然路上就应该有增加车辆和减少车辆的方法了。再看题目,我们这里并不要体现车辆移动的过程,只是捕捉出车辆穿过路口的过程,也就是捕捉路上减少一辆车的过程,所以,这个车并不需要单独设计成为一个对象,用一个字符串表示就可以了。
(2):面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。
项目中需要注意的问题:
1,我们知道:总共有12条路线,所以,系统中总共要产生12个交通灯。这12个交通灯都是固定不变的,由此,我们想到的是枚举(枚举就是让某个类型的变量的取值只能为若干个固定值中的一个)。
2, 每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿(只需要控制4个灯的方向,其实也就是灯的颜色,因为其他的都是与这4个灯颜色作参照并对应的灯颜色是相同的。还有一种就是右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯。)。
所以我们在设计程序的时候,只需要设计4个灯,这4个灯,我们可以称之为逻辑灯。
灯的设计重要程序:
public void light(){//当灯变亮的时候
this.lighted = true;
if(opposite != null){//对应方向的灯,灯的颜色保持一致
Lamp.valueOf(opposite).light();//对应方向的灯也变亮
}
System.out.println(name() + " lampis green,下面总共应该有6个方向能看到汽车穿过!");
}
public Lamp blackOut(){//当灯变红的时候
this.lighted = false;
if(opposite != null){//对应方向的灯,灯的颜色保持一致
Lamp.valueOf(opposite).blackOut();//对应方向的灯也变红
}
Lamp nextLamp= null;//下一个灯,与那两个对应的灯的颜色是相反的(注意:灯的颜色只有两种:红和绿)
if(next != null){
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name() +"-------->切换为" + next);
nextLamp.light();//下一个方向的灯要变绿
}
return nextLamp;//返回下一个灯
}
友情提示:某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿。
3, 灯控制器:设置红绿灯的时间,并在规定到的时间进行切换动作。
/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/
ScheduledExecutorServicetimer = Executors.newScheduledThreadPool(1); //调用器中只需要一个线程就行了
timer.scheduleAtFixedRate(//创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期
newRunnable(){
public void run(){
currentLamp= currentLamp.blackOut();//灯的时间一到,就变成红色,并赋值给下一个灯
}
},
10,//隔10s执行Runnable()方法
10,//每次隔10s执行Runnable()方法
TimeUnit.SECONDS);//设置单位为s
}
友情提示:ScheduledExecutorService:schedule方法使用各种延迟创建任务,并返回一个可用于取消或检查执行的任务对象。
4,Road类的编写
分析:(1)每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
(2)每条路线上随机增加新的车辆,增加到一个集合中保存。
(3)每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
友情提示:在控制车辆次数的时候,需要两个线程来进行控制(如果是一个线程,你不能
说第一辆车在sleep的时候,第二辆车还没有生产出来,这样不合适。)
总结:(1)按照面向对象的思想,对项目进行分析,需求的对象实例
(2)注意定时器的使用,这个使用比较广泛
(3)灯的颜色使用泛型
(4)以我这个灯为例,跟对应的灯颜色保持一致,与下个灯相反(注意:左右拐弯不受影响)
-----------------------android培训、java培训、java学习型技术博客、期待与您交流!
----------------------
9a8c
----------------------
交通灯管理系统
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
Ø
异步随机生成按照各个路线行驶
4000
的车辆。
例如:
由南向而来去往北向的车辆 ----直行车辆
由西向而来去往南向的车辆 ----右转车辆
由东向而来去往南向的车辆 ----左转车辆
。。。
Ø 信号灯忽略黄灯,只考虑红灯和绿灯。
Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
Ø 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
Ø 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
Ø 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。 Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
根据上面的分析,我们可以画图解析:
(1-1)
由图(1-1)我们可以知道的是:总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。
友情提示:
(1):红绿灯,红绿灯的控制系统,汽车,路线。汽车看到自己所在路线对应的灯绿了就穿过路口吗?不是,还需要看其前面是否有车,看前面是否有车,该问哪个对象呢?该问路,路中存储着车辆的集合,显然路上就应该有增加车辆和减少车辆的方法了。再看题目,我们这里并不要体现车辆移动的过程,只是捕捉出车辆穿过路口的过程,也就是捕捉路上减少一辆车的过程,所以,这个车并不需要单独设计成为一个对象,用一个字符串表示就可以了。
(2):面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。
项目中需要注意的问题:
1,我们知道:总共有12条路线,所以,系统中总共要产生12个交通灯。这12个交通灯都是固定不变的,由此,我们想到的是枚举(枚举就是让某个类型的变量的取值只能为若干个固定值中的一个)。
2, 每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿(只需要控制4个灯的方向,其实也就是灯的颜色,因为其他的都是与这4个灯颜色作参照并对应的灯颜色是相同的。还有一种就是右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯。)。
所以我们在设计程序的时候,只需要设计4个灯,这4个灯,我们可以称之为逻辑灯。
灯的设计重要程序:
public void light(){//当灯变亮的时候
this.lighted = true;
if(opposite != null){//对应方向的灯,灯的颜色保持一致
Lamp.valueOf(opposite).light();//对应方向的灯也变亮
}
System.out.println(name() + " lampis green,下面总共应该有6个方向能看到汽车穿过!");
}
public Lamp blackOut(){//当灯变红的时候
this.lighted = false;
if(opposite != null){//对应方向的灯,灯的颜色保持一致
Lamp.valueOf(opposite).blackOut();//对应方向的灯也变红
}
Lamp nextLamp= null;//下一个灯,与那两个对应的灯的颜色是相反的(注意:灯的颜色只有两种:红和绿)
if(next != null){
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name() +"-------->切换为" + next);
nextLamp.light();//下一个方向的灯要变绿
}
return nextLamp;//返回下一个灯
}
友情提示:某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿。
3, 灯控制器:设置红绿灯的时间,并在规定到的时间进行切换动作。
/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/
ScheduledExecutorServicetimer = Executors.newScheduledThreadPool(1); //调用器中只需要一个线程就行了
timer.scheduleAtFixedRate(//创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期
newRunnable(){
public void run(){
currentLamp= currentLamp.blackOut();//灯的时间一到,就变成红色,并赋值给下一个灯
}
},
10,//隔10s执行Runnable()方法
10,//每次隔10s执行Runnable()方法
TimeUnit.SECONDS);//设置单位为s
}
友情提示:ScheduledExecutorService:schedule方法使用各种延迟创建任务,并返回一个可用于取消或检查执行的任务对象。
4,Road类的编写
分析:(1)每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
(2)每条路线上随机增加新的车辆,增加到一个集合中保存。
(3)每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
友情提示:在控制车辆次数的时候,需要两个线程来进行控制(如果是一个线程,你不能
说第一辆车在sleep的时候,第二辆车还没有生产出来,这样不合适。)
总结:(1)按照面向对象的思想,对项目进行分析,需求的对象实例
(2)注意定时器的使用,这个使用比较广泛
(3)灯的颜色使用泛型
(4)以我这个灯为例,跟对应的灯颜色保持一致,与下个灯相反(注意:左右拐弯不受影响)
-----------------------android培训、java培训、java学习型技术博客、期待与您交流!
----------------------
9a8c
相关文章推荐
- 黑马程序员---七千项目之一(交通灯管理系统)
- 黑马程序员 交通灯管理系统
- 黑马程序员——交通灯管理系统
- 黑马程序员学习笔记之九(交通灯管理系统学习)
- 黑马程序员_Java学习笔记之7K面试题交通等管理系统
- 黑马程序员------- 交通灯管理系统 -------
- 黑马程序员_7k面试题之交通灯管理系统
- 黑马程序员——交通灯管理系统学习总结
- 黑马程序员7K---交通灯管理系统
- 黑马程序员_交通灯管理系统
- 黑马程序员_面试题(一)交通灯管理系统
- 黑马程序员_java学习日记_交通灯管理系统
- 黑马程序员_交通灯管理系统学习笔记
- 黑马程序员-交通灯管理系统
- 黑马程序员_7K面试题:十字路口的交通灯管理系统
- 黑马程序员_面试题破解之一_交通灯管理系统
- 黑马程序员-交通灯管理系统(张孝祥老师)
- 黑马程序员——交通灯管理系统
- 黑马程序员_交通灯管理系统学习日记
- 黑马程序员-10-交通灯管理系统笔记