Main: 第一部分Human OCR的程式進入點,創建MyWindow物件。 MyWindow: 繼承JFrame,為遊戲的主體,其中有GameStage, Typing兩個panel,並在一個無窮迴圈中, 不斷的初始化GameStage, Typing,並建立兩個Thread去執行他們兩個,直到這兩個Thread 結束後,會跳出訊息框詢問是否重玩,如果不要重玩的話會跳出迴圈。 GameStage: 為遊戲右半邊的畫面,主要工作為顯示動畫及記錄分數,在建構式讀入各個物件(Duck,Ball....) 的Image,並建立JLabel顯示分數,init()初始化Attribute,paintComponent() 依據各個物件的x,y資料畫出圖形,addScore()增加分數並更新JLabel。 最重要的run()是遊戲執行的過程,由一個while迴圈不斷檢查stop是否為true,true的話代表遊 戲結束了就跳出迴圈。迴圈中,第一個是讓Duck上下漂浮而依據Duck的方向加減Duck的y座標。 第二個是當分數有變動時,依據得分決定要將BG,Ball往後移或Duck往前移,並開一個Thread來執 行這個動畫,最後則是檢查是否贏了(21分),贏了就將stop設成true,下一次迴圈就不會跑了。 Typing: 為遊戲左半邊玩家輸入的畫面,主要工作為顯示動畫及讀取玩家輸入並判斷。建構式讀入known, unknown word的檔案,將known的資料存在一個ArrayList<Word>,unknown存在ArrayList <String>,並建立JTextField,為他建立一個ActionListener,當使用者輸入input時,會檢查 是否正確(第一個known word字是否正確以及第二個字不能沒有輸入),正確就執行correct(),其 他則執行changeBackground()顯示錯誤的動畫。 init()初始化各個Attribute,清空usedIndex(ArrayList<Integer>)將每個字標示為未答對。 changePicture1,2()隨機找到一個未答對的圖片,更換圖片,重新設定picture1,2的x,y座標。 changeBackground()根據傳入的參數,開啟一個Thread去不斷更改color以顯示答對或答錯動畫。 correct()答對時的動作,執行changePicture1,2(),changeBackground(),並將答對的圖片 設定為已答對,之後不會重複出現。以及執行GameStage的addScore()讓分數增加。最後則是將 使用者的答案加入toOutput(ArrayList<Word>),以記錄玩家的答案。 paintComponent()畫出picture1,2以及依據color設定背景顏色。 最重要的run(),如同GameStage由檢查stop的while迴圈組成,迴圈中,將picture1,2的y座標 不斷+1讓他們往下跑,並檢查是否跑到底部了,若跑到底部則執行changePicture1,2()換圖片, 迴圈中最後檢查GameStage的stop是否為true,若是的話代表右半邊已經判斷贏了,則將自己的stop 也設成true,下一次迴圈就會跳出。跳出迴圈之後,PrintWriter將使用者的答案toOutput輸出到 output.txt。 Ball: 存放球的x,y座標以及球的Image,建構式讀入Image。 BG: 存放背景的x,y座標以及背景的Image,建構式讀入Image。 Duck: 存放鴨子的x,y座標,上下漂浮的方向,上下漂浮的中心點以及Image,建構式讀入Image。 Word: 如同Pair,存放檔名及對應的字。 Reassembler: 第二部分作業的程式,依據cmd輸入的argument去讀取資料,並使用Scanner去scan,每一行有幾行 幾列的資料,以及對應的字,將字依據行列放在String[20][20] word中。 scan完檔案之後,用for迴圈掃描word的1~15列及行,有字就印出字,若為null就印出"---"。 遇到的困難: 作業說明剛開始看不太懂,後來就決定只採用pdf上部分的作法。 GUI元件不夠熟悉,常常要上網搜尋才知道要怎麼做。 Layout使用方式也不太清楚,嘗試了很多次,後來決定不用layout manager才把元件放到對的位置。 作業第二部分看不懂要我們做什麼,還好問了同學才知道。