现在的位置: 首页 > 综合 > 正文

黑马程序员_张老师的交通红绿灯项目的制作和学习希望对刚开始学的同学能有帮助

2018年02月17日 ⁄ 综合 ⁄ 共 4184字 ⁄ 字号 评论关闭

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

//呵呵...这是第二遍学习这个项目了这一边情况好多了从整体上看理解的差不多了也能说个1234了   OK  现在就看一起看一下 每一个类到每一行代码到底是什么意思 注释都

是//按照我自己的理解的写出来的
//第一个被创建的类是 路  class Road
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Road {
	private String name = null;
	private List<String> vchicles = new ArrayList<String>();//定义这个数组是为了记录每一条路上到底跑了多少辆车

	Road(String name) {
		this.name = name;
		// 创建一个线程池模拟在当前路面上不断的创建车 每1--10秒创建一辆不大于1000个
		ExecutorService pool = Executors.newSingleThreadExecutor();//说明一下不管你红绿灯是红是绿我这个数组一直在添加不受外部影响(面向对象思想)
		pool.execute(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 1000; i++) {
					try {
						Thread.sleep((new Random().nextInt(10) + 1) * 1000);//随机1~10秒
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					vchicles.add(Road.this.name + "  :   " + i);//在集合中添加的时候讲当前的路名也添加进去更清晰的看出到底是哪一条路上有

车通过
				}
			}
		});
		// 定义闯过绿灯的每一辆汽车这里是一个定时器每一秒通过一辆跟现实世界一样一样的
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable() {
			public void run() {
				if(vchicles.size()>0){
					boolean light=Lamp.valueOf(Road.this.name).isLighted();//这里是将当前路的名称转换成为一个Lamp枚举类型的值或者对象并调

用Lamp()这个类的红绿灯的状态
					if(light)//以此来判断是红灯还是绿灯这里当然是绿灯才能行使合乎常理
					System.out.println(vchicles.remove(0)+"车开过去了");//在控制台打印出在当前路面且是红灯的情况下有辆车开过去了每一秒执

行一次
				}
			}
		}, 1, 1, TimeUnit.SECONDS);
	}

}
//创建Road是为了模拟真是的路况信息 像汽车在红灯的情况下一辆接一辆的堵在那里

//第二个创建出来的是红绿灯枚举 enum Lamp

public enum Lamp {
	// 一下创建12个方向的路况信息路名称(“对应的路名称”,"与当前路名称的下一个路口","亮灯情况true/false")
	S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","N2S",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)
	;
	//带参的构造函数当一个红绿灯被创建出来的时候会有地面路的红绿灯的信息和下一个路口的信息
	Lamp(String oppostate, String next, boolean lighted) {
		this.oppostate = oppostate;
		this.next = next;
		this.lighted = lighted;
	}
//额  这个不用说了
	Lamp() {
	};

	private String next;//相反的路口的红绿灯
	private String oppostate;//该参数的意思的是与当前路上的红绿灯对应的是对面的红绿灯
	private boolean lighted;//当前路的红绿灯的状态

	//查看当前的红绿灯的状态为什么
	public boolean isLighted() {
		return this.lighted;
	}
	//设置当前路的红绿灯为绿的方法
	public void light(){
		this.lighted=true;
		if(oppostate!=null){
			Lamp.valueOf(oppostate).light();
		}
		System.out.println("当前的路的名称(红绿灯所在的路)"+name()+"---->绿了现在共有6条路线的红绿灯状态是绿的");
	}
	//有一个红灯变红灯的方法并返回下一个路口的红绿灯情况
	public Lamp blackOut(){
		this.lighted=false;//既然下一个路口的红绿灯变绿了 那么当前的灯肯定变红了这里设置一下当前的灯状态为false
		if(oppostate!=null){
			Lamp.valueOf(oppostate).blackOut();//调用一下自己
		}
		
		/*
		 *在视频中张老师出的一次错就是在这里
		 *如果 Lamp nextLmap=Lamp.valueOf(next);这样写的话也会把next为null的值放进去从而达不到切换红绿灯的效果
		 *
		}
		 */
		Lamp nextLamp=null;
		if(this.next!=null){
			nextLamp=Lamp.valueOf(next);
			System.out.println("绿灯从"+name()+"--->切换为"+next);//打印红绿灯切换的时候从那条路的灯切换到哪条路
			nextLamp.light();
		}
		return nextLamp;//返回下一个变绿的路
	}
	
	---------------------- android培训java培训、期待与您交流! ----------------------
 
详细请查看:http://edu.csdn.net/heima
}
//模拟了一下一个路口的红绿灯 在当前的灯有绿变红 下一个路口由红变绿的情况信息
//第三个类的创建是想了一个控制器 class LampController 这个控制器是为了让程序能够初始化 跑起来 设置当前的路面S2N方向的绿灯亮起来
//代码如下:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/*
 * 
 *这个类是红绿灯控制器 
 */
public class LampController {
	private Lamp currentLamp = null;

	// 刚开始让由南向北的灯变绿这个很好理解
	public LampController() {
		currentLamp = Lamp.S2N;
		currentLamp.light();

		// 创建线程让红绿灯每个十秒钟变换一次
		//这个定时器的作用是每十秒让红绿灯切换一次 
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable() {
			public void run() {
				System.out.println("我马上变红了");//能够更好的看明白结果这里将要变红的灯有之前一句提示
				currentLamp=currentLamp.blackOut();//让当前的灯变黑 当然这里是十秒钟之后 和刚开始这里很绕 这里在提醒一下
			}
		}, 10, 10, TimeUnit.SECONDS);
	}
}
//OK最后这个类就是启动主应用程序让程序运行起来


public class MainClass {
	public static void main(String[] args) {
		String[] dirctions={"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};//将十二条路放进数组
		for (int i = 0; i < dirctions.length; i++) {
			new Road(dirctions[i]);//迭代数组将每一个路名作为Road类的构造参数完成来辨别每一条路
		}
		//运行整个交通系统
		new LampController();
	}
}
//代码写的是真不多 写了两遍 我觉得写第一遍的时候真的很不理解光是那些方向想得我很郁闷后来仔细研究慢慢发现了一些规律和特点慢慢
//总结这样写下来 真的学到好多东西 尤其是面向对象的设计模式和思想 这的很重要 怀念一下张老师!!

---------------------- android培训java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima

抱歉!评论已关闭.