黑馬程序員-java基礎 交通燈系統

---------------------- 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章