第四,五周——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()函數里新建了一個內部線程類,利用創建線程來實現了電梯的上下按鈕顯示。以后就沒有什么困難了,順利的完成了編程。

幾張運行效果圖——

好了,以上就是我們這次的項目,代碼還有待優化,功能有待添加,線程彈出提示框有待設計,我們有還待提升。

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM