黑马程序员技术交流社区

标题: 交通灯系统,呵呵……和张老师那个很不一样的代码哦 [打印本页]

作者: 柏占肖    时间: 2012-10-8 10:05
标题: 交通灯系统,呵呵……和张老师那个很不一样的代码哦
本帖最后由 柏占肖 于 2012-10-9 11:49 编辑
  1. package com.isoftstone.interview.traffic;

  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Random;

  5. public class MainClass {
  6.         public static void main(String[] args) {
  7.                 new Controller();
  8.         }
  9. }

  10. class Controller {
  11.         /*
  12.          * 一个十字路口就是两条路相交,所以这里创建两条路 一条东西干道,一条南北干道 初始状态为东西干道的绿灯亮,南北干道的红灯亮
  13.          */
  14.         private Road roadEW = new Road(true, "东西干道");
  15.         private Road roadSN = new Road(false, "南北干道");

  16.         public Controller() {
  17.                 System.out.println("东西干道 绿灯亮,南北干道红灯亮");// 打印初始状态
  18.                 new Thread(new Runnable() {
  19.                         @Override
  20.                         public void run() {
  21.                                 while (true) {
  22.                                         try {
  23.                                                 Thread.sleep(30000);
  24.                                         } catch (InterruptedException e) {
  25.                                                 e.printStackTrace();
  26.                                         }
  27.                                         roadEW.changeLight();
  28.                                         roadSN.changeLight();
  29.                                 }
  30.                         }

  31.                 }).start();// 每隔30秒换次信号灯
  32.         }
  33. }

  34. class Road {
  35.         /* 每条道上的车的去向只有3个,即向左转,直行,向右转 */
  36.         private static final String[] goTo = { "left", "front", "right" };
  37.         /*
  38.          * 每条道上都有一个信号等,本来这里可以是静态的,但是为了体现面向对象的设计思想, 我就没有把它定义为静态的
  39.          */
  40.         private boolean light;
  41.         /* 保存路的名字,这主要是为了方便测试,在打印时可以打印出是哪条路在通行 */
  42.         private String name;

  43.         /**
  44.          *
  45.          * @param light
  46.          *            道路上路灯的初始状态
  47.          * @param name
  48.          *            道路的名字
  49.          */
  50.         public Road(boolean light, String name) {
  51.                 this.light = light;
  52.                 this.name = name;
  53.                 /* 当道路一创建,道路上就开始行驶车辆了 */
  54.                 this.removeThread(left, "左边");
  55.                 this.removeThread(right, "右边");
  56.                 this.addThread(left);
  57.                 this.addThread(right);
  58.         }

  59.         public void changeLight() {
  60.                 light = true == light ? false : true;// 路灯转换
  61.                 if (light) {
  62.                         System.out.println(this.name + "绿灯亮,");
  63.                 } else {
  64.                         System.out.println(this.name + "红灯亮,");
  65.                 }
  66.         }

  67.         public void removeThread(final List<Car> list, final String listname) {
  68.                 new Thread(new Runnable() {

  69.                         @Override
  70.                         public void run() {
  71.                                 while (true) {
  72.                                         try {
  73.                                                 Thread.sleep(1000);
  74.                                         } catch (InterruptedException e) {
  75.                                                 e.printStackTrace();
  76.                                         }
  77.                                         if (0 != list.size()) {// 如果道上的车辆数不为0
  78.                                                 if (Road.this.light
  79.                                                                 | list.get(0).getGoTo().equals("right")) {
  80.                                                         /* 道路上亮的是绿灯或者最前面的那辆车是向右转就旅行 */
  81.                                                         System.out.println(Road.this.name + listname
  82.                                                                         + "使过一辆向" + list.get(0).getGoTo()
  83.                                                                         + "方向行驶的车");
  84.                                                         list.remove(0);
  85.                                                 }
  86.                                         }
  87.                                 }
  88.                         }
  89.                 }).start();
  90.         }

  91.         public void addThread(final List<Car> list) {
  92.                 new Thread(new Runnable() {

  93.                         @Override
  94.                         public void run() {
  95.                                 while (true) {
  96.                                         try {
  97.                                                 Thread.sleep(1000);
  98.                                         } catch (InterruptedException e) {
  99.                                                 e.printStackTrace();
  100.                                         }
  101.                                         /* 增加车辆 */
  102.                                         list.add(new Car(goTo[new Random().nextInt(3)]));
  103.                                 }
  104.                         }
  105.                 }).start();
  106.         }

  107.         /* 每条道路都是双向道,所以我们这里就用两个集合来存储这两个道上的车辆 */
  108.         private List<Car> left = new ArrayList<Car>();
  109.         private List<Car> right = new ArrayList<Car>();
  110. }

  111. class Car {
  112.         private String goTo;// 储存车辆的去向,左转,直行或者右转

  113.         public Car(String goTo) {
  114.                 this.goTo = goTo;
  115.         }

  116.         /* 获取车辆的去向 */
  117.         public String getGoTo() {
  118.                 return goTo;
  119.         }
  120. }
复制代码

作者: 刘圣伟    时间: 2012-10-8 10:27
不错欧,不过现实中的问题有一些没解决,
1.一般右转的车轮都在右边车道的最右边。,而你写的只判断第一辆,
2.转弯和直行,在现实中一般都是先直行,在转弯,大城市,这个细节地方,必须不能一起执行。

但就程序方面,很好了,有自己的思路。很8错!
作者: 王中利    时间: 2012-10-8 10:30
很厉害!

作者: 柏占肖    时间: 2012-10-8 11:55
刘圣伟 发表于 2012-10-8 10:27
不错欧,不过现实中的问题有一些没解决,
1.一般右转的车轮都在右边车道的最右边。,而你写的只判断第一辆, ...

这个模拟是这样的,公路只有2个车道,且方向相反,这样就不存在有2辆车并排同向而行,如果说是4个车道的话,那么你说的这些情况就应该考虑了
作者: 柏占肖    时间: 2012-10-8 12:20
刘圣伟 发表于 2012-10-8 10:27
不错欧,不过现实中的问题有一些没解决,
1.一般右转的车轮都在右边车道的最右边。,而你写的只判断第一辆, ...

嗯  又看了下你的第2点问题,呵呵……这点居然还想落了,3Q,帮我找出了BUG
作者: qmpy    时间: 2012-10-8 15:47
强悍啊!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2