黑马程序员-java基础 交通灯系统

时间:2023-02-17 18:59:56

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

 

交通灯系统

项目要求

交通灯管理系统

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

 异步随机生成按照各个路线行驶的车辆。
例如:
       由南向而来去往北向的车辆 ---- 直行车辆
       由西向而来去往南向的车辆 ---- 右转车辆
       由东向而来去往南向的车辆 ---- 左转车辆
       。。。

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

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

 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

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

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

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


项目分析:
1 项目可以设计12条路线: 即每个方向上的 直行  左转  右转
2 每条路线上面有1个信号灯,共12个信号灯。但是,南北向直行的路线的可算一组灯,  南北向左转可算一组灯
  东西向直行算一组灯,东西向左转算一组灯。  4个方向的右转设计成永远绿灯。所以可以只设计4个灯的变化
3 创建灯的类 当一个方向的等为绿灯时,对应方向的灯变为绿灯。当灯变为红灯时,对应方向的灯也变为红灯,下一个方向的灯变为绿灯。
4 创建线路类 随机产生车辆,当车过了红绿灯后车消失
5 创建灯控制器,设置等由绿变红的时间

//创建道路类
public class Road {
 //路线的名字
 private String name;
 //创建一个集合装道路上的汽车
 List<String> vech = new ArrayList<String>();

 public Road(String name) {
  super();
  this.name = name;
  //创建一个线程专门随机没过一段时间创建一辆汽车
  ExecutorService pool = Executors.newSingleThreadExecutor();
  pool.execute(new Runnable() {

   public void run() {
    for (int i = 0; i < 1000; i++) {
     try {
      Thread.sleep(new Random().nextInt(10 + 1) * 1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     
     vech.add(Road.this.name + "---" + i);
    }
   }
  });
  //创建一个线程,专门管理当汽车过了红绿灯后就消失
  ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(new Runnable() {

   public void run() {
    //检查是否有车,若有车则把最前面的车删除
    if(vech.size()>0){
     boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
     if(lighted==true){
      
      System.out.println(vech.remove(0)+"is traversing");
     }
    }
    
   }
  }, 1, 1, TimeUnit.SECONDS);

 }
}


// 创建灯类
public enum Lamp {
 // 定义12个枚举元素,表示每条路线上的灯,只需考虑前面4个元素的变化,中间4个元素,和前面4个元素一一对应,最后4个元素,永远设计为绿灯
 S2N("N2S", "S2W", false), S2W("N2E", "E2W", false), E2W("W2E", "E2S", false), E2S(
   "W2N", "S2W", 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 opposite;
 //灯变红时下一个灯变绿
 private String next;

 // 灯变绿,且它对应的灯变绿
 public void light() {
  this.lighted = true;
  // 如果有对应的,变绿
  if (opposite != null) {
   Lamp.valueOf(opposite).light();

  }
  System.out.println(name() + "灯变绿了,有6个方向的汽车穿过");
 }

 // 灯变红方法,且对应方向的灯也要变红,下一个方向的灯要变绿
 public Lamp blackOut() {
  this.lighted = false;
  if (opposite != null) {
   System.out.println("hhh");
   Lamp.valueOf(opposite).blackOut();
  }

  Lamp nextLamp = null;
  if (next != null) {
   System.out.println("gggggg");
   nextLamp = Lamp.valueOf(next);
   System.out.println("绿灯从" + name() + "----切换为" + next);
   nextLamp.light();
  }
  return nextLamp;
 }

 private Lamp() {
 }

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

 public boolean isLighted() {
  return lighted;
 }

 public void setLighted(boolean lighted) {
  this.lighted = lighted;
 }

}


//灯控制器类
public class LampController {
 //设置当前灯对象
 private Lamp currentLamp;

 public LampController() {
  // 最开始 设置为由南向北的等为绿灯
  currentLamp = Lamp.S2N;
  currentLamp.light();
  // 没过10秒当前的灯变为红灯,并且让下一个方向的灯变绿灯
  ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  timer.scheduleAtFixedRate(new Runnable() {

   public void run() {
    System.out.println("jjjj");
    currentLamp = currentLamp.blackOut();
   }
  }, 2, 2, TimeUnit.SECONDS);

 }
}

public class LightTest {
 public static void main(String[] args) {
  String[] directios = new String[] { "S2N", "S2W", "ESW", "E2S", "N2S",
    "N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };

  for (int i = 0; i < directios.length; i++) {
   new Road(directios[i]);
  }
  
  new LampController();
 }
}

 

谁拥有数据,谁就拥有处理这些数据的方法

面向对象设计细想小题


1 小球从线的一端滚动到另一段
有一个绳子类,有一个起始点位置属性,终点位置属性和获得下一个点位置的方法
有一个小球类。有一个坐标属性 和移动方法

2 两块石头磨成一把石刀,石刀可以砍树,做成木材,木材做成椅子

创建一个石刀工厂,传入两块石头参数可以建造石刀,石刀是一个类,有砍树功能。传入树参数可以返回木材,
创建一个椅子工厂,传入木材参数可以返回椅子

 

 

 

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

详细请查看:http://edu.csdn.net/heima