![瘋狂講義課后習(xí)題解析_第1頁](http://file4.renrendoc.com/view/c256d729989e12b5924e95d42bdef882/c256d729989e12b5924e95d42bdef8821.gif)
![瘋狂講義課后習(xí)題解析_第2頁](http://file4.renrendoc.com/view/c256d729989e12b5924e95d42bdef882/c256d729989e12b5924e95d42bdef8822.gif)
![瘋狂講義課后習(xí)題解析_第3頁](http://file4.renrendoc.com/view/c256d729989e12b5924e95d42bdef882/c256d729989e12b5924e95d42bdef8823.gif)
![瘋狂講義課后習(xí)題解析_第4頁](http://file4.renrendoc.com/view/c256d729989e12b5924e95d42bdef882/c256d729989e12b5924e95d42bdef8824.gif)
![瘋狂講義課后習(xí)題解析_第5頁](http://file4.renrendoc.com/view/c256d729989e12b5924e95d42bdef882/c256d729989e12b5924e95d42bdef8825.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1章臺五子棋1臺五子棋1.1引言Java臺運(yùn)行的五子棋,需要用戶用鍵盤輸入棋子的位置來進(jìn)行由于是在。黑色臺環(huán)境下進(jìn)行,Java編程的基礎(chǔ)知識,因在本章中將使用最簡單的方式來實(shí)現(xiàn)一個(gè)臺五子棋。1.1.1五子棋介紹五子棋是英文稱之為”Gobang”或”FIR”(FiveinaRow)是一個(gè)比較大眾的棋類,大多數(shù)人都會玩這個(gè),五子棋的與規(guī)則如下:五子棋是兩個(gè)人之間進(jìn)行的活動,由于對黑方白方規(guī)則不同,黑棋必須先行(本章節(jié)設(shè)計(jì)的五子棋,黑棋與白棋的規(guī)則一樣,但一樣由黑棋先下)。15×15,五連子的方向?yàn)闄M、豎、斜。在棋盤上以對局雙方均不可能形成五連為和棋。首先形成五連子的一方為贏。五子棋必須由雙方進(jìn)行1章臺五子棋1臺五子棋1.1引言Java臺運(yùn)行的五子棋,需要用戶用鍵盤輸入棋子的位置來進(jìn)行由于是在。黑色臺環(huán)境下進(jìn)行,Java編程的基礎(chǔ)知識,因在本章中將使用最簡單的方式來實(shí)現(xiàn)一個(gè)臺五子棋。1.1.1五子棋介紹五子棋是英文稱之為”Gobang”或”FIR”(FiveinaRow)是一個(gè)比較大眾的棋類,大多數(shù)人都會玩這個(gè),五子棋的與規(guī)則如下:五子棋是兩個(gè)人之間進(jìn)行的活動,由于對黑方白方規(guī)則不同,黑棋必須先行(本章節(jié)設(shè)計(jì)的五子棋,黑棋與白棋的規(guī)則一樣,但一樣由黑棋先下)。15×15,五連子的方向?yàn)闄M、豎、斜。在棋盤上以對局雙方均不可能形成五連為和棋。首先形成五連子的一方為贏。五子棋必須由雙方進(jìn)行來進(jìn)行。1.1.2輸入輸出約定x代表棋坐標(biāo),y代表豎坐標(biāo)。xy的值必須1N(棋盤的大?。┑恼龜?shù)。系統(tǒng)詢問玩家是否繼續(xù)時(shí),玩家輸入y是代表繼續(xù),輸入其它則代表。中就可以根據(jù)(,)的形式輸入下棋的坐標(biāo)后,“十,玩家下棋后,將棋子替換原來的標(biāo)志,最后再執(zhí)行輸入。由于本章是在因此只需要使用System.out.println來進(jìn)行打印即可,如果需要實(shí)現(xiàn)有界面的五子棋臺中進(jìn)行打印,,例如使用Downloadat·2·1章臺五子棋swing或者awt,可以使用相應(yīng)的方法,將二維數(shù)組“畫”到界面中。因此,不管是使用swing、awt或者其他界面技術(shù),五子棋的實(shí)現(xiàn)原理幾乎大同小異。1.2了解的整個(gè)過程中可以清晰的掌握程序結(jié)構(gòu),對于實(shí)現(xiàn)功能有莫大的幫助,五子棋的具體流程如圖1.1所示。1.1五子棋流程1.2.1玩家輸入坐標(biāo)則系統(tǒng)詢問是否繼續(xù)·2·1章臺五子棋swing或者awt,可以使用相應(yīng)的方法,將二維數(shù)組“畫”到界面中。因此,不管是使用swing、awt或者其他界面技術(shù),五子棋的實(shí)現(xiàn)原理幾乎大同小異。1.2了解的整個(gè)過程中可以清晰的掌握程序結(jié)構(gòu),對于實(shí)現(xiàn)功能有莫大的幫助,五子棋的具體流程如圖1.1所示。1.1五子棋流程1.2.1玩家輸入坐標(biāo)則系統(tǒng)詢問是否繼續(xù)。臺中系統(tǒng)玩家輸入的坐標(biāo)中是否已經(jīng)存在了相應(yīng)的棋子,如果存在的話,需要再次提示玩家,重新輸入。Downloadat1章·3·臺五子棋1.2.2“電腦”下棋玩家沒有已經(jīng)講到,本章可以實(shí)現(xiàn)一個(gè)簡單的電腦來進(jìn)行,只需要隨便的產(chǎn)生棋盤坐標(biāo),就可以讓“電腦”方式(是否五子相連)來 已經(jīng)使得經(jīng)勝利了。1.3創(chuàng)建這里設(shè)計(jì)三個(gè)類來完成的功能,棋盤類(d,類(GobangGame1章·3·臺五子棋1.2.2“電腦”下棋玩家沒有已經(jīng)講到,本章可以實(shí)現(xiàn)一個(gè)簡單的電腦來進(jìn)行,只需要隨便的產(chǎn)生棋盤坐標(biāo),就可以讓“電腦”方式(是否五子相連)來 已經(jīng)使得經(jīng)勝利了。1.3創(chuàng)建這里設(shè)計(jì)三個(gè)類來完成的功能,棋盤類(d,類(GobangGame)與棋子類((枚舉類1.2dgG,關(guān)系。下面一一介紹。1.2五子棋類圖Downloadat·4·1章臺五子棋1.3.1Chessboard類要進(jìn)行五子棋這個(gè)類包含以下方法:voidinitBoard(),這個(gè)方法用于初始化棋盤,開始新的個(gè)新的空棋盤。時(shí),應(yīng)該調(diào)用此方法,初始化出一狀態(tài)有改變,所以必須調(diào)用此方法重新輸入棋盤。posX,intposY,Stringchessman),posXposY·4·1章臺五子棋1.3.1Chessboard類要進(jìn)行五子棋這個(gè)類包含以下方法:voidinitBoard(),這個(gè)方法用于初始化棋盤,開始新的個(gè)新的空棋盤。時(shí),應(yīng)該調(diào)用此方法,初始化出一狀態(tài)有改變,所以必須調(diào)用此方法重新輸入棋盤。posX,intposY,Stringchessman),posXposYxy坐是新下棋子的類型(黑子與白子),每下完一顆棋子后,通過調(diào)用此方法把棋子設(shè)置到棋盤上。String[][]getBoard(),返回棋盤,返回類型是保存棋盤的二維數(shù)組。ChessboardinitBoard方法,我們需要考慮該方法需要實(shí)現(xiàn)的功能:初始化棋盤。由于initBoard就需要幫我們?nèi)?chuàng)建一個(gè)二維數(shù)組,創(chuàng)建二維數(shù)組可以使用以下代碼。代碼 素進(jìn)行賦值。在中如果我們進(jìn)行了下棋的操作,可以直接改變這個(gè)數(shù)組的某一個(gè)元素值。在創(chuàng)建Chessboard類時(shí),我們就需要發(fā)揮面向?qū)ο蟮乃季S,在我們的程序中,所有看到的或者想的事物,我物拿捏,不知如何設(shè)計(jì)屬性或者行為,可以將其設(shè)計(jì)成接口或者抽象類。printBoard的方法用于打印棋盤,在本章中,我們就需要將棋盤數(shù)組打印到臺中,因此該方法可以簡單的調(diào)用System.out.print去打印相關(guān)的字符串。需要注意的是,由于printBoard方法是沒有參數(shù)的,因此我們需要為Chessboard提供一個(gè)二維數(shù)組變量,當(dāng)調(diào)用printBoardChessboard看作一個(gè)有狀態(tài)的JavaJava對象。當(dāng)外部調(diào)用Chessboard的setBoardChessboard中的二維數(shù)組里,玩家或者“電腦”在某個(gè)位置下了怎樣的棋子。1.3.2Chessman類BLACKWHITE兩個(gè)屬性調(diào)用以下的方法獲取棋子:String類型的棋子實(shí)例,“●”或者“○”。如果我們需要得到棋子的字符串代碼Chessman.BLACK.getChessman(); DownloadatObject[][]array=newObject[size][size];for(inti=0;i<array.length;i++){for(intj=0;j<array[i].length;j++){array[i][j]=newObject();}}1章·5·臺五子棋1.3.3GobangGame類GobangGame類是進(jìn)行的類,Chessboard依賴于此類,此類的開始,重玩與結(jié)束,類。主要包含以下構(gòu)造器與方法:GobangGame(),默認(rèn)無參數(shù)構(gòu)造器。Chessboard實(shí)例去初始化這個(gè)類。booleanisValidStringinputStr,此方法驗(yàn)證Exception異常。voidstart(),開始異常。chessman代表黑子或白子。1章·5·臺五子棋1.3.3GobangGame類GobangGame類是進(jìn)行的類,Chessboard依賴于此類,此類的開始,重玩與結(jié)束,類。主要包含以下構(gòu)造器與方法:GobangGame(),默認(rèn)無參數(shù)構(gòu)造器。Chessboard實(shí)例去初始化這個(gè)類。booleanisValidStringinputStr,此方法驗(yàn)證Exception異常。voidstart(),開始異常。chessman代表黑子或白子。computerDo()x與int[]數(shù)組類型。booleanisWon(intposX,intposY,Stringico),truefalse。GobangGame是我們五子棋的主體類, 類中實(shí)現(xiàn)。GobangGameisValid方法用于驗(yàn)證臺的輸入,玩家主要在臺輸入下棋的坐標(biāo),下棋的坐標(biāo)的字符串形,x和yislidtrueChessboard的二維數(shù)組。(dinit方法臺 證 臺輸入的信息等,這些功能在下面的章節(jié)中加以描述。方法用于隨機(jī)產(chǎn)生坐標(biāo)。一局棋后(玩家下棋或者“電腦”下棋)調(diào)用。在每次下到此,用策略模式,如果需要產(chǎn)生出不同的棋子(將臺換成其他界面,可以編寫棋子工廠等。但是本章主要目的是展現(xiàn)一個(gè)最簡單的五子棋,因此本章中并不涉及任何具體的設(shè)計(jì)模式。1.4棋盤類實(shí)現(xiàn)去保存棋盤,board[i][j]代表棋盤的某個(gè)位置ix坐標(biāo),jy坐標(biāo)rd]的BOARD_SIZE的是一個(gè)BOARD_SIZ_SIZE1.3描述了為什么需要使用一個(gè)二維數(shù)組來代N儲與表現(xiàn)這個(gè)棋盤。Downloadat·6·1章臺五子棋1.3棋盤與數(shù)組的關(guān)系1.4.1各個(gè)功能。首先我們需要初始化棋盤的實(shí)現(xiàn),看以下代碼片段。代碼String[][]類型的二維數(shù)組來代表棋盤,創(chuàng)以將數(shù)組中具體的某個(gè)“十”替換成具體的棋子字符串?!?·1章臺五子棋1.3棋盤與數(shù)組的關(guān)系1.4.1各個(gè)功能。首先我們需要初始化棋盤的實(shí)現(xiàn),看以下代碼片段。代碼String[][]類型的二維數(shù)組來代表棋盤,創(chuàng)以將數(shù)組中具體的某個(gè)“十”替換成具體的棋子字符串。1.4.2輸出棋盤的到具體的某個(gè)二維數(shù)組的元素,將其打印即可。代碼DownloadatpublicvoidprintBoard(){打印每個(gè)數(shù)組元素for(inti=0;i<BOARD_SIZE;i++){publicvoidinitBoard(){//初始化棋盤數(shù)組board=newString[BOARD_SIZE][BOARD_SIZE];//把每個(gè)元素賦值為“十”,用于 臺輸出棋盤for(inti=0;i<BOARD_SIZE;i++){for(intj=0;j<BOARD_SIZE;j++){board[i][j十";}}}1章·7·臺五子棋System.out.println()方法是輸出后自動換行的,如果使用此方法,便達(dá)不到我們需要的效果,棋盤的輸1.4。臺五子棋的棋盤打印出來的效果,就好像在臺中出現(xiàn)了一個(gè)棋盤。1.4.3獲取棋盤getBoard的方法,用于返回本對象的棋盤二維數(shù)組,該方法一般在中調(diào)用,類得到棋盤的二維數(shù)組,可以用于棋盤中的某一個(gè)位置是否有1章·7·臺五子棋System.out.println()方法是輸出后自動換行的,如果使用此方法,便達(dá)不到我們需要的效果,棋盤的輸1.4。臺五子棋的棋盤打印出來的效果,就好像在臺中出現(xiàn)了一個(gè)棋盤。1.4.3獲取棋盤getBoard的方法,用于返回本對象的棋盤二維數(shù)組,該方法一般在中調(diào)用,類得到棋盤的二維數(shù)組,可以用于棋盤中的某一個(gè)位置是否有棋子或者計(jì)算是否勝利。board(二維數(shù)組)返回即可,代碼如下。代碼Java語言的基本操作,例如嵌套循環(huán)、創(chuàng)建二維數(shù)組等。在下面的小節(jié)中,去實(shí)現(xiàn)游戲的部分。Downloadat/**返回棋盤@return返回棋盤*/publicString[][]getBoard(){returnthis.board;}for(intj=0;j<BOARDSIZE;j++){//打印后不換行System.out.print(board[i][j]}System.out.print("\n");}}·8·1章臺五子棋1.5棋子枚舉類實(shí)現(xiàn)在某些情況下,一個(gè)類的屬性是有限而且固定的(在某些情況下,例如本章中的棋子類,它只有JavaenumBLACKWHITE,代表黑子與白子,代碼實(shí)現(xiàn)如下:代碼 :code\gobang\src\org\crazyit\gobang\Chessman.javaenum·8·1章臺五子棋1.5棋子枚舉類實(shí)現(xiàn)在某些情況下,一個(gè)類的屬性是有限而且固定的(在某些情況下,例如本章中的棋子類,它只有JavaenumBLACKWHITE,代表黑子與白子,代碼實(shí)現(xiàn)如下:代碼 :code\gobang\src\org\crazyit\gobang\Chessman.javaenumclass關(guān)鍵字,看到此枚舉類的構(gòu)造等同以下代碼:在字符串,因此可以直接寫成枚舉對象即可。如果你希望你的程能有更好的擴(kuò)展性,筆者建議可以根據(jù)情況建立棋子接口,并提供白棋與黑棋的在本小節(jié)的開頭提到:在某些情況下,一個(gè)類中的屬性有限并且是固定的。但是在我們開發(fā)的實(shí)際情況中(特別是做企業(yè)應(yīng)用,隨著業(yè)務(wù)的不斷變化,類的不可變幾乎是不可能的。舉個(gè)例子,如果需要將swing界面中,那么該棋子枚舉類就不得不更改了。雖然本章是為了做一個(gè)較為簡單的五子棋,但 的想向大家展現(xiàn)面向?qū)ο蟮乃季S。1.6類實(shí)現(xiàn)本章中的 類是GogangGame,在該類中,主要的開始,重新開始與結(jié)束,驗(yàn)證玩家輸入的,的輸與贏,調(diào)用棋盤類來初始化棋盤,打印棋盤,使用棋子類去設(shè)置棋盤等。posXpoxY,用來xy坐標(biāo)(xy坐標(biāo)DownloadatChessman.WHITE.getChessman();publicstaticfinalChessmanBLACK=newChessman(“●”);publicstaticfinalChessmanWHITE=newChessman(“○”);publicenumChessman{BLACK("●"),WHITE("○");privateStringchessman;/**私有構(gòu)造器*/privateChessman(Stringchessman){this.chessman=chessman;}/**@return黑棋或者白棋*/publicStringgetChessman(){returnthis.chessman;}}1章·9·臺五子棋是指玩家輸入的數(shù)字對應(yīng)棋盤數(shù)組中的一維值與二維值5的int類型常量WIN_COUNT,勝利需要連接的棋子達(dá)到的連子數(shù)目,由于是五子棋,因此只需要5個(gè)棋子相連,用初始化棋盤、打印棋盤、獲得棋盤(數(shù)組)等方法。1.6.1使用BufferedReader獲取鍵盤輸入從輸入流中1章·9·臺五子棋是指玩家輸入的數(shù)字對應(yīng)棋盤數(shù)組中的一維值與二維值5的int類型常量WIN_COUNT,勝利需要連接的棋子達(dá)到的連子數(shù)目,由于是五子棋,因此只需要5個(gè)棋子相連,用初始化棋盤、打印棋盤、獲得棋盤(數(shù)組)等方法。1.6.1使用BufferedReader獲取鍵盤輸入從輸入流中將其包裝成字符流。所以程序中用于獲取鍵盤的輸入采用以下代碼創(chuàng)建。continue跳出本次循環(huán)。while循環(huán)體中增加許多的if語句,這些if語句會影響程序的可讀性,如果需要將這些if語句去掉,我們可以將每個(gè)if中的代碼while循環(huán)體中的代碼,而且可以使得程序更加清晰,程序的耦合度更低,while循環(huán)體中只負(fù)責(zé)玩家輸入的字符串,而具體的處理則不必由該方法以查看“仿大廳”一章。1.6.2驗(yàn)證玩家輸入字符串的的方式輸入,還需要驗(yàn)證輸入的字符串是否能轉(zhuǎn)換為數(shù)字,是否 要 該位置是否已經(jīng)存在棋子,具體 流程如圖1.5所示。1.5驗(yàn)證流程首先,x與y必須是一個(gè)數(shù)字,由以下代碼驗(yàn)證。代碼 Downloadat//獲取鍵盤的輸入BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));StringinputStr=null;每當(dāng)鍵盤輸入一行內(nèi)容按回車鍵,則輸入的內(nèi)容被br 到while((inputStr=br.readLine())!=null){/***處理鍵盤輸入*/}·10·1章臺五子棋NumberFormatExceptioncatch將該異玩家輸入的字符串是否符合我們所要求的格式玩家輸入的坐標(biāo)范圍,即該范圍不可小于1并不可大于棋盤數(shù)組的最大值,例如棋盤是異常,因此,xy的1(棋盤的大小·10·1章臺五子棋NumberFormatExceptioncatch將該異玩家輸入的字符串是否符合我們所要求的格式玩家輸入的坐標(biāo)范圍,即該范圍不可小于1并不可大于棋盤數(shù)組的最大值,例如棋盤是異常,因此,xy的1(棋盤的大小碼驗(yàn)證。代碼驗(yàn)證了輸入坐標(biāo)的后,還需要驗(yàn)證玩家輸入的坐標(biāo)中是否已經(jīng)存在棋子,我們通過ChessboardgetBoard方法可以得到棋盤的二維數(shù)組,根據(jù)玩家輸入的坐標(biāo)得到數(shù)組中的元素,再(,則提示玩家重新輸入,由以下代碼驗(yàn)證。代碼 輸入的坐標(biāo)是否超過棋盤范圍,異常。1.6.3(輸入的坐標(biāo)輸贏的行為,GobangGame類。輸贏在本章的程序中稍微復(fù)雜,有兩種方法來輸贏:Downloadat//檢查輸入的位置是否已經(jīng)有棋子String[][]board=chessboard.getBoard();ifboard[posX][posY十chessboard.printBoard();System.out.println(此位置已經(jīng)有棋子,請重新輸入:");returnfalse;}//檢查輸入數(shù)值是否在范圍之內(nèi)if(posX<0||posX>=Chessboard.BOARDSIZE||posY<0||posY>=Chessboard.BOARDSIZE){chessboard.printBoard();System.out.println("X與Y1,與小于等于"Chessboard.BOARD_SIZE請重新輸入:");returnfalse;}(,)作為分隔,分隔成兩個(gè)字符串String[posStrArrinputStr.split(",");try{posX=Integer.parseInt(posStrArr[0])-1;posY=Integer.parseInt(posStrArr[1])-1;}catch(NumberFormatExceptione){chessboard.printBoard();System.out.println("請以(數(shù)字,數(shù)字)的格式輸入:");returnfalse;}1章·11·臺五子棋每次下完一顆棋子,就通過程序從橫、豎、斜各個(gè)方向掃描棋盤,如果在某個(gè)方向中,有同種顏色的棋子達(dá)到五連子,則此顏色的玩家為贏。如果沒有相同顏色的棋子達(dá)到五連子,則繼續(xù)。該方法需要遍歷整個(gè)棋盤,也就是意味著每次下棋后(玩家或者“電腦”)都需要對棋盤進(jìn)行遍歷,這樣對程序的性能會造成一定的影響。每次下完一顆棋子,以該棋子為中心,掃描在此棋子所在范圍內(nèi)的橫、豎、斜方向,驗(yàn)證加上因?yàn)椴恍枰獟呙枵麄€(gè)棋盤,所以更加快速,本章程序使用的是此方法,該方法的原理如圖1.6所示。五連子1章·11·臺五子棋每次下完一顆棋子,就通過程序從橫、豎、斜各個(gè)方向掃描棋盤,如果在某個(gè)方向中,有同種顏色的棋子達(dá)到五連子,則此顏色的玩家為贏。如果沒有相同顏色的棋子達(dá)到五連子,則繼續(xù)。該方法需要遍歷整個(gè)棋盤,也就是意味著每次下棋后(玩家或者“電腦”)都需要對棋盤進(jìn)行遍歷,這樣對程序的性能會造成一定的影響。每次下完一顆棋子,以該棋子為中心,掃描在此棋子所在范圍內(nèi)的橫、豎、斜方向,驗(yàn)證加上因?yàn)椴恍枰獟呙枵麄€(gè)棋盤,所以更加快速,本章程序使用的是此方法,該方法的原理如圖1.6所示。五連子1.6((((((((斷的輸贏,并且是以該棋子為中心向周圍進(jìn)行遍歷。以下是輸贏的代碼實(shí)現(xiàn)。代碼Downloadat//直線起點(diǎn)的X坐標(biāo)intstartX=0;//直線起點(diǎn)Y坐標(biāo)intstartY=0;//直線結(jié)束X坐標(biāo)intendX=Chessboard.BOARD_SIZE-1;//直線結(jié)束Y坐標(biāo)intendY=endX;intsameCount=0;inttemp=0;//X坐標(biāo)與Y坐標(biāo)temp=posX-WIN_COUNT+1;startXtemp<0?0:temp;temp=posY-WIN_COUNT+1;startYtemp00temp;//X坐標(biāo)與Y坐標(biāo)temp=posX+WIN_COUNT-1;·12·1章臺五子棋從上面代碼中可以看到,首先是計(jì)算出在這顆棋子的直線上(橫、豎、斜方向)能達(dá)到五連子的最小x、yx、yx、y坐標(biāo)到最大x、y坐標(biāo),如果此顏色棋子的相連累積方法與橫向遍·12·1章臺五子棋從上面代碼中可以看到,首先是計(jì)算出在這顆棋子的直線上(橫、豎、斜方向)能達(dá)到五連子的最小x、yx、yx、y坐標(biāo)到最大x、y坐標(biāo),如果此顏色棋子的相連累積方法與橫向遍sameCount1。1.6.4計(jì)算機(jī)隨機(jī)下棋Math.random方法來產(chǎn)生0.0到1.0之間的double數(shù)組,再使用該值來乘以棋盤的大小,即可產(chǎn)生隨機(jī)的坐標(biāo)。果想讓計(jì)算并對這些位置的坐標(biāo)進(jìn)行相應(yīng)的分析。以下是隨機(jī)生成坐標(biāo)的代碼實(shí)現(xiàn)。代碼 :code\gobang\src\org\crazyit\gobang\GobangGame.javawhile循環(huán),其中循環(huán)條件是棋盤數(shù)組中是否已經(jīng)存在棋while將永遠(yuǎn)跳出,即死循環(huán),所以我們需要棋盤中是否所有的位置都有棋子,如果棋盤中已經(jīng)都存在棋子并且沒有輸贏的話,就可以提示玩家和棋了,重新開始。yMath.random()BOARD_SIZE(棋Math.radom()方法獲取坐標(biāo),直到這個(gè)坐標(biāo)中沒有棋子。Downloadat//隨機(jī)生成x坐標(biāo),即二維數(shù)組具體一維的值intposX=(int)(Math.random()*(Chessboard.BOARDSIZE-1));//y坐標(biāo),即二維數(shù)組具體二維的值intposY=(int)(Math.random()*(Chessboard.BOARDSIZE-1));String[][]board=chessboard.getBoard();//當(dāng)棋盤中的位置不是“十”的時(shí)候(已經(jīng)有棋子),則再次生成新的坐標(biāo)whileboard[posX][posY十posX=(int)(Math.random()*(Chessboard.BOARDSIZE-1));posY=(int)(Math.random()*(Chessboard.BOARDSIZE-1));}endX=temp>Chessboard.BOARDSIZE-1?Chessboard.BOARDSIZE-1:temp;temp=posY+WINCOUNT-1;endY=temp>Chessboard.BOARDSIZE-1?Chessboard.BOARDSIZE-1:temp;//從左到右方向計(jì)算相同相鄰棋子的數(shù)目String[][]board=chessboard.getBoard();forintistartYiendY;i+if(board[posX][i]==ico&&board[posX][i+1]==ico){sameCount++;}elseif(sameCount!=WINCOUNT-1){sameCount=0;}}1章·13·臺五子棋1.6.5是否重新實(shí)現(xiàn)是否重新開始臺輸出詢問玩家是否重新開始 個(gè)程序,實(shí)現(xiàn)代碼如下。整代碼1.6.6以下是1.2:(add1章·13·臺五子棋1.6.5是否重新實(shí)現(xiàn)是否重新開始臺輸出詢問玩家是否重新開始 個(gè)程序,實(shí)現(xiàn)代碼如下。整代碼1.6.6以下是1.2:(addtB(方法去初始化與打印棋盤。(2)從臺獲取用戶的輸入。isValid()方法去驗(yàn)證玩家輸入"●"。2步繼續(xù),chessman)玩家是否贏了。如果玩家贏了,則調(diào)用isReply()方法輸出的信息詢問玩家是否重新開始。y1步重新x,yboard[x][y]賦值為"○"。如果isReply()方法輸出的信息詢問玩家是否重新12步輪到用戶輸入。以下的代碼實(shí)現(xiàn)以上的流程。代碼 :code\gobang\src\org\crazyit\gobang\GobangGame.javay,則返Downloadat//true為 結(jié)束booleanisOver=false;chessboard.printBoard();/**是否重新開始下棋。@paramchessman●"為用戶,"○"為計(jì)算機(jī)。false。*/publicbooleanisReplay(Stringchessman)throwsException{chessboard.printBoard();Stringmessage=chessman.equals(Chessman.BLACK.getChessman()) ,您贏了,很遺憾,您輸了,";System.out.printlnmessage再下一局?(y/n)"BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));if(br.readLine().equals("y")){//開始新一局returntrue;}returnfalse;}·14·1章臺五子棋isOver來標(biāo)識是否勝利,當(dāng)勝利時(shí),就詢問玩家是否繼ifJava·14·1章臺五子棋isOver來標(biāo)識是否勝利,當(dāng)勝利時(shí),就詢問玩家是否繼ifJava的基礎(chǔ)知識來解if(可以使用設(shè)計(jì)模式中的策略模式if由于這些if的存在,會使得我們程序的可讀性變差,在“仿字符大串關(guān)作相應(yīng) 廳”一章。本章的目的主要介紹一個(gè)簡單五子棋的實(shí)現(xiàn)。Downloadat//獲取鍵盤的輸入BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));StringinputStr=null;每當(dāng)鍵盤輸入一行內(nèi)容按回車鍵,則輸入的內(nèi)容被br 到while((inputStr=br.readLine())!=null){isOver=false;if(!isValid(inputStr)){continue;}//把對應(yīng)的數(shù)組元素賦為"●"Stringchessman=Chessman.BLACK.getChessman();chessboard.setBoard(posX,posY,chessman);// 用戶是否贏了if(isWon(posX,posY,chessman)){isOver=true;}else{//計(jì)算機(jī)隨機(jī)選擇位置坐標(biāo)int[]computerPosArr=computerDo();chessman=Chessman.WHITE.getChessman();chessboard.setBoard(computerPosArr[0],computerPosArr[1],chessman);if(isWon(computerPosArr[0],computerPosArr[1],chessman)){isOver=true;}}if(isOver){//如果繼續(xù),重新初始化棋盤,繼續(xù)if(isReplay(chessman)){chessboard.initBoard();continue;}//如果不繼續(xù), 程序break;}chessboard.printBoard();x,y的格式輸入:");}1章·15·臺五子棋1.7本章小結(jié)這些基礎(chǔ)。Downloadat1章·15·臺五子棋1.7本章小結(jié)這些基礎(chǔ)。Downloadat2章仿Windows計(jì)算器2Windows計(jì)算器2.1仿Windows計(jì)算器概述實(shí)現(xiàn),Windows計(jì)算器實(shí)現(xiàn)的主要功能有:四則運(yùn)算;求倒數(shù);求開方; 計(jì)算結(jié)果;計(jì)算結(jié)果;累積計(jì)算結(jié)果。2章仿Windows計(jì)算器2Windows計(jì)算器2.1仿Windows計(jì)算器概述實(shí)現(xiàn),Windows計(jì)算器實(shí)現(xiàn)的主要功能有:四則運(yùn)算;求倒數(shù);求開方; 計(jì)算結(jié)果;計(jì)算結(jié)果;累積計(jì)算結(jié)果。臺進(jìn)行的五子棋和實(shí)現(xiàn)本書的項(xiàng)目。在本章中,BorderLayoutGridLayout做兩個(gè)布局器,以及使用到、監(jiān)和適配器等。2.1所示。2.1用Swing制作的計(jì)算器提供各個(gè)計(jì)算器的按鈕。2.1.1數(shù)學(xué)與其它符號介紹對一個(gè)非0的數(shù)學(xué)求倒數(shù),使用到的數(shù)學(xué)符號有:+”、“-”、“*”、“/”。開方與倒數(shù),對應(yīng)使用的符號是“sqrt”和“1/x”。=”。Downloadat·2·2章仿Windows計(jì)算器“%”號,如果使用此符號,第二個(gè)操作數(shù)就等于兩數(shù)相乘再除以100。除了用于數(shù) 算的符號,Windows計(jì)算器還提供對計(jì)算結(jié)果做、、累加、清除等操作,亦有對數(shù)字顯示框中的數(shù)字做退格操作,還可以清除上次計(jì)算結(jié)果或者全部結(jié)果:使用符號“MC”、“MR”、“MS”、“M+”代表清除結(jié)果、結(jié)果、保存結(jié)果和累加結(jié)果。Backspace”符號代表退格。CE·2·2章仿Windows計(jì)算器“%”號,如果使用此符號,第二個(gè)操作數(shù)就等于兩數(shù)相乘再除以100。除了用于數(shù) 算的符號,Windows計(jì)算器還提供對計(jì)算結(jié)果做、、累加、清除等操作,亦有對數(shù)字顯示框中的數(shù)字做退格操作,還可以清除上次計(jì)算結(jié)果或者全部結(jié)果:使用符號“MC”、“MR”、“MS”、“M+”代表清除結(jié)果、結(jié)果、保存結(jié)果和累加結(jié)果。Backspace”符號代表退格。CE”和“C”代表清除上次計(jì)算結(jié)果和清除所有計(jì)算結(jié)果。JavaMathsqrt方法,倒數(shù)=”的時(shí)候,計(jì)算器就需要將最終的計(jì)算結(jié)果顯示到文應(yīng)的結(jié)果,如果需要計(jì)取、、累加或者清除結(jié)果,可以通過改變或者我們所保存的值來實(shí)現(xiàn)。2.1.2界面說明JFrameJFrame對象中,對象)與各個(gè)計(jì)布局處理器來進(jìn)行網(wǎng)格狀布局,由于各個(gè)計(jì)算器按鈕都是以網(wǎng)格狀分布在界面中的,因此使用GridLayout非常適合。本章計(jì)算器的界面布局并不復(fù)雜,因此在這里不再詳細(xì)描述。2.2流程描述用戶打開計(jì)算器后,在沒有關(guān)閉計(jì)算器之前,可以通過鼠標(biāo)點(diǎn)擊“”到“”數(shù)字鍵和點(diǎn)擊““-*/=t1/x”等鍵去直接獲取計(jì)算MMMM、保存、累加計(jì)算顯示框中顯示的數(shù)字,還有清除上次結(jié)果、清除所有結(jié)果、退格等操作。從圖2.2中可以看出,計(jì)算器打開之后,就開始 用戶的鼠標(biāo)動作如果輸入是關(guān)于計(jì)算結(jié)果或“M“M“MS“M“Bacsa、“E“”等操作指令,而且沒有關(guān)閉計(jì)算器,就返回計(jì)算結(jié)果并顯示,如果不是,則不計(jì)算結(jié)果。接下來再繼續(xù)等待用戶的輸入。本章的計(jì)算器并沒有復(fù)雜的流程,只需要簡單的操作,返回計(jì)算結(jié)果等。在實(shí)現(xiàn)計(jì)算器的過程中,我們需要注意的是,例如已經(jīng)點(diǎn)擊了某個(gè)數(shù)字,再點(diǎn)擊運(yùn)算符,那么程序需要之前選點(diǎn)擊的數(shù)字,當(dāng)用戶再次點(diǎn)擊運(yùn)算符(非“)我們需要注意用戶點(diǎn)擊的具體順序。Downloadat2章仿Windows計(jì)算器·3·2章仿Windows計(jì)算器·3·2.2計(jì)算流程2.3建立計(jì)算器對象象中,那么可以再建立這些對象來完成需要實(shí)現(xiàn)的功能或者操作。本章主要設(shè)計(jì)四個(gè)類來完成計(jì)算器的功能,界面類(CalFrame)—主要用來顯示計(jì)算器界面,功能類(CalService)—主要用于完成計(jì)算器中的邏輯功能,計(jì)算工具類(MyMath)—此類是工具類,2.3所示,java.swing.JFrame類,計(jì)算器類使用了界面類,界面類使用了MyMath工具類,下面章節(jié)將對這些計(jì)算器的相關(guān)類作詳細(xì)介紹。Downloadat·4·2章仿Windows計(jì)算器2.3計(jì)算器類圖2.3.1MyMath工具類·4·2章仿Windows計(jì)算器2.3計(jì)算器類圖2.3.1MyMath工具類float,double兩種浮點(diǎn)基本類型來進(jìn)行計(jì)算,容易損失精度,所以,我們使用一個(gè)定義BigDecimal來封裝基本類型,在不損失精度的同時(shí),也可以進(jìn).用,這個(gè)類包含以下方法:staticdoubleadd(doublenum1,doublenum2),加法,使用來計(jì)算結(jié)果的數(shù)字是封裝后的num1和num2double類型。staticdoublesubtractdoublenum1doublenum2,減法,使用來計(jì)算結(jié)果的數(shù)字是封裝后double類型。staticdoublemultiply(doublenum1,doublenum2),乘法,使用來計(jì)算結(jié)果的數(shù)字是封裝后double類型。staticdoubledividedoublenum1doublenum2,除法,使用來計(jì)算結(jié)果的數(shù)字是封裝后的double類型。MyMath類提供了基礎(chǔ)的四則運(yùn)算方法,由于該類中所有的方法都是靜態(tài)的,因此外界可以直接調(diào)MyMathdouble類型的,要進(jìn)行運(yùn)算的話,需要將double類型轉(zhuǎn)換成一個(gè)BigDecimal對象,我們可以使用以下代碼來創(chuàng)建一個(gè)BigDecimal對象:Downloadat2章仿Windows計(jì)算器·5·2.3.2CalService類回,并且,會(用戶的上一步操作。包含以下方法:StringcallMethodStringcmdStringtext,調(diào)用方法并返回計(jì)算結(jié)果。2章仿Windows計(jì)算器·5·2.3.2CalService類回,并且,會(用戶的上一步操作。包含以下方法:StringcallMethodStringcmdStringtext,調(diào)用方法并返回計(jì)算結(jié)果。isPercent代表是否有"%"運(yùn)算,如果有,便加上去。String內(nèi)型的結(jié)果。String內(nèi)型的結(jié)果。StringsetOp(StringcmdStringtext),設(shè)置操作符號。()text是正數(shù)時(shí),返回負(fù)數(shù)的數(shù)字字符串,反之,則返回正數(shù)的數(shù)字字符串。catNumStringcmdStringtext,連接輸入的數(shù)字,每次點(diǎn)擊數(shù)字,就把把新加的數(shù)字追加到后面,并封裝成字符串返回。StringbackSpaceStringtext,刪除最后一個(gè)字符,并返回結(jié)果。StringmCmd(Stringcmd,Stringtext),用來實(shí)現(xiàn)“M+”、“MC”、“MR”、“MS”與存儲有關(guān)的功能。StringclearAll(),清除所有計(jì)算結(jié)果。StringclearStringtext),清除上次計(jì)算結(jié)果。callMethod方法可以看作中一個(gè)中轉(zhuǎn)CEcmd,那么該方法就根據(jù)這個(gè)字符串再調(diào)用需要執(zhí)行“CE”的方法。如果需要做更好的程序解耦,我們可以將這些做callMethod傳入不同的實(shí)現(xiàn)類,直接調(diào)用接口方法。2.3.3CalFrame類類,主要是用于計(jì)算器界面的實(shí)現(xiàn),此類中,排版了計(jì)算器下方法:器,用來voidinitialize(),初始化計(jì)算器界面。直接返回。JTextFieldgetTextField(),這個(gè)方法初始化輸入框。JButton[getMButton(),此方法獲得計(jì)算器的操作鍵。getRButton(),此方法獲得計(jì)算器的結(jié)果操作鍵。getNButton(),此方法獲得計(jì)算器的其它操作鍵。的是bMVCV(視圖Downloadat·6·2章仿Windows計(jì)算器是顯示相應(yīng)的數(shù)據(jù)。在本章中,CalFrame包括了一些器,界面并調(diào)用相關(guān)的業(yè)務(wù)方法,在實(shí)際開發(fā)中,我們可以將這些 MVC模式中的C(器)提取到另外的類中。2.4MyMath工具類實(shí)現(xiàn)是一個(gè)工具類,主要用于處理加、減、乘、除四則運(yùn)算,我們已經(jīng)確定了實(shí)現(xiàn)這四個(gè)方法·6·2章仿Windows計(jì)算器是顯示相應(yīng)的數(shù)據(jù)。在本章中,CalFrame包括了一些器,界面并調(diào)用相關(guān)的業(yè)務(wù)方法,在實(shí)際開發(fā)中,我們可以將這些 MVC模式中的C(器)提取到另外的類中。2.4MyMath工具類實(shí)現(xiàn)是一個(gè)工具類,主要用于處理加、減、乘、除四則運(yùn)算,我們已經(jīng)確定了實(shí)現(xiàn)這四個(gè)方法MyMath方法的時(shí)候,所有方法的參數(shù)都是doubleBigDecimal類型。類型轉(zhuǎn)換成一個(gè)BigDecimal。代碼 :code\cal\src\org\crazyit\cal\MyMath.javadouble的參數(shù)對象,然后再進(jìn)行具體的運(yùn)算。2.4.1實(shí)現(xiàn)四則運(yùn)算現(xiàn)了,因此可以直接調(diào)用該類的相應(yīng)方法即可實(shí)現(xiàn),以下代碼分別實(shí)現(xiàn)四則運(yùn)算。代碼 加法:減法:乘法:除法:Downloadatpublicstaticdoubledivide(doublenum1,doublenum2){publicstaticdoublemultiply(doublenum1,doublenum2){BigDecimalfirst=getBigDecimal(num1);BigDecimalsecond=getBigDecimal(num2);}publicstaticdoublesubtract(doublenum1,doublenum2){BigDecimalfirst=getBigDecimal(num1);BigDecimalsecond=getBigDecimal(num2);returnfirst.subtract(second).doubleValue();}publicstaticdoubleadd(doublenum1,doublenum2){轉(zhuǎn)換成BigDecimalBigDecimalfirst=getBigDecimal(num1);BigDecimalsecond=getBigDecimal(num2);returnfirst.add(second).doubleValue();}/**為一個(gè)doubleBigDecimal對象@paramnumber@return*/privatestaticBigDecimalgetBigDecimal(doublenumber){returnnewBigDecimal(number);}2章仿Windows計(jì)算器·7·JavaBigDecimal類為我們提供了許多強(qiáng)大的Java2章仿Windows計(jì)算器·7·JavaBigDecimal類為我們提供了許多強(qiáng)大的JavaAPI來學(xué)習(xí)該類的詳細(xì)使用。2.5計(jì)算器主界面vagvax.sing.JFram(窗口,aa.s.JBttn(按鈕,asd(輸入框,并使用ja.awt.BorderLaout和2.4:2.4布局2.5.1初始化界面(initialize()方法)JFram(vax.sing.JFram計(jì)算器窗口的大概流程:標(biāo)題、布局管理器、是否可以改變等屬性。增加輸入與計(jì)算結(jié)果顯示框。對應(yīng)圖2.4中的左上角那部分。增加左邊操作鍵。增加結(jié)果操作鍵。增加數(shù)字與其它運(yùn)算符。BorderLayout做總體布局,如圖2.5所示。DownloadatBigDecimalfirst=getBigDecimal(num1);BigDecimalsecond=getBigDecimal(num2);returnfirst.divide(second,DEFAULTSCALE,BigDecimal.ROUNDHALFUP).doubleValue();}·8·2章仿Windows計(jì)算器2.5布局管理器JFrame標(biāo)題和設(shè)置是否可以改變大小的屬性?!?·2章仿Windows計(jì)算器2.5布局管理器JFrame標(biāo)題和設(shè)置是否可以改變大小的屬性。方法獲取,并把它加入panelNORTH位置中:操作鍵,本類需要通過getMButton()方法獲取一個(gè)保存JButton對象的數(shù)組,2.5.2中實(shí)現(xiàn)。獲取數(shù)組后,遍歷數(shù)組,并把數(shù)組中的元素加到一個(gè)新建的增加左邊getMButton方法JPanelJFrame的相應(yīng)位置:JPanel中,最后JFrame相應(yīng)的位置,具體實(shí)現(xiàn)的代碼如下:Downloadat//增加結(jié)果操作鍵//增加左邊 操作鍵JButton[]mButton=getMButton();JPanelpanel1newJPanel();//設(shè)置布局管理器panel1.setLayout(newGridLayout(5,1,0,5));//迭代增加按鈕for(JButtonb:mButton)panel1.add(b);//增加計(jì)算輸入框JPanelpanel=newJPanel();panel.setLayout(newBorderLayout(10,1));panel.add(getTextField(),BorderLayout.NORTH);panel.setPreferredSize(newDimension(PRE_WIDTH,PRE_HEIGHT));//設(shè)置窗口的標(biāo)題計(jì)算器");設(shè)置為不可改變大小this.setResizable(false);2章仿Windows計(jì)算器·9·JPanel對象中,這些操作鍵主要包括數(shù)字鍵和其他的一些運(yùn)算2章仿Windows計(jì)算器·9·JPanel對象中,這些操作鍵主要包括數(shù)字鍵和其他的一些運(yùn)算JPanel并設(shè)置相應(yīng)布局的代碼如下:getNButtonJButton數(shù)組,JButtonJButton數(shù)組的方法并沒有實(shí)現(xiàn),下面將介紹如何實(shí)現(xiàn)這三個(gè)方法。中。2.5.2創(chuàng)建運(yùn)算鍵0getNButton方法即可。以下是該方法的實(shí)現(xiàn)。代碼 :code\cal\src\org\crazyit\cal\CalFrame.javaDownloadatprivateJButton[]getNButton(){//這個(gè)數(shù)組保存需要設(shè)置為紅色的操作符String[]redButton={"/","*","-","+","="};JButton[]result=newJButton[nOp.length];for(inti0;ithis.nOp.length;i++){//新建按鈕JButtonb=newJButton(this.nOp[i]);//為按鈕增加b.addActionListener(getActionListener());//binarySearch方法Arrays.sort(redButton);//出現(xiàn)if(Arrays.binarySearch(redButton,nOp[i])>=0){b.setForeground(Color.red);}else{b.setForeground(Color.blue);//增加數(shù)字與其它運(yùn)算符JButton[]nButton=getNButton();JPanelpanel22newJPanel();//設(shè)置布局管理器panel22.setLayout(newGridLayout(4,5,3,5));//迭代增加按鈕for(JButtonb:nButton)panel22.add(b);frame…JButton[]rButton=getRButton();JPanelpanel2=newJPanel();panel2.setLayout(newBorderLayout(1,5));panel,用于放置按鈕JPanelpanel21=newJPanel();//設(shè)置布局管理器panel21.setLayout(newGridLayout(1,3,3,3));//迭代增加按鈕for(JButtonb:rButton)panel21.add(b);·10·2章仿Windows計(jì)算器,如果按鍵數(shù)組里面存在紅色按鍵數(shù)組的某個(gè)元素,就需要調(diào)用JButton的數(shù)組時(shí),就需要作setForeground方法來設(shè)置該按鈕的字體顏色。在代碼中我們不能看到該方法幫我們創(chuàng)建了哪些按鍵,nOp·10·2章仿Windows計(jì)算器,如果按鍵數(shù)組里面存在紅色按鍵數(shù)組的某個(gè)元素,就需要調(diào)用JButton的數(shù)組時(shí),就需要作setForeground方法來設(shè)置該按鈕的字體顏色。在代碼中我們不能看到該方法幫我們創(chuàng)建了哪些按鍵,nOp的字符串?dāng)?shù)組來保存需要?jiǎng)?chuàng)建的按鍵,該數(shù)組包含的內(nèi)容如下:2.5.3創(chuàng)建操作按鍵getRButton方法,以下是這兩個(gè)方法的具體實(shí)現(xiàn)。代碼 :code\cal\src\org\crazyit\cal\CalFrame.javagetMButton創(chuàng)建的是界面左側(cè)的操作鍵,getRButton創(chuàng)建的是創(chuàng)建的操作鍵如下:鍵上面的操作鍵,getMButtonDownloadat//getMButtonprivateString[]mOp={"MC","MR","MS","M+"};//getRButtonprivateJButton[]getMButton(){JButton[]result=newJButton[mOp.length+1];result[0]=getButton();for(inti=0;i<this.mOp.length;i++){//新建按鈕JButtonb=newJButton(this.mOp[i]);//為按鈕增加b.addActionListener(getActionListener());//設(shè)置按鈕顏色result[i1]=b;}returnresult;}privateJButton[]getRButton(){JButton[]result=newJButton[rOp.length];for(inti=0;i<this.rOp.length;i++){//新建按鈕JButtonb=newJButton(this.rOp[i]);//為按鈕增加b.addActionListener(getActionListener());//設(shè)置按鈕顏色result[i]=b;}returnresult;}privateString[]nOp={"7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="};}result[i]=b;}returnresult;}2章仿Windows計(jì)算器·11·創(chuàng)建完界面元素后,我們可以運(yùn)行計(jì)算器,具體的效果如圖2.4所示。2.5.4增加器JButton類型的組件增加了器,這個(gè)接口來創(chuàng)建一個(gè)e)方法,當(dāng)器到用戶的操作時(shí),會自動調(diào)用此方法,并在此方法中處理業(yè)務(wù)邏輯,再把數(shù)據(jù)返回顯示給用戶。見以下代碼。代碼:2章仿Windows計(jì)算器·11·創(chuàng)建完界面元素后,我們可以運(yùn)行計(jì)算器,具體的效果如圖2.4所示。2.5.4增加器JButton類型的組件增加了器,這個(gè)接口來創(chuàng)建一個(gè)e)方法,當(dāng)器到用戶的操作時(shí),會自動調(diào)用此方法,并在此方法中處理業(yè)務(wù)邏輯,再把數(shù)據(jù)返回顯示給用戶。見以下代碼。代碼:code\cal\src\org\crazyit\cal\CalFrame.java從上面代碼中可以看到,這里是通過實(shí)現(xiàn)java.awt.event.ActionListener接口中的()類型的內(nèi)部類,并在actionPerformed方法中處理業(yè)務(wù)邏輯。callMethod方法去處理計(jì)算,并把結(jié)果返回。再設(shè)置標(biāo)志結(jié)果類型的 標(biāo)記,如果是點(diǎn)擊“MC”按鈕,就把標(biāo)記設(shè)置為空,如果是點(diǎn)擊“MSMM計(jì)算器的這幾個(gè)按鈕,再看這里就很容易理解了。最后把計(jì)算結(jié)果設(shè)置到結(jié)果文本顯示框中,顯示給使用者。Downloadatif(result!=null){textField.setText(result);}if(cmd.indexOf("MC")==0){button.setText("");}elseif(cmd.indexOf("M")==0&&service.getStore()>0){button.setText("M");}result=service.callMethod(cmd,textField.getText());actionListener=newActionListener(){publicvoidactionPerformed(ActionEvente){Stringcmd=e.getActionCommand();Stringresult=null;try{//計(jì)算操作結(jié)果result=service.callMethod(cmd,textField.getText());}catch(Exceptione1){System.out.println(e1.getMessage());}的標(biāo)記if(cmd.indexOf("MC")==0){button.setText("");}elseif(cmd.indexOf("M")==0&&service.getStore()>0){button.setText("M");}//設(shè)置計(jì)算結(jié)果if(resultnulltextField.setText(result);}}};privateString[]rOp={"Back","CE","C"};·12·2章仿Windows計(jì)算器在點(diǎn)擊都會執(zhí)行該方法,callMethod我們并沒有提供任何實(shí)現(xiàn),在下一小節(jié),實(shí)現(xiàn)該方法。2.6計(jì)算業(yè)務(wù)處理應(yīng)用中的大部分業(yè)務(wù),其中包括數(shù)字運(yùn)算,運(yùn)算,操作結(jié)果等業(yè)務(wù)。有四個(gè)重要的屬性:·12·2章仿Windows計(jì)算器在點(diǎn)擊都會執(zhí)行該方法,callMethod我們并沒有提供任何實(shí)現(xiàn),在下一小節(jié),實(shí)現(xiàn)該方法。2.6計(jì)算業(yè)務(wù)處理應(yīng)用中的大部分業(yè)務(wù),其中包括數(shù)字運(yùn)算,運(yùn)算,操作結(jié)果等業(yè)務(wù)。有四個(gè)重要的屬性:firstNum代表第一個(gè)操作數(shù),secondNum代表第二個(gè)操作數(shù),lastOp代表上次用戶所做的操作,isSecondNum代表是否第二個(gè)操作數(shù)。2.6.1計(jì)算四則運(yùn)算結(jié)果擊加、減、乘、除計(jì)算符號,再輸入第二個(gè)操作數(shù),最后點(diǎn)“=”號計(jì)算出結(jié)果,所以這時(shí)用firstNum去保存用戶輸入的第一個(gè)操作數(shù),secondNum去保存第二個(gè)操作數(shù),lastOp去保存計(jì)算符號或者其它操作,isSecondNum用來用戶是在輸入第幾個(gè)操作數(shù)。(26.返回,見以下代碼。代碼:code\cal\src\org\crazyit\cal\CalService.java當(dāng)用戶點(diǎn)擊“/(四則運(yùn)算)lastOp戶正要進(jìn)行計(jì)算的類型,見以下代碼。用代碼:code\cal\src\org\crazyit\cal\CalService.javaDownloadatpublicStringsetOp(Stringcmd,Stringtext){this.lastOp=cmd;//設(shè)置第一個(gè)操作數(shù)的值this.firstNum=text;publicStringcatNum(Stringcmd,Stringtext){Stringresult=cmd;text0if(!text.equals("0")){if(isSecondNum){//isSecondNum標(biāo)志為falseisSecondNumfalse;}else{//剛返回結(jié)果為目前的text加上新點(diǎn)擊的數(shù)字result=text+cmd;}}if(result.indexOf(".")==0){result="0"+result;}returnresult;}2章仿Windows計(jì)算器·13·2章仿Windows計(jì)算器·13·isSecondNumtrue,代表下次輸入數(shù)字時(shí),要清空輸入框并重新輸入。isPercent,這是計(jì)算器的“%”號操作,100,請看以下代碼。代碼:code\cal\src\org\crazyit\cal\CalService.javaDownloadatpublicStringcal(Stringtext,booleanisPercent)throwsException{//初始化第二個(gè)操作數(shù)doublesecondResult=secondNum==null?Double.valueOf(text).doubleValue():Double.valueOf(secondNum).doubleValue();0,不處理if(secondResult==0&&this.lastOp.equals("/")){return"0";}100ifisPercent){secondResult=MyMath.multiply(Double.valueOf(firstNum),MyMath.divide(secondResult,100));}ifthis.lastOp.equals("firstNum=String.valueOf(MyMath.add(Double.valueOf(firstNum),secondResult));}elseif(this.lastOp.equals("-")){firstNum=String.valueOf(MyMath.subtract(Double.valueOf(firstNum),secondResult));}elseif(this.lastOp.equals("*")){firstNum=String.valueOf(MyMath.multiply(Double.valueOf(firstNum),secondResult));}elseif(this.lastOp.equals("/")){firstNum=String.valueOf(MyMath.divide(Double.valueOf(firstNum),secondResult));}//給第二個(gè)操作數(shù)重新賦值secondNum=secondNum==null?text:secondNum;//isSecondNum標(biāo)志為truethis.isSecondNum=true;returnfirstNum;}this.secondNumnull;//isSecondNum標(biāo)志為truethis.isSecondNum=true;//返回空值returnnull;}·14·2章仿Windows計(jì)算器上面計(jì)算結(jié)果中,經(jīng)歷了幾個(gè)步驟,首先,確定secondNum的值,如果secondNum為空,0last·14·2章仿Windows計(jì)算器上面計(jì)算結(jié)果中,經(jīng)歷了幾個(gè)步驟,首先,確定secondNum的值,如果secondNum為空,0lastp(*/Mthsubtrct、做結(jié)果返回。2.6.2store來充當(dāng)( MS(保存”操作時(shí),就調(diào)用此方法,再根據(jù)得到的字符串去進(jìn)行清除、累加、存操作,見以下代碼。代碼 :code\cal\src\org\crazyit\cal\CalService.java、保store的屬性用來保存計(jì)算結(jié)果,當(dāng)用戶點(diǎn)擊了“M+storeMstoreMstore的值store設(shè)置為當(dāng)前的結(jié)果。MS2.6.3實(shí)現(xiàn)開方、倒數(shù)等Mathsqrt方法去計(jì)算接收到的數(shù)值,并且返回結(jié)果:MyMathdivide1與接收到的數(shù)值相除的值。代碼:code\cal\src\org\crazyit\cal\CalService.javaDownloadatpublicStringsetReciprocal(Stringtext){//0,則不求倒數(shù)if(text.equals("0")){publicStringsqrt(Stringtext){//將isSecondNum標(biāo)志為truethis.isSecondNumtrue;//計(jì)算結(jié)果并返回returnString.valueOf(Math.sqrt(Double.valueOf(text)));}publicStringmCmd(Stringcmd,Stringtext){if(cmd.equals("M+")){操作,store中store=MyMath.add(store,Double.valueOf(text));}elseif(cmd.equals("MC")){store0;}elseif(cmd.equals("MR")){store的值讀出來isSecondNum=true;returnString.valueOf(store);}elseif(cmd.equals("MS")){storestoreDouble.valueOftext).doubleValue();}returnnull;}2章仿Windows計(jì)算器·15·2.6.4實(shí)現(xiàn)入的數(shù)字進(jìn)行截取,如果接收到的字符串是“0”或者為null,則不作任何操作,直接返回,否則,我2章仿Windows計(jì)算器·15·2.6.4實(shí)現(xiàn)入的數(shù)字進(jìn)行截取,如果接收到的字符串是“0”或者為null,則不作任何操作,直接返回,否則,我,將輸入字符串的最后一位截取。以下方法實(shí)現(xiàn)代碼 :code\cal\src\org\crazyit\cal\CalService.java操作。2.6.5清除計(jì)算結(jié)果中提供了一個(gè)clearAll方法,用于清除所有的計(jì)算結(jié)果。代碼 2.6.6實(shí)現(xiàn)中轉(zhuǎn)方法(callMethod)面的器中,只會調(diào)用關(guān)的實(shí)現(xiàn)。代碼 :code\cal\src\org\crazyit\cal\CalService.javaDownloadatpublicStringcallMethod(Stringcmd,Stringtext)throwsException{if(cmd.equals("C")){clearAll();}elseif(cmd.equals("CE")){returnclear(text);}elseif(cmd.equals("Back")){returnbackSpace(text);}elseif(numString.indexOf(cmd)!=-1){returncatNum(cmd,text);}elseif(opString.indexOf(cmd)!=-1){publicStringclearAll(){//將第一第二操作數(shù)恢復(fù)為默認(rèn)值this.firstNum="0";this.secondNumnull;returnthis.firstNum;}publicStringbackSpace(Stringtext){returntext.equals("0")||text.equals("")?"0":text.substring(0,text.length()-1);}returntext;}else{//將isSecondNum標(biāo)志為truethis.isSecondNumtrue;//計(jì)算結(jié)果并返回returnString.valueOf(MyMath.divide(1,Double.valueOf(text)));}}·16·2章仿Windows計(jì)算器方法,只是輸入命令,再決定調(diào)用具體的哪個(gè)方法處理計(jì)算。例了按鍵,那么callMethod方法就會根據(jù)點(diǎn)擊的按鍵文本來找到如器到用戶點(diǎn)擊了if…else…并不是最佳的解決方案,我們可以使用一些的設(shè)計(jì)?!?6·2章仿Windows計(jì)算器方法,只是輸入命令,再決定調(diào)用具體的哪個(gè)方法處理計(jì)算。例了按鍵,那么callMethod方法就會根據(jù)點(diǎn)擊的按鍵文本來找到如器到用戶點(diǎn)擊了if…else…并不是最佳的解決方案,我們可以使用一些的設(shè)計(jì)模式來解決。有的讀者可以了解相關(guān)的設(shè)計(jì)模式,考慮如何解決這些問題。2.7本章小結(jié)JavaswingJFrame,GridLayourt布局管理器去布局。并且向讀者介紹了ActionLisner用戶的動作響應(yīng)的讀者可以在本文的基礎(chǔ)上實(shí)現(xiàn)更強(qiáng)大的計(jì)算器(科學(xué)型計(jì)算器。另外需要注意的是,本章程序編寫的過程中,使用了許多if…else…語句,對設(shè)計(jì)模式有一定了解或者希望對此有了解的讀者,可以嘗試去重構(gòu)本章的代碼,消。在下面的章節(jié)中,我們會在編寫的過程中,展示一些設(shè)計(jì)模式的概念。DownloadatreturnsetOp(cmd,text);}elseif(cmd.equals("=")){returncal(text,false);}elseif(cmd.equals("+/-")){setNegative(text);}elseif(cmd.equals("1/x")){setReciprocal(text);}elseif(cmd.equals("sqrt")){returnsqrt(text);}elseif(cmd.equals("%")){returncal(text,true);}else{returnmCmd(cmd,text);}}3章圖片瀏覽器33.13章圖片瀏覽器33.1圖片瀏覽器概述Windows的圖片瀏覽器,或者是功能更強(qiáng)大e(這個(gè)還支持編輯圖片作,在這里,實(shí)現(xiàn)了圖片的瀏覽功能,導(dǎo)航功能(下一張、上一張3.1所示。3.1圖片瀏覽器Downloadat·2·3章圖片瀏覽器3.2創(chuàng)建圖片瀏覽器的相關(guān)對象ViewerAction來響應(yīng)這些動作。在Action·2·3章圖片瀏覽器3.2創(chuàng)建圖片瀏覽器的相關(guān)對象ViewerAction來響應(yīng)這些動作。在Action中響應(yīng)動作,就到處理具體邏輯的步驟,我們把所有的邏輯處理放到程序更好的解耦合,我們可以把具體的某些業(yè)務(wù)處理放置到的類中進(jìn)行處理。3.2所示。的3.2圖片瀏覽器類圖本章程序的功能較為簡單,因此所涉及的對象也并不復(fù)雜,只有簡單的五個(gè)對象。Downloadat3章圖片瀏覽器·3·3.2.1文件過濾器如果要使文件FileFilter類來進(jìn)行文件操作,文件過濾器是的一個(gè)繼承,也是文件法:booleanaccept(Filef),acceptgetDescription方文件是否屬于圖片類型。StringgetDescription(),獲取過濾器的描述。3章圖片瀏覽器·3·3.2.1文件過濾器如果要使文件FileFilter類來進(jìn)行文件操作,文件過濾器是的一個(gè)繼承,也是文件法:booleanaccept(Filef),acceptgetDescription方文件是否屬于圖片類型。StringgetDescription(),獲取過濾器的描述。們所定義的圖片文件,那么其他的文件將被顯示。在本章中,文件過濾器是文件框類(ie)的一個(gè)內(nèi)部類(。3.2.2文件框Java文件JFileChooser類并提供一個(gè)的構(gòu)造器即可。這里的文件 類的子類,目的是為了加入在3.2.1中定義的文件過濾器:voidaddFilter(),為這個(gè)文件框增加過濾器。方法主要用于向文件.bmp的文方法中使用以下代碼實(shí)現(xiàn):在文件 ,那么用戶將不能看到.bmp的文件,并且在“文件類型”的下拉中也只能選擇.bmp,效果如圖ViewerFileChooser類。3.3所示。在本章中,文件框?qū)?yīng)的是3.3文件過濾器的作用Downloadatthis.addChoosableFileFilter(newMyFileFilter(newString[]{".BMP"},"BMP(*.BMP)"));·4·3章圖片瀏覽器3.2.3主界面類欄與菜單欄加上器,如下:voidinit(),初始化圖片瀏覽器的界面。JLabel。createToolPanel(),創(chuàng)建放大、縮小、上一張、下一張等工具按鈕。voidcreateBar(),創(chuàng)建文件、工具、幫助等菜單。JScrollPane。ViewerFrame類。3.2.4業(yè)務(wù)處理類ViewerService小圖片、瀏覽上一張圖片、瀏覽下一張圖片等功能,如下:·4·3章圖片瀏覽器3.2.3主界面類欄與菜單欄加上器,如下:voidinit(),初始化圖片瀏覽器的界面。JLabel。createToolPanel(),創(chuàng)建放大、縮小、上一張、下一張等工具按鈕。voidcreateBar(),創(chuàng)建文件、工具、幫助等菜單。JScrollPane。ViewerFrame類。3.2.4業(yè)務(wù)處理類ViewerService小圖片、瀏覽上一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年新型客車材料應(yīng)用行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 企業(yè)訂制茶葉合同范例
- 2025-2030年教育科普3D打印體驗(yàn)館行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 2025-2030年地震災(zāi)害風(fēng)險(xiǎn)評估模型行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 影視錄放設(shè)備的智能場景轉(zhuǎn)換優(yōu)化技術(shù)發(fā)展考核試卷
- 余額支付合同范本
- 與企業(yè)簽合同范例
- 建材批發(fā)商客戶關(guān)系管理優(yōu)化考核試卷
- 保安返聘合同范本
- 健身器材用戶參與度提升策略實(shí)踐分析考核試卷
- 車輛車身結(jié)構(gòu)設(shè)計(jì)的創(chuàng)新思路
- 寒假開學(xué)收心主題班會課件
- 完全版的公司治理規(guī)章制度
- 心衰合并胸腔積液的護(hù)理Ppt
- 精神科護(hù)理技能出走行為的防范與護(hù)理
- 中醫(yī)護(hù)理查房制度
- 臨床研究方法的進(jìn)展與挑戰(zhàn)
- 數(shù)據(jù)采集自動化流程
- 家庭園藝資材蘊(yùn)藏商機(jī)
- 幼兒園食品營養(yǎng)搭配與食品安全培訓(xùn)
- 當(dāng)幸福來敲門電影介紹PPT模板
評論
0/150
提交評論