1. 程式人生 > >黑馬程式設計師——7K面試題交通燈(My)

黑馬程式設計師——7K面試題交通燈(My)

  ------- android培訓java培訓、期待與您交流! ----------

模擬實現十字路口的交通燈管理系統邏輯,具體需求如下:

1、非同步隨機生成按照各個路線行駛的車輛。

例如:

       由南向而來去往北向的車輛 ---- 直行車輛

       由西向而來去往南向的車輛 ---- 右轉車輛

       由東向而來去往南向的車輛 ---- 左轉車輛

       。。。

2、訊號燈忽略黃燈,只考慮紅燈和綠燈。

3、應考慮左轉車輛控制訊號燈,右轉車輛不受訊號燈控制。

4、具體訊號燈控制邏輯與現實生活中普通交通燈控制邏輯相同,不考慮特殊情況下的控制邏輯。

注:南北向車輛與東西向車輛交替放行,同方向等待車輛應先放行直行車輛而後放行左轉車輛。

5、每輛車通過路口時間為1秒(提示:可通過執行緒Sleep的方式模擬)。

6、隨機生成車輛時間間隔以及紅綠燈交換時間間隔自定,可以設定。

7、不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式執行結果。

以上是需要做的題,但是呢!!我自己將題目該了一下。還請老師幫忙看一下程式碼以及執行效果。(不執行隨時右轉,必須按照紅綠燈指示)

以下是我畫了一張圖:


從我的題中要求得知,紅綠燈 只能允許 一面 行動,而且他行動的方位  只有3個方向。

我的思考方式:我有一個控制器,該控制器控制著   (東南西北) 4組 紅綠燈。每一組紅綠燈都對應著對面的路

當  南面  為 紅燈時,只允許 北面車 行動,

當  東面  為 紅燈時,只允許 西面車 行動,

當  北面  為 紅燈時,只允許 南門車 行動,

當  西面  為 紅燈時,只允許  東面車 行動。

東南西北都有隨時隨地來的車。(通過4個執行緒開啟,每一個執行緒都對應著自己的那條路,隨機時間產生隨機車)

當 允許行動的那條路線可以行動時,則進行 1秒 remove 一輛車。

我的程式碼展示:

lamp類:每一個燈都有自己的固定時間,然後有一個返回下一個燈的時間(主要是來源於 張老師第一次將 enum 那個時候就想做紅綠燈了)

public enum Lamp
{
	RED(10){
		public Lamp nextLamp()
		{
			return GREEN_3;
		}
	},
	GREEN_3(30){
		public Lamp nextLamp()
		{
			return RED;
		}
	},
	GREEN_2(20)
	{
		public Lamp nextLamp()
		{
			return RED;
		}
		
	},
	GREEN_1(10)
	{
		public Lamp nextLamp()
		{
			return RED;
		}
	};
	
	
	protected  int time;
	
	private Lamp(int time)
	{
		this.time = time;
	}
	
	public abstract Lamp nextLamp();
}

Roud類:只有路才知道 有 多少輛車,只有路才能將車移動。(面向物件設計)
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Roud
{
	List<String> s = new ArrayList<String>();	//南
	List<String> w = new ArrayList<String>();	//西
	List<String> n = new ArrayList<String>();	//北
	List<String> e = new ArrayList<String>();	//東
	
	
	/**只要一被建立物件,我就開啟4執行緒。
	 * */
	Roud()
	{
		new Thread(new RoudAddCar(s, "s")).start();	//傳入集合,和 路面
		new Thread(new RoudAddCar(w, "w")).start();
		new Thread(new RoudAddCar(n, "n")).start();
		new Thread(new RoudAddCar(e, "e")).start();
	}
	
	
	//路要和刪除的方法。
	public void removeCar(List<String> list, String roudName)
	{
		if(list.size()>0)
		{
			list.remove(0);
			System.out.println(roudName + " _ remove a car  , 待過的還有 : " + list.size());
		}
	}	
	
}


class RoudAddCar implements Runnable	//新增車輛執行緒
{
	private String roudName;
	private List<String> list;

	public void run()
	{
		for(int i=1; list.size()<500 ; i++)		//單條路線大於500就該請交警隊了
		{
			try 
			{
				Thread.sleep( (new Random().nextInt(10) + 1)*1000 );	//1~10,在乘以1000,在1~10秒內隨機時間內產生車輛
				list.add(roudName + "_" + i  );
				
				System.out.println(roudName  + " add one");

			} 
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		
	}
	
	RoudAddCar(List<String> list,String roudName)
	{
		this.list = list;

		this.roudName = roudName;
	}
}


Monitor類 : 控制器控制 燈,燈控制路,路控制車。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Monitor
{

	Roud roud = new Roud();
	public Lamp sLamp = Lamp.RED;		//南
	public Lamp wLamp = Lamp.GREEN_3;	//西	對應	東
	public Lamp nLamp = Lamp.GREEN_2;	//北	對應	南
	public Lamp eLamp = Lamp.GREEN_1;	//東	對應	西
	
	
	public void energization()		//控制器通電後開啟4執行緒。
	{
		ExecutorService pools = Executors.newFixedThreadPool(1);
		pools.execute(new Runnable(){
			public void run()
			{
				while(true)
				{
					if(sLamp == Lamp.RED)		//南s	對應	北n,讓 北面的車走。
					{
						System.out.println("RED等切換為:S 面,只 允許 N 面開車");
						int time = sLamp.time;
						while(time>0)
						{
								threadSleep();
								
							synchronized(Monitor.class)
							{	
								System.out.println("S 面,Led---------->true: " + --time + "秒");
								roud.removeCar(roud.n, "N");
							}

						}
						sLamp = sLamp.nextLamp();<span style="white-space:pre">	//當 time<=0的時候。就切換燈
					}
					else
					{
						int overTime = sLamp.time;
						while(overTime>0)
						{
								threadSleep();
							synchronized(Monitor.class)
							{							
								System.out.println("S 面,Led---->false: " + --overTime + "秒");
							}
						}
						sLamp = sLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//當 time<=0的時候。就切換燈</span>
					}
				}
			}
		});
		
		ExecutorService poolw = Executors.newFixedThreadPool(1);
		poolw.execute(new Runnable(){
			public void run()
			{
				while(true)
				{
					if(wLamp == Lamp.RED)		//西w	對應	東e,讓 東面的車走。
					{
						System.out.println("RED等切換為:W 面,只允許 E 面開車 ");
						int time = wLamp.time;
						while(time>0)
						{
							threadSleep();
							
							synchronized(Monitor.class)
							{					
								System.out.println("W 面,Led---------->true: " + --time + "秒");
								roud.removeCar(roud.e, "E");
							}

						}
						<span style="font-family: Arial, Helvetica, sans-serif;">sLamp = sLamp.nextLamp();//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>

					}
					else
					{
						int overTime = wLamp.time;
						while(overTime>0)
						{

								threadSleep();
							synchronized(Monitor.class)
							{							
								System.out.println("W 面,Led---->false: " + --overTime + "秒");
							}
						}
						wLamp = wLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>

					}
				}
				
			}
		});
		
		ExecutorService pooln = Executors.newFixedThreadPool(1);
		pooln.execute(new Runnable(){
			public void run()
			{
				while(true)
				{
					if(nLamp == Lamp.RED)		//北n	對應	南s,讓 南面的車走。
					{
						System.out.println("RED等切換為:N 面,只允許 S 面 開車");
						int time = nLamp.time;
						while(time>0)
						{
							threadSleep();
							
							synchronized(Monitor.class)
							{						
								System.out.println("N 面, Led---------->true: " + --time + "秒");
								roud.removeCar(roud.s, "S");
							}
						}
						nLamp = nLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>

					}
					else
					{
						int overTime = nLamp.time;
						while(overTime>0)
						{
							threadSleep();
							
							synchronized(Monitor.class)
							{					
								System.out.println("N 面,Led---->false: " + --overTime + "秒");
							}
						}
						nLamp = nLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>

					}
				}
				
			}
		});
		

		
		ExecutorService poole = Executors.newFixedThreadPool(1);
		poole.execute(new Runnable(){
			public void run()
			{
				while(true)
				{
					if(eLamp == Lamp.RED)		//東e	對應	西w,讓 西面的車走。
					{
						System.out.println("RED等切換為:E 面,只允許 W 面 開車 ");
						int time = eLamp.time;
						while(time>0)
						{
							threadSleep();
							
							synchronized(Monitor.class)
							{
								System.out.println("E 面, Led---------->true: " + --time + "秒");
								roud.removeCar(roud.w, "W");
							}
							
						}
						eLamp = eLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>

					}
					else
					{
						int overTime = eLamp.time;
						while(overTime>0)
						{
							threadSleep();
							
							synchronized(Monitor.class)
							{					
								System.out.println("E 面,Led---->false: " + --overTime + "秒");
							}
						}
						eLamp = eLamp.nextLamp();<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">當 time<=0的時候。就切換燈</span>

					}
				}
				
			}
		});

			
	}
	
	public  void threadSleep()	// 車輛過的時候需要停留1秒鐘
	{
		try 
		{
			Thread.sleep(1000);
		} 
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
}

MainClass類:建立控制器物件。呼叫 通電方法 。讓程式跑起來。
public class MainClass {

	public static void main(String[] args)
	{
		new 
	}

}

下次是程式部分執行的結果:
RED等切換為:S 面,只 允許 N 面開車
S 面,Led---------->true: 9秒
N 面,Led---->false: 19秒
W 面,Led---->false: 29秒
E 面,Led---->false: 9秒
S 面,Led---------->true: 8秒
W 面,Led---->false: 28秒
N 面,Led---->false: 18秒
E 面,Led---->false: 8秒
S 面,Led---------->true: 7秒
N 面,Led---->false: 17秒
W 面,Led---->false: 27秒
E 面,Led---->false: 7秒
s add one
n add one
S 面,Led---------->true: 6秒
N _ remove a car  , 待過的還有 : 0
N 面,Led---->false: 16秒
W 面,Led---->false: 26秒
E 面,Led---->false: 6秒
n add one
w add one
S 面,Led---------->true: 5秒
N _ remove a car  , 待過的還有 : 0
W 面,Led---->false: 25秒
N 面,Led---->false: 15秒
E 面,Led---->false: 5秒
e add one
S 面,Led---------->true: 4秒
N 面,Led---->false: 14秒
W 面,Led---->false: 24秒
E 面,Led---->false: 4秒
S 面,Led---------->true: 3秒
N 面,Led---->false: 13秒
W 面,Led---->false: 23秒
E 面,Led---->false: 3秒
S 面,Led---------->true: 2秒
N 面,Led---->false: 12秒
W 面,Led---->false: 22秒
E 面,Led---->false: 2秒
s add one
n add one
S 面,Led---------->true: 1秒
N _ remove a car  , 待過的還有 : 0
N 面,Led---->false: 11秒
W 面,Led---->false: 21秒
E 面,Led---->false: 1秒
S 面,Led---------->true: 0秒
N 面,Led---->false: 10秒
W 面,Led---->false: 20秒
E 面,Led---->false: 0秒
RED等切換為:E 面,只允許 W 面 開車 
s add one
S 面,Led---->false: 29秒
N 面,Led---->false: 9秒
W 面,Led---->false: 19秒
E 面, Led---------->true: 9秒
W _ remove a car  , 待過的還有 : 0
S 面,Led---->false: 28秒
W 面,Led---->false: 18秒
N 面,Led---->false: 8秒
E 面, Led---------->true: 8秒
s add one
S 面,Led---->false: 27秒
N 面,Led---->false: 7秒
W 面,Led---->false: 17秒
E 面, Led---------->true: 7秒
S 面,Led---->false: 26秒
N 面,Led---->false: 6秒
W 面,Led---->false: 16秒
E 面, Led---------->true: 6秒
w add one
n add one
S 面,Led---->false: 25秒
N 面,Led---->false: 5秒
W 面,Led---->false: 15秒
E 面, Led---------->true: 5秒
W _ remove a car  , 待過的還有 : 0
e add one
S 面,Led---->false: 24秒
N 面,Led---->false: 4秒
W 面,Led---->false: 14秒
E 面, Led---------->true: 4秒
e add one
S 面,Led---->false: 23秒
N 面,Led---->false: 3秒
W 面,Led---->false: 13秒
E 面, Led---------->true: 3秒
n add one
S 面,Led---->false: 22秒
N 面,Led---->false: 2秒
W 面,Led---->false: 12秒
E 面, Led---------->true: 2秒
n add one
S 面,Led---->false: 21秒
W 面,Led---->false: 11秒
N 面,Led---->false: 1秒
E 面, Led---------->true: 1秒
s add one
S 面,Led---->false: 20秒
N 面,Led---->false: 0秒
RED等切換為:N 面,只允許 S 面 開車
W 面,Led---->false: 10秒
E 面, Led---------->true: 0秒
S 面,Led---->false: 19秒
W 面,Led---->false: 9秒
N 面, Led---------->true: 9秒
S _ remove a car  , 待過的還有 : 4
E 面,Led---->false: 29秒
S 面,Led---->false: 18秒
N 面, Led---------->true: 8秒
S _ remove a car  , 待過的還有 : 3
W 面,Led---->false: 8秒
E 面,Led---->false: 28秒
w add one
S 面,Led---->false: 17秒
W 面,Led---->false: 7秒
N 面, Led---------->true: 7秒
S _ remove a car  , 待過的還有 : 2
E 面,Led---->false: 27秒
S 面,Led---->false: 16秒
W 面,Led---->false: 6秒
N 面, Led---------->true: 6秒
S _ remove a car  , 待過的還有 : 1
E 面,Led---->false: 26秒
n add one
e add one
S 面,Led---->false: 15秒
W 面,Led---->false: 5秒
N 面, Led---------->true: 5秒
S _ remove a car  , 待過的還有 : 0
E 面,Led---->false: 25秒
S 面,Led---->false: 14秒
N 面, Led---------->true: 4秒
W 面,Led---->false: 4秒
E 面,Led---->false: 24秒
e add one
s add one
S 面,Led---->false: 13秒
N 面, Led---------->true: 3秒
S _ remove a car  , 待過的還有 : 0
W 面,Led---->false: 3秒
E 面,Led---->false: 23秒
S 面,Led---->false: 12秒
N 面, Led---------->true: 2秒
W 面,Led---->false: 2秒
E 面,Led---->false: 22秒
S 面,Led---->false: 11秒
N 面, Led---------->true: 1秒
W 面,Led---->false: 1秒
E 面,Led---->false: 21秒
w add one
S 面,Led---->false: 10秒
N 面, Led---------->true: 0秒
W 面,Led---->false: 0秒
RED等切換為:W 面,只允許 E 面開車 
E 面,Led---->false: 20秒
S 面,Led---->false: 9秒
N 面,Led---->false: 29秒
W 面,Led---------->true: 9秒
E _ remove a car  , 待過的還有 : 4
E 面,Led---->false: 19秒


尊敬的老師:由於我沒有根據張老師的那個要求做,還請抽點時間幫我一下。((*^__^*) 嘻嘻,雖然有點囉嗦,麻煩老師了)