標籤:
實 驗 報 告
學號:20135324
姓名:楊舒雯
指導教師:婁嘉鵬
實驗名稱:Java敏捷開發與xp實現(有關代碼所示圖片都為本人親自操作實驗代碼)
實驗內容:
1. XP基礎
2. XP核心實踐
3. 相關工具
實驗步驟
(一)敏捷開發與XP
軟體工程是把系統的、有序的、可量化的方法應用到軟體的開發、運營和維護上的過程。軟體工程包括下列領域:軟體需求分析、軟體設計、軟體構建、軟體測試和軟體維護。 人們在開發、運營、維護軟體的過程中有很多技術、做法、習慣和思想體系。軟體工程把這些相關的技術和過程統一到一個體系中,叫“軟體開發流程”。軟體開發流程的目的是為了提高軟體開發、運營、維護的效率,並提高軟體的品質、使用者滿意度、可靠性和軟體的可維護性。 光有各種流程的思想是不夠的,我們還要有一系列的工具來保證這些思想能夠在實踐中有效率地運作。軟體開發很重要的一點不是看你能對多少理論講的頭頭是道,還要看你對相關工具應用的如何,比如Java中單元測試要和JUnit的應用結合起來,建模要和Umbrello或StarUML的應用結合起來。編程學習是一個習而學
的過程。 一個常見的公式是:軟體工程=開發流程+工具
鄒欣老師給出的兩個公式:軟體=程式+軟體工程
和軟體企業=軟體+商業模式
開發流程大家可以參考學習鄒欣老師的軟體團隊和開發流程。常見的開發流程有:
- RUP(Rational Unified Process)
- PSP(Personal Software Process )
- TSP(Team Software Process )
- Agile Process
- ……
敏捷開發(Agile Development)是一種以人為核心、迭代、循序漸進的開發方法。“敏捷流程”是一系列價值觀和方法論的集合。從2001年開始,一些軟體界的專家開始倡導“敏捷”的價值觀和流程,他們肯定了流行做法的價值,但是強調敏捷的做法更能帶來價值。他們的敏捷開發宣言:
敏捷開發包括很多模式:
其中,極限編程(eXtreme Programming,XP)是是一種全新而快捷的軟體開發方法。XP團隊使用現場客戶、特殊計劃方法和持續測試來提供快速的反饋和全面的交流:
- XP是以開發符合客戶需要的軟體為目標而產生的一種方法論
- XP是一種以實踐為基礎的軟體工程過程和思想
- XP認為代碼品質的重要程度超出人們一般所認為的程度
- XP特別適合於小型的有責任心的、自覺自勵的團隊開發需求不確定或者迅速變化的軟體
XP軟體開發是什麼樣的
通過 XP準則來表達:
- 溝通 :XP認為項目成員之間的溝通是項目成功的關鍵,並把溝通看作項目中間協調與合作的主要推動因素。
- 簡單 :XP假定未來不能可靠地預測,在現在考慮它從經濟上是不明智的,所以不應該過多考慮未來的問題而是應該集中力量解決燃眉之急。
- 反饋 :XP認為系統本身及其代碼是報告系統開發進度和狀態的可靠依據。系統開發狀態的反饋可以作為一種確定系統開發進度和決定系統下一步開發方向的手段。
- 勇氣:代表了XP認為人是軟體開發中最重要的一個方面的觀點。在一個軟體產品的開發中人的參與貫穿其整個生命週期,是人的勇氣來排除困境,讓團隊把局部的最優拋之腦後,達到更重大的目標。表明了XP對“人讓項目取得成功”的基本信任態度。
一項實踐在XP環境中成功使用的依據通過XP的法則
呈現,包括:快速反饋、假設簡單性、遞增更改、提倡更改、優質工作。
XP軟體開發的基石是XP的活動
,包括:編碼、測試、傾聽、設計。
項目成員使用者成功執行XP活動的技術通過XP實踐
來呈現,包括編程、團隊、過程相關的12條實踐:
我們關注其中的編碼通訊協定
,結對程式設計
,代碼集體所有
,測試
,重構
等實踐。上次實驗已經講過TDD,通過學習這些實踐,可以形成以測試為核心的開發流程:
敏捷可以作為一種做事的方式,掌握好的在以後的工作中也會受益無窮。
(二)編碼通訊協定
編寫代碼一個重要的認識是“程式大多時候是給人看的”,編程標準使代碼更容易閱讀和理解,甚至可以保證其中的錯誤更少。編程標準包含:具有說明性的名字、清晰的運算式、直截了當的控制流程、可讀的代碼和注釋,以及在追求這些內容時一致地使用某些規則和慣用法的重要性。
編碼通訊協定中的版式就是一個很好的例子,版式雖然不會影響程式的功能,但會影響可讀性。程式的版式追求清晰、美觀,是程式風格的重要因素。 作為反例,體會一下國際C語言混亂代碼大賽 (IOCCC, The International Obfuscated C Code Contest)的一個例子:
這真是一個可以編譯的C語言程式,體會一下它的可讀性。當然寫出這樣的代碼也是牛人了。我們常見的是這樣的代碼:
程式沒有最基本的縮排,讓人讀起來很費勁,這個問題在Eclipse中比較容易解決,我們單擊Eclipse菜單中的source->Format 或用快速鍵Ctrl+Shift+F就可以按Eclipse規定的規範縮排,
效果如下:
代碼標準中很重要的一項是如何給包、類、變數、方法等標識符命名,能很好的命名可以讓自己的代碼立馬上升一個檔次。Java中的一般的命名規則有:
- 要體現各自的含義
- 包、類、變數用名詞
- 方法名用動賓
- 包名全部小寫,如:io,awt
- 類名第一個字母要大寫,如:HelloWorldApp
- 變數名第一個字母要小寫,如:userName
- 方法名第一個字母要小寫:setName
- ...
標識符名字應當直觀且可以拼讀,可望文知意,不必進行“解碼”,一般採用英文單詞或其組合,便於記憶和閱讀,切忌使用漢語拼音來命名,用詞要準確例如“當前值”應該起名currentValue
,寫成nowValue
就不準確了,但還湊合,寫成dqz
(dang qian zhi 首字母)就是笑話了。
標識符的長度“min-length && max-information”
的原則,比如:maxVal
比 maxValueUntilOverflow
要好些,可以通過去母音法把變數名變短,如returnValue
->rtnVal
,message
->msg
;一般全域變數用具有說明性的名字,局部變數用短名字:單字元的名字,常見的如i,j,k等用作局部變數。
其他的可以參考鄒欣老師寫的代碼規範與代碼複審.
關於代碼標準,可以遵循以下原則:
有一些公司比如Google公開了自己的編碼通訊協定,可以作為學習不錯的參考,大家參考一下範飛龍老師寫的代碼規範&代碼風格,有興趣的可以嘗試如何在Eclipse中實踐Google Java Style(中文版),也就是說如何做到“按一下快速鍵Ctrl+Shift+F
就可以讓自己的代碼符合Google Java Style(中文版)的要求”,完成後單獨寫一篇Blog,有加分的。
(三)結對程式設計
結對程式設計是XP中的重要實踐。在結對程式設計模式下,一對程式員肩並肩、平等地、互補地進行開發工作。他們並排坐在一台電腦前,面對同一個顯示器,使用同一個鍵盤、同一個滑鼠一起工作。他們一起分析,一起設計,一起寫測試案例,一起編碼,一起做單元測試,一起做整合測試,一起寫文檔等。 結對程式設計中有兩個角色:
- 駕駛員(Driver)是修飾鍵盤輸入的人。
- 領航員(Navigator)起到領航、提醒的作用。
如何結對程式設計,為何要結對程式設計,大家參考一下結對程式設計和兩人合作,重點是:
- 駕駛員:寫設計文檔,進行編碼和單元測試等XP開發流程。
- 領航員:審閱駕駛員的文檔、駕駛員對編碼等開發流程的執行;考慮單元測試的覆蓋率;思考是否需要和如何重構;協助駕駛員解決具體的技術問題。
- 駕駛員和領航員不斷輪換角色,不要連續工作超過一小時,每工作一小時休息15分鐘。領航員要控制時間。
- 主動參與。任何一個任務都首先是兩個人的責任,也是所有人的責任。沒有“My Code”、“你的代碼”或“他/她的代碼”,只有“我們的代碼”。
- 只有水平上的差距,沒有層級上的差異。兩人結對,儘管可能大家的層級資曆不同,但不管在分析、設計或編碼上,雙方都擁有平等的決策權利。
團隊精神是好多地方都強調的一個精神,最小的團隊就是一對一的二人團隊了,培養團隊精神從結對程式設計開始吧。社會生活中人與人相處最重要的是誠信,有同理心,互利。結對程式設計中大家會出現分歧,如何更有效地合作要做到對事不對人,掌握這些是可以終生受益的,如何影響小夥伴,大家參考一下兩人合作:要會做漢堡包。
(四)版本控制
XP的集體所有制意味著每個人都對所有的代碼負責;這一點,反過來又意味著每個人都可以更改代碼的任意部分。結對程式設計對這一實踐貢獻良多:藉由在不同的結對中工作,所有的程式員都能看到完全的代碼。集體所有制的一個主要優勢是提升了開發程式的速度,因為一旦代碼中出現錯誤,任何程式員都能修正它。 這意味著代碼要放到一個大家都能方便擷取的地方,我們叫代碼倉庫。這引出另外一個話題叫版本控制(Version Control)。
不論是對於團隊還是個體,版本控制都提供了很多好處。
- 版本控制提供項目級的 undo(撤銷) 功能: 沒有什麼事情是終結版本, 任何錯誤必須很容易復原。 假設你在使用世界上最複雜的文文書處理系統。 它具備了所有的能想到的功能,就是沒有支援 DELETE(刪除) 鍵。想象你打字的時候得多麼的謹慎和緩慢吧, 特別是一篇超大的文檔的快臨近末尾的時候, 一個不小心就要重頭再來(試想你選中所有的文字, 不小心按了 DELETE 鍵, 因為沒有撤銷功能,只好重新錄入)。編輯文字和版本控制相同,任何時候都需要復原,無論是一個小時, 一天, 還是一周, 這讓你的團隊工作自由快速的工作, 而且對於修正錯誤也非常自信。
- 版本控制允許多人在同一代碼上工作, 只要遵守一定的控制原則就行。 再也不會發生諸如一個人覆蓋了另一個人編輯的代碼,導致那個人的修改無效這樣的情況。
- 版本控制系統儲存了過去所作的修改的記錄。如果你遭遇到一些驚訝的代碼,通過版本控制系統可以很容易找出是誰乾的, 修改了什麼, 修改的時間, 如果幸運的話,還能找出原因。
- 版本控制系統還支援在主線上開發的同時發布多個軟體版本。在軟體發布的時候也不需要整個團隊的停止工作,不需要凍結代碼。
- 版本控制也是項目級的時間機器,你可以選擇任何一個時間, 精確地查看項目在當時的情況。 這對研究非常有用, 也是重現以前某個有問題的發布版本的基礎。
流行的版本控制工具有CVS,SVN,Git等,更多的可以參考這裡。Git是Linus除了Linux作業系統外的另外一個重要發明。
實驗樓上線My Code庫功能,為大家提供實驗環境內建的公開的git服務。學習的課程會自動建立一個公開的代碼倉庫,命名為shiyanlou_cs[課程ID],比如本課程的程式碼程式庫命名shiyanlou_cs212,為啟動實驗時會在環境中自動執行git pull,擷取課程倉庫最新代碼,存放在/home/shiyanlou/Code目錄。git push操作需要手動完成,請務必在停止實驗前push全部修改,否則代碼就丟了。注意:
•程式碼程式庫連結:http://git.shiyanlou.com/[您的專屬使用者名稱] •課程代碼倉庫的連結為:http://git.shiyanlou.com/[您的專屬使用者名稱]/shiyanlou_cs[課程ID] •實驗環境中代碼路徑:/home/shiyanlou/Code/shiyanlou_cs[課程ID]
比如我的專屬使用者名稱是rocedu,則My Code庫連結為:http://git.shiyanlou.com/rocedu,我的《Java 程式設計》課程的代碼倉庫連結為:http://git.shiyanlou.com/rocedu/shiyanlou_cs212,該課程實驗環境中代碼路徑為:/home/shiyanlou/Code/shiyanlou_cs212.
點擊立即開通就可以開通My Code庫功能,進入頁面完善資訊即可,如果已經開通服務,請注意專屬使用者名稱必須是字母及數字的組合,建議包含學號資訊。
使用方法如下:
- 如果對Git不熟悉,推薦先學習Git課程
- 開始實驗時,如果您已經有了該課程的代碼倉庫則會自動同步(git pull)到實驗環境中/home/shiyanlou/Code目錄,如果還沒有建立過則會自動建立並同步
- 進入到實驗環境中修改代碼,完成後需要依次執行下述命令即可提交:
$ cd /home/shiyanlou/Code/shiyanlou_cs212
# 修改代碼檔案
# 添加修改檔案
$ git add 所有修改的檔案
# 提交到環境中本地代碼倉庫
$ git commit -m ‘本次修改的描述‘
# push到git.shiyanlou.com,無需輸入密碼
$ git push
複製其他使用者代碼倉庫只需要知道對方的倉庫連結,我們鼓勵在別人代碼基礎上修改:
$ git clone http://git.shiyanlou.com/[對方的專屬使用者名稱]/[課程代碼倉庫名]
我們給一個HelloWorld的例子: 首先進入Code目錄,你會發現有了shiyanlou_cs212目錄,進入shiyanlou_cs212,如所示:
建立HelloWorld目錄,如所示:
建立並編輯HelloWorld.java檔案,如所示:
注意一點,往程式碼程式庫提交的代碼一定編譯、運行、測試都沒有問題的代碼,我們上面測試代碼沒有問題了,就可以提交了:我們可以先用git status查看一下代碼狀態,顯示有未跟蹤的代碼,並建議用git add <file>...添加,我們使用git add HelloWorld.* 把要提交的檔案的資訊添加到索引庫中。當我們使用git commit時,git將依據索引庫中的內容來進行檔案的提交。這隻是在本地操作,關閉實驗環境,會刪除代碼的,如果想把代碼儲存到遠程託管伺服器中,需要使用git push,實驗完成前,一定不要忘了使用git push,否則就是相當於你在Word中編輯了半天檔案最後卻沒有儲存。 我們可以修改HelloWorld.java,如所示:
編譯、運行、測試沒有問題後進行提交,這兒使用的是git commit -a:,
我們可以通過git log查看代碼提交記錄:
誰在什麼時候寫了什麼代碼非常清楚。例子到此結束,有個問題是HelloWorld.class是不應該儲存在程式碼程式庫中的,我們只要有HelloWorld.java就行了,這怎麼辦?通過搜尋引擎解決一下。
當然,Git不是只有程式員才用到,所有需要"Undo"的場合,版本控制都能協助你。參考一下Git for Non-Programmers(中文版)。
更進一步的學習,參考Git使用、工具、原理、進階的幾個連結
(五)重構
我們先看看重構的概念:
重構(Refactor),就是在不改變軟體外部行為的基礎上,改變軟體內部的結構,使其更加易於閱讀、易於維護和易於變更 。
重構中一個非常關鍵的前提就是“不改變軟體外部行為”,它保證了我們在重構原有系統的同時,不會為原系統帶來新的BUG,以確保重構的安全。如何保證不改變軟體外部行為?重構後的代碼要能通過單元測試。如何使其更加易於閱讀、易於維護和易於變更 ?設計模式給出了重構的目標。
重構重要嗎?你看看Eclipse菜單中有個refactor菜單就知道了,重構幾乎是現代IDE的標配了:
我們在編碼通訊協定中說“給標識符命名”是程式員一項重要技能,以前沒有這個意識,現在知道了怎麼辦?沒問題,中重構的第一項功能就是Rename,可以給類、包、方法、變數改名字。 例如這有個ABC類:
這個類,類名,方法名和方法的參數名都有問題,沒有注釋的話是無法理解代碼的。我們可以使用Eclipse中的重構功能來改名。修改方法是,用按一下滑鼠要改的名字,選擇Eclipse中菜單中的Refactor->Rename...:
重構完的效果如下:
功能不變,代碼水平立馬上了一個檔次,體會到命名的威力了吧?
學過C語言的學生學Java時常犯的毛病是不會封裝,該用類的地方都用了結構體。比如要定義一個類Student,會出現這樣的代碼:
Eclipse中菜單中的Refactor->Encapsulate Field...,如:
上面第34,35行還是有問題的,每次列印學生資訊都這麼寫代碼違反了DRY原則,造成代碼重複,正常的重構可以使用Eclipse中的Extract Method...,如:
由於Java中所有的類都有個專門的toString方法,我們使用Eclipse中Source->Generate toString()... 給Student類產生一個toString方法,修改main的代碼,結果如下:
大家想一想,這樣重構後有什麼好處?重構有什麼問題嗎?
我們要修改軟體,萬變不離其宗,無非就是四種動機:
- 增加新功能;
- 原有功能有BUG;
- 改善原有程式的結構;
- 最佳化原有系統的效能 。
第一種和第二種動機,都是源於客戶的功能需求,而第四種是源於客戶的非功能需求。軟體的外部品質,其衡量的標準就是客戶對軟體功能需求與非功能需求的滿意度。它涉及到一個企業、一個軟體的信譽度與生命力,因此為所有軟體企業所高度重視。要提高軟體內部品質,毫無疑問就是軟體修改的第三個動機:改善原有程式的結構。它的價值是隱性的,並不體現在某一次或兩次開發中,而是逐漸體現在日後長期維護的軟體過程中。 高品質的軟體,可以保證開發人員(即使是新手)能夠輕易看懂軟體代碼,能夠保證日後的每一次軟體維護都可以輕易地完成(不論軟體經曆了多少次變更,維護了多少年),能夠保證日後的每一次需求變更都能夠輕易地進行(而不是傷筋動骨地大動)。要做到這幾點其實並不容易,它需要我們持續不斷地對系統內部品質進行最佳化與改進。這,就是系統重構的價值。 下面一個重要問題是哪些地方需要重構?有臭味道(Bad Smell)的代碼。 什麼是臭味道?想象一下你開啟冰箱門,出來一股臭味道你就知道冰箱裡有東西腐壞了,要清除了。代碼一樣有臭味道:
臭味行列中首當其衝的就是Duplicated Code(重複的代碼)。如果你在一個以上的地點看到相同的程式結構,那麼當可肯定:設法將它們合而為一,程式會變得更好。
- 最單純的
Duplicated Code
就是[同一個class內的兩個方法含有相同運算式(expression)]。這時候你需要做的就是採用Extract Method
提煉出重複的代碼,然後讓這兩個地點都調用被提煉出來的那一段代碼。
- 另一種常見情況就是[兩個互為兄弟(sibling)的subclasses內含有相同運算式]。要避免這種情況,只需要對兩個classes都使用
Extract Method
,然後再對被提煉出的代碼使用Pull Up Method
,將它推入superclass內。
- 如果代碼之間只是類似,並非完全相同,那麼就得運用
Extract Method
將相似部分和差異部分割開,構成單獨一個方法。然後你可能發現或許可以運用Form Template Method
獲得一個Template Method
設計模式。
- 如果有些方法以不同的演算法做相同的事,你可以擇定其中較清晰的一個,並使用
Substitute Algorithm
將其它方法的演算法替換掉。
- 如果兩個毫不相關的classes內出現
Duplicaded Code
,你應該考慮對其中一個使用Extract Class
,將重複代碼提煉到一個獨立class中,然後在另一個class內使用這個新class。但是,重複代碼所在的方法也可能的確只應該屬於某個class,另一個class只能調用它,抑或這個方法可能屬於第三個class,而另兩個classes應該引用這第三個class。你必須決定這個方法放在哪兒最合適,並確保它被安置後就不會再在其它任何地方出現。
其他Bad Smell
與相應的重構手法如下表所示:
Eclipse中Refactor
菜單中的重構手示:
更完整的手法可以參考《重構》作者Martin Fowler的部落格。Eclipse中基本手法的使用大家可以參考任何人都可以重構來進行學習實踐。
一個完整的重構流程包括:
- 從版本控制系統程式碼程式庫中Check out code
- 讀懂代碼(包括測試代碼)
- 發現bad smell
- Refactoring
- 運行所有的Unit Tests
- 往程式碼程式庫中Check in code
我們結合Git給出一個比較完整的例子。
(六)實踐項目1.小組合作:20135303魏昊卿 負責:尋找資料、編寫、修改代碼 blog地址:http://www.cnblogs.com/20135303whq/20135324楊舒雯 負責:考量需求、測試代碼 、修改代碼
2.所選遊戲:人機猜拳。使用者通過螢幕下方的按鈕來做出“石頭、剪刀、布”的選擇,電腦隨機做出選擇後,提示使用者輸贏或者平局。
代碼如下:
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
@SuppressWarnings("serial")
public class Game extends JFrame {
private JPanel contentPane;
private JPanel userPanel;
private JPanel computerPanel;
private JLabel userValue;
private JLabel computerValue;
private JLabel resultLable;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Game frame = new Game();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Game() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton shitouBtn = new JButton("石頭");
shitouBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
userValue.setText("石頭");
computerValue.setText(getComputerValue());
compareValues();
}
});
shitouBtn.setBounds(144, 216, 146, 46);
contentPane.add(shitouBtn);
JButton buBtn = new JButton("布");
buBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
userValue.setText("布");
computerValue.setText(getComputerValue());
compareValues();
}
});
buBtn.setBounds(288, 216, 146, 46);
contentPane.add(buBtn);
JButton jiandanBtn = new JButton("剪刀");
jiandanBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
userValue.setText("剪刀");
computerValue.setText(getComputerValue());
compareValues();
}
});
jiandanBtn.setBounds(0, 216, 146, 46);
contentPane.add(jiandanBtn);
computerPanel = new JPanel();
computerPanel.setBackground(Color.WHITE);
computerPanel.setForeground(Color.BLACK);
computerPanel.setBorder(new LineBorder(new Color(0, 0, 0)));
computerPanel.setBounds(318, 60, 95, 87);
contentPane.add(computerPanel);
computerValue = new JLabel("");
computerPanel.add(computerValue);
userPanel = new JPanel();
userPanel.setBackground(Color.WHITE);
userPanel.setBorder(new LineBorder(new Color(0, 0, 0)));
userPanel.setBounds(64, 60, 95, 87);
contentPane.add(userPanel);
userValue = new JLabel("");
userPanel.add(userValue);
JLabel lblNewLabel = new JLabel("歡迎使用人機猜拳程式");
lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
lblNewLabel.setBounds(10, 10, 414, 15);
contentPane.add(lblNewLabel);
JLabel label = new JLabel("結果");
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setBounds(0, 154, 424, 15);
contentPane.add(label);
resultLable = new JLabel("");
resultLable.setHorizontalAlignment(SwingConstants.CENTER);
resultLable.setBounds(0, 179, 424, 15);
contentPane.add(resultLable);
JLabel label_2 = new JLabel("你出拳:");
label_2.setBounds(0, 67, 54, 46);
contentPane.add(label_2);
JLabel label_3 = new JLabel("電腦出拳:");
label_3.setBounds(242, 64, 77, 53);
contentPane.add(label_3);
}
//電腦出拳,產生一個隨機數(0,1,2)代表:石頭、剪刀、布
//電腦出拳,產生一個隨機數(0,1,2)代表:石頭、剪刀、布
public String getComputerValue() {
String[] quans = {"石頭","剪刀","布"};
Random random = new Random();
int value = random.nextInt(100);
value = value%3;
return quans[value];
}
private void compareValues() {
String userText = userValue.getText();
String computerText = computerValue.getText();
String result = "PK";
if(userText.equals(computerText)) {
result = "棋逢對手!再來";
} else {
if("石頭".equals(userText)) {
if("剪刀".equals(computerText)) {
result = "你贏了!!好棒!!";
}else if("布".equals(computerText)){
result = "你輸了!!加油啊!";
}
}
if("剪刀".equals(userText)) {
if("布".equals(computerText)) {
result = "你贏了!!好棒!!";
}else if("石頭".equals(computerText)){
result = "你輸了!!加油啊!";
}
}
if("布".equals(userText)) {
if("石頭".equals(computerText)) {
result = "你贏了!!好棒!!";
}else if("剪刀".equals(computerText)){
result = "你輸了!!加油啊!";
}
}
}
resultLable.setText(result);
}
}
初始運行介面如下:
輸:
贏:
平局:
2.實驗報告中統計自己的PSP(Personal Software Process)時間
步驟 |
耗時 |
百分比 |
需求分析 |
20min |
14% |
設計 |
20min |
14% |
代碼實現 |
60min |
43% |
測試 |
30min |
21% |
分析總結 |
10min |
8% |
(七)實驗總結
這次實驗對我來說相對比較難的一次實驗,尤其是最後的自己做的小遊戲,查了許多的資料才艱難的完成。在實驗中版本控制的內容中指導書的內容並不詳細,並不能將HelloWorld儲存進去。後就自己在實驗樓裡建立了一個空文檔,將代碼打進去,才可以接著做實驗
Java實驗三