天天看點

第五次作業—— 四則運算“軟體”開發

作業要求來自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2232

GitHub 遠端倉庫的位址:https://github.com/RichardSkr/Simple-arithmetic-device

1. 開發環境

  IDE :IntelliJ IDEA 2018.2.5 x64。

  JDK:JDK_U801.

  系統:Ubuntu x64.

  程式設計語言:Java 語言

2. 需求分析

  • 基本要求:

    1)生成題目,單個題目最多不能超過 4 個運算符,操作數小于 100。

    2)使用者可以輸入答案

    3)若使用者輸入答案正确,則提示正确;若答案錯誤,則提示錯誤,并要提示正确答案是多少。

  • 擴充要求(選擇方向):

1)程式可以出帶括号的正整數四則運算,支援分數,除法保留兩位小數,如:(1/3+1)*2 = 2.67,特别注意:這裡是 2.67 而非 2.66,或保持分數形式: 8/3;

2)可以出表達式裡含有負整數(負整數最小不小于 - 100)的題目,且負數需要帶括号,使用者輸入的結果不用帶括号。如: 2*(-4) = -8;

3)使用者答題結束以後,程式可以顯示使用者答題所用的時間;

4)使用者可以選擇出題的個數(最多不能超過 5 個題目),答題結束可以顯示使用者答錯的題目個數和答對的題目個數;

5)程式可以出單個整數階乘的題目:如:4!=24;

6)程式可以設定皮膚功能,可以改變界面的顔色即可。

3. 詳細設計

在此次結隊子中,我主要負責的部分是UI界面。

HBoxInstance類:

獲得關于橫向排列按鈕的 bottom布局對象,bottom布局中包括 “交卷”  “換一套” 兩個按鈕。

public HBox getBottomHBox() {
        bottomHBox.setSpacing(50);
        bottomHBox.setPadding(new Insets(20,100,0,180));
        bottomHBox.setBackground(new Background(new BackgroundFill(new Color(0.2,0.2,0.0,0.1),
                CornerRadii.EMPTY, Insets.EMPTY)));

        nextBtn = new Button("換一套");
        nextBtn.setPadding(new Insets(5,40,5,40));

        submitBtn = new Button("交卷");
        submitBtn.setPadding(new Insets(5,40,5,40));

        bottomHBox.getChildren().addAll(submitBtn, nextBtn);
        return bottomHBox;
    }      

VBoxInstance類:

主要試題界面:

1)mainHBox:

因為試題數是不确定的,是以試題标簽Label,輸入框TextField都是随着題數改變的,用for循環配置設定布局組部最好。

exerciseList = ExerciseUtils.getExerciseList(MainWork2.exerciseCount);
        for (int i = 0; i < exerciseList.size(); i++) {
            Label label = new Label("第" + (i + 1) + "題:  " +
                    new String(ExerciseUtils.showExercise(i, exerciseList)).substring(2)
            );

            HBox hBox = new HBox();
            hBox.setSpacing(80);

            TextField textField = new TextField();
            textField.setStyle("-fx-max-width: 80;-fx-max-height: 30");
            textField.setFocusTraversable(false);

            Label label1 = new Label("");
            label1.setPadding(new Insets(3,0,0,0));

            hBox.getChildren().addAll(textField,label1);
            mainVBox.getChildren().addAll(label,hBox);
        }return mainVBox;
    }      

rightHBox界面:

右邊的界面,包括的主要UI組部,有image,秒刷順計時畫布canvas,換顔色的 按鈕。

Pane imagePane = new Pane();
        Canvas imageCanvas = new Canvas(100, 100);
        Image image = new Image("image/***.PNG", 78, 135, false, false);
        imagePane.setBackground(new Background(new BackgroundImage(image, BackgroundRepeat.NO_REPEAT,
      BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT, BackgroundSize.DEFAULT)));
        imagePane.getChildren().add(imageCanvas);

        Pane timePane = new Pane();
        Canvas timeCanvas = new Canvas(100, 100);
        rightPen = timeCanvas.getGraphicsContext2D();
        timePane.getChildren().add(timeCanvas);

        colorBtn = new Button("Color");
        colorBtn.setPadding(new Insets(5,35,5,35));
        colorBtn.setStyle(MainWork2.colorStyle);

        rightVBox.getChildren().addAll(imagePane, timePane,colorBtn);      

MainWork類:

類中利用線程處理 滑鼠點選事件,線程每周期休眠0.1秒,每1秒重新整理 順時計時器Canvas。

HBox bottomHBox = new HBoxInstance().getBottomHBox();
VBox rightVBox = new VBoxInstance().getRightVBox();
GraphicsContext pen = VBoxInstance.rightPen;

      

startPaneInit(mainVBox);//開始界面

generateMain(borderPane,Boolean.FALSE);//鍵盤輸入事件

Thread thread = new Thread(){

double time = 0;

public void run(){

  while(true) {

    HBoxInstance.nextBtn.setOnMouseClicked(event -> {}

    HBoxInstance.submitBtn.setOnMouseClicked(event -> {}

    VBoxInstance.colorBtn.setOnMouseClicked(event -> {}  

    if(state){

      paintTime(time, pen);

      try {

        sleep(100);

        time+=0.1;

      } catch (InterruptedException e) {

          e.printStackTrace();

      }

    }

   }

}

borderPane.setCenter(mainVBox);

borderPane.setRight(rightVBox);

borderPane.setBottom(bottomHBox);

4. 調試結果

開始界面

第五次作業—— 四則運算“軟體”開發

試題界面

第五次作業—— 四則運算“軟體”開發

交卷界面

第五次作業—— 四則運算“軟體”開發

點選換一套後

第五次作業—— 四則運算“軟體”開發

點選Color按鍵

第五次作業—— 四則運算“軟體”開發

5. 結對項目過程

 姓名:何志威

 學号:201606120074

 結對成員部落格位址:http://www.cnblogs.com/Richard-V/

 分工:

  1)成員 1:随機生成括号算法、生成階乘題目算法、擷取答案算法

  2)成員 2:圖形化界面設計、生成計時器、更改背景顔色功能

 結對項目學習照片:

第五次作業—— 四則運算“軟體”開發

6. 總結

遇到的難點:

雖然大二時也學過javafx界面開發,但放下一年後對java的布局很陌生,并且在此次項目中深深體會到 用java代碼寫界面 很惡心(而且界面代碼又和一些事件處理混在一起),幸虧javafx中有類似與css style的方法屬性,使得在修改元件樣式時會友善很多,因為不熟悉javafx的布局,是以對于布局也是各種胡亂調試,浪費了很多時間。因為一些事件會觸發界面的重新整理,是以在把觸發界面更新的界面放到了線程中,但又因為線程引起了....

7. 時間表

PSP2.1 Personal Software Process Stages Time Senior Student(h) Time(h)
Planning 計劃 3 2
· Estimate 估計這個任務需要多少時間 10 20
Development 開發 8 11
· Analysis 需求分析 (包括學習新技術) 1
· Design Spec 生成設計文檔
· Design Review 設計複審
· Coding Standard 代碼規範 0.5
· Design 具體設計 4 2.5
· Coding 具體編碼 12 15
· Code Review 代碼複審
· Test 測試(自我測試,修改代碼,送出修改) 1.5
Reporting 報告
· 測試報告
計算工作量
并提出過程改進計劃