zoukankan      html  css  js  c++  java
  • 第四,五周——Java编写的电梯模拟系统(结对作业)

    作业代码:https://coding.net/u/liyi175/p/Dianti/git

    伙伴成员:石开洪 http://www.cnblogs.com/shikaihong/(博客)

          这次的作业是一个结对作业,我对我的Partner比较熟悉,信任和放心,而他对我也是如此,这对我们顺利完成项目有很大的有利影响。

          我们一开始比较默契的是都想到用Java语言进行编写代码,我认为以后工作可能对Java的优势比较大,另外我对Java,Eclipse也比较熟悉,于是

    我们就想通过这次作业提升一下自己的Java编程的能力。

          好了,下面介绍我们的代码——

    可以看到,我们设计了一共6个类,其中电梯有四个类,分别对应一号(firstdt),二号(seconddt),三号(thirddt),四号(forth)电梯,Show类是具体的调度程序,

    而xianshi类则是界面设计及其响应组件的类。

    下面来看界面——

         由于我的原因,要准备校园招聘的面试,所以时间比较紧 ,做的界面不是那么好看,此外电梯内部按钮的开关门也没有加,而在电梯类内部设计了超重,开门,关门函数,但由于时间关系,就没有具体写入进系统,希望以后有时间时能完善一下这个模拟程序吧。

    再说这个界面,我们用的组件全部是按钮组件,可能有人会问,为什么外部显示也要用按钮,我想说当时突然的一个想法(利用按钮的透明与实化的变化来实现模拟的电梯运行状态)占据了我的头脑,于是我就这样做了......但是我选的Java语言 和按钮组件对以后埋下了一个问题,后文再说......

         接下来介绍具体的调度系统,我个人认为,一个按钮控制四部电梯这种情况及其不合理......我认为实际情况最好是设置成一个按钮控制一部或两部。因此我的调度写的也比较简单。

    上代码——

     1  if(num%2==0)                         //当前楼层为双层,第二部电梯无法停靠
     2              {
     3                  int a1=f.getzt();                //确定三部电梯目前的状态
     4                  int a3=t.getzt();
     5                  int a4=f2.getzt();
     6                  int b1=f.getfloor();  //1
     7                  int b2=t.getfloor();  //3
     8                  int b3=f2.getfloor(); //4
     9                  int b7=sd.getfloor();//2
    10                 
    11                 
    12                  if(a1==0)
    13                  {
    14                     
    15                      diaodu1(ck,num,b8);                //调度第一部电梯
    16                  }
    17             
    18                  if(a1!=0&&a3==0&&a4!=0)
    19                  {
    20                      diaodu3(ck,num,b4);
    21                  }
    22                  if(a1!=0&&a3==0&&a4==0)
    23                  {
    24                      diaodu3(ck,num,b4);                //调度第三部电梯
    25                 
    26                  }
    27                  if(a1!=0&&a3!=0&&a4==0)
    28                  {
    29                      diaodu4(ck,num,b5);               //调度第四部电梯
    30                      
    31                  }
    32                  if(a1!=0&&a3!=0&&a4!=0)
    33                  {
    34                      if(a1==2&&b1>num)            //三个下降的电梯判断楼层是否在当前楼层之上
    35                      {
    36                          diaodu1(ck,num,b8);
    37                      }
    38                      else if(a3==2&&b2>num)
    39                      {
    40                          diaodu3(ck,num,b4);
    41                      }
    42                      else if(a4==2&&b3>num)
    43                      {
    44                          diaodu4(ck,num,b5); 
    45                      }
    46                      else {
    47                              a1=f.getzt();                //确定三部电梯目前的状态
    48                              a3=t.getzt();
    49                              a4=f2.getzt();
    50                          while(a1!=0&&a4!=0&&a3!=0)
    51                          {
    52                              try{
    53                                  Thread.sleep(3000);    
    54                                  } catch (InterruptedException e) {
    55                                      // TODO Auto-generated catch block
    56                                      e.printStackTrace();
    57                                      }
    58                              a1=f.getzt();                //确定三部电梯目前的状态
    59                              a3=t.getzt();
    60                              a4=f2.getzt();
    61                          }
    62                          if(a1==0)
    63                          {
    64                              diaodu1(ck,num,b8);
    65                          }else if(a1!=0&&a3==0&&a4!=0)
    66                          {
    67                              diaodu3(ck,num,b4);
    68                          }else if(a1!=0&&a3!=0&&a4==0)
    69                          {
    70                              diaodu4(ck,num,b5); 
    71                          }else if(a1==0&&a3==0&&a4==0)
    72                          {
    73                              diaodu1(ck,num,b8);
    74                          }
    75                          
    76                      }
    77                      
    78                      
    79                  }
    80              }

    这是一个楼层为双层的并且按下的是向下状态的调度,首先要接受四部电梯的正在运行的状态,当前楼层,之后再进行调度。

    这是调度函数。(请忽略f.getgate(),并没有具体设计开门,关门,超重等问题......)

     1 public  void diaodu1(JButton ck,int num,JButton b8[])
     2     {
     3          
     4          f.setfloor(ck,num,b8);
     5          f.getgate(false); 
     6          
     7     }
     8 
     9     public  void diaodu2(JButton ck,int num,JButton b[])
    10     {
    11         
    12          sd.setfloor(ck,num,b);
    13         
    14          sd.getgate(false);                       
    15         
    16         
    17     }
    18     public  void diaodu3(JButton ck,int num,JButton b4[])
    19     {
    20         
    21          t.setfloor(ck,num,b4);
    22         
    23          t.getgate(false);                       //开门
    24         
    25     }
    26     public  void diaodu4(JButton ck,int num,JButton b5[])
    27     {
    28         
    29          f2.setfloor(ck,num,b5);
    30          
    31          f2.getgate(false);
    32         
    33         
    34     }

    单层的与其类似。

    然后是类内部的代码——

     1 public void goup(JButton b8[]){
     2         
     3         try{
     4             Thread.sleep(2000); 
     5         } catch (InterruptedException e1) {
     6         // TODO Auto-generated catch block
     7         e1.printStackTrace();} 
     8         floor++;
     9         b8[floor].setContentAreaFilled(true);
    10         b8[floor-1].setContentAreaFilled(false);
    11                             
    12     }
    13     
    14     
    15     public void godown(JButton b8[]){
    16                 try{
    17                     Thread.sleep(2000);    
    18                 } catch (InterruptedException e) {
    19                 // TODO Auto-generated catch block
    20                 e.printStackTrace();
    21                 }
    22             
    23                 floor--;
    24                 b8[floor].setContentAreaFilled(true);
    25                 b8[floor+1].setContentAreaFilled(false);
    26         
    27     }
    28     public void setfloor(JButton ck,int goal,JButton b8[]) {
    29         
    30         Thread thread=new Thread(){
    31         
    32         @Override
    33         public void run(){
    34             
    35             while(floor!=goal)
    36             {
    37                 if(floor<goal)
    38                 {
    39                     
    40                     goup(b8);
    41                     zt=1;
    42                     
    43                     
    44                 }
    45                 else
    46                 {
    47                     godown(b8);
    48                     zt=2;
    49                 }
    50             }
    51             zt=0;
    52             ck.setContentAreaFilled(false);
    53             JOptionPane.showMessageDialog(null, "电梯已经到达该层", "警告", JOptionPane.WARNING_MESSAGE);
    54             JOptionPane.showMessageDialog(null, "当前是一号电梯 ,请选择目的楼层", "电梯提示",JOptionPane.PLAIN_MESSAGE); 
    55         
    56             
    57         }
    58         };
    59         thread.start();
    60         
    61         
    62     }

    这是主要的代码,执行上下楼的功能,以及按钮的透明,实体的变化。上面我说的问题就出现在这里,我最初设计的时候是只设计了一个线程睡眠放在了goup(),godown()函数里,setfloor()函数里面知识一个简单的循环,并没有线程,目的是想让界面在响应时能一个一个的让按钮变化。但是在测试时呈现的是先执行完了所有循环,最后按钮才一起变化。这个问题令我困扰了很长时间,我去请教了很多人,表示都不明白,我也是在无奈去群里问了一句,虽然得到了几个同学热心的帮助,提供了他们的几种看法,但是并不能解决问题,于是我就上网,看书学习,了解更多的线程方面的问题。最后我才在setfloor()函数里新建了一个内部线程类,利用创建线程来实现了电梯的上下按钮显示。以后就没有什么困难了,顺利的完成了编程。

    几张运行效果图——

    好了,以上就是我们这次的项目,代码还有待优化,功能有待添加,线程弹出提示框有待设计,我们有还待提升。

        

     
  • 相关阅读:
    Docker学习总结(四)--应用部署
    strcat的由来
    ubuntu man不到pthread_mutex_XX
    string::front
    string::find_last_of
    string::find_last_not_of
    string::find_first_of
    string::find_first_not_of
    string::erase
    string::empty
  • 原文地址:https://www.cnblogs.com/Yililove/p/5364921.html
Copyright © 2011-2022 走看看