軟件測(cè)試課程設(shè)計(jì)(五子棋)_第1頁(yè)
軟件測(cè)試課程設(shè)計(jì)(五子棋)_第2頁(yè)
軟件測(cè)試課程設(shè)計(jì)(五子棋)_第3頁(yè)
軟件測(cè)試課程設(shè)計(jì)(五子棋)_第4頁(yè)
軟件測(cè)試課程設(shè)計(jì)(五子棋)_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

可編輯版/ 軟件測(cè)試小論文題目:五子棋的開發(fā)與測(cè)試班級(jí):12計(jì)算機(jī)科學(xué)與技術(shù)特色本〔2班小組成員:劉文志〔18、劉學(xué)〔19、朱和中〔51完成日期:201指導(dǎo)教師:錢麗摘要五子棋游戲不僅能增強(qiáng)思維能力,提高記憶力,而且富含哲理,有助于修身養(yǎng)性。既有"場(chǎng)"的概念,亦有"點(diǎn)"的連接,是古今哲理的結(jié)晶。因此,開發(fā)出一款簡(jiǎn)單實(shí)用的單機(jī)版五子棋軟件很有意義。本論文分析了五子棋游戲的游戲規(guī)則,設(shè)計(jì)了游戲算法,并選擇eclipse作為該軟件的開發(fā)平臺(tái),實(shí)現(xiàn)了五子棋的多種對(duì)戰(zhàn)模式,既可人與人對(duì)戰(zhàn),也可人與電腦對(duì)戰(zhàn)。還實(shí)現(xiàn)了,自定義棋盤行列數(shù)。本文將從開發(fā)環(huán)境的安裝,到五子棋的功能分析與設(shè)計(jì),到各功能模塊的實(shí)現(xiàn),逐步向您展現(xiàn)五子棋的實(shí)現(xiàn)過程。經(jīng)測(cè)試,本游戲系統(tǒng)功能齊全,能平穩(wěn)運(yùn)行,具有較強(qiáng)的使用價(jià)值。關(guān)鍵詞:五子棋;思考算法;多人對(duì)戰(zhàn);人機(jī)對(duì)戰(zhàn);目錄TOC\o"1-3"\h\u311701.引言1103391.1編寫目的1319531.2背景1105042.單機(jī)版五子棋系統(tǒng)介紹221932.1平臺(tái)簡(jiǎn)介2233872.2游戲概述2299533.基于Java的五子棋游戲的設(shè)計(jì)3326243.1游戲模塊3291003.1.1開局、退出、棋盤3243983.1.2模式欄478363.2游戲流程圖421784.軟件測(cè)試5210084.1測(cè)試的目的591094.2測(cè)試的方法563144.3白盒測(cè)試6245654.3.1測(cè)試用例7113024.4黑盒測(cè)試10246484.5測(cè)試游戲存在的問題12155984.6游戲不足的解決方案12128764.6.1游戲改進(jìn)后的代碼1233164.7回歸測(cè)試13303755.總結(jié)153773參考文獻(xiàn) 1616474附錄171.引言1.1編寫目的根據(jù)測(cè)試計(jì)劃報(bào)告,對(duì)軟件進(jìn)行測(cè)試,詳細(xì)記錄測(cè)試過程,以對(duì)軟件的質(zhì)量進(jìn)行評(píng)價(jià),為軟件設(shè)計(jì)人員提供BUG依據(jù),故做產(chǎn)生測(cè)試分析報(bào)告。1.2背景為了使游戲更加完善,使玩家有更好的游戲體驗(yàn),針對(duì)游戲出現(xiàn)的一些問題,做出修復(fù),使游戲更加生動(dòng),符合玩家的游戲習(xí)慣。2.單機(jī)版五子棋系統(tǒng)介紹2.1平臺(tái)簡(jiǎn)介Eclipse是一個(gè)開放源代碼的、基于Java的可擴(kuò)展開發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。幸運(yùn)的是,Eclipse附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括Java開發(fā)工具〔JavaDevelopmentKit,JDK。2.2游戲概述該游戲軟件采用Java語(yǔ)言設(shè)計(jì),在Windows系統(tǒng)為玩家提供五子棋游戲人機(jī)對(duì)戰(zhàn)的基本功能。玩家可以通過鼠標(biāo)在棋盤的相應(yīng)位置下子,一方為白色,另一方為黑色,先下的為黑子〔主場(chǎng)。游戲過程中,只要有一人先連成五個(gè)棋子,不論橫、豎或斜,就會(huì)在屏幕上顯示是誰(shuí)贏了比賽,也可以是平局收?qǐng)?從而可以進(jìn)行下一場(chǎng)比賽。在比賽過程中,如果一方需要悔棋,先得通過對(duì)手的同意才可以。3.基于Java的五子棋游戲的設(shè)計(jì)本項(xiàng)目中五子棋主要包含兩大主要模塊,如下圖3.1〔a所示。第一個(gè)模塊為主要模塊,用于實(shí)現(xiàn)五子棋的游戲功能。第二個(gè)模塊為輔助模塊,用于實(shí)現(xiàn)五子棋的相關(guān)輔助設(shè)置。游戲主界面如圖3.1〔b。五子棋游戲五子棋游戲視圖幫助塊游戲模塊圖3.1〔a主要模塊圖3.1〔b游戲主界面3.1游戲模塊該模塊實(shí)現(xiàn)游戲的主要功能,共包含兩個(gè)小模塊,如下圖3.2〔a所示。第一個(gè)模塊為棋盤欄,實(shí)現(xiàn)游戲玩家點(diǎn)擊下棋的功能。第二個(gè)小模塊為模式欄,對(duì)下棋的方式進(jìn)行選擇。游戲菜單如圖3.2〔b所示。游戲模塊游戲模塊模式欄開局、退出、棋盤欄圖3.2〔a游戲模塊圖3.2〔b游戲菜單開局、退出、棋盤實(shí)現(xiàn)可視化的開局與退出功能,以及棋盤選擇對(duì)戰(zhàn)模式。圖3.3開局、退出、棋盤3.1.2模式欄模式欄,主要實(shí)現(xiàn)游戲過程中的各種控制功能,包括人人、人機(jī)實(shí)例化對(duì)戰(zhàn)模式。圖3.4模式選擇是電腦下子電腦是否下子是電腦下子電腦是否下子是電腦下子電腦是否下子是電腦下子電腦是否下子否游戲結(jié)束是白子或黑子是否有5個(gè)連成一線否游戲者是否下子否游戲者下子模式選擇開局4.軟件測(cè)試4.1測(cè)試的目的軟件測(cè)試是為了發(fā)現(xiàn)錯(cuò)誤而執(zhí)行程序的過程?;蛘哒f,軟件測(cè)試是根據(jù)軟件開發(fā)各階段的規(guī)格說明和程序的內(nèi)部結(jié)構(gòu)而精心設(shè)計(jì)一批測(cè)試用例{即輸入數(shù)據(jù)及其預(yù)期的輸出結(jié)果},并利用這些測(cè)試用例去運(yùn)行程序,以發(fā)現(xiàn)程序錯(cuò)誤的過程。設(shè)計(jì)測(cè)試的目標(biāo)是想以最少的時(shí)間和人力,系統(tǒng)地找出軟件中潛在的各種錯(cuò)誤和缺陷。如果成功地實(shí)施了測(cè)試,就能夠發(fā)現(xiàn)軟件中的錯(cuò)誤。測(cè)試的附帶收獲是,它能夠證明軟件的功能和性能與需求說明相符合。此外,實(shí)施測(cè)試收集到的測(cè)試結(jié)果數(shù)據(jù)為可靠性分析提供了依據(jù)。而測(cè)試的目的就是在軟件投入生產(chǎn)性運(yùn)行之前,盡可能地發(fā)現(xiàn)軟件中的錯(cuò)誤。4.2測(cè)試的方法常見的軟件測(cè)試階段的工作主要分為單元測(cè)試、集成測(cè)試、確認(rèn)測(cè)試和系統(tǒng)測(cè)試四個(gè)步驟,測(cè)試方法有黑盒測(cè)試和白盒測(cè)試兩種方法:黑盒測(cè)試〔已經(jīng)知道產(chǎn)品應(yīng)該具有的功能,可以通過測(cè)試來檢驗(yàn)是否每個(gè)功能都正常;白盒測(cè)試〔如果知道產(chǎn)品內(nèi)部工作過程,可以通過測(cè)試來檢驗(yàn)內(nèi)部動(dòng)作是否按照說明書的規(guī)定正常進(jìn)行。本游戲測(cè)試的主要方法包括黑盒測(cè)試和白盒測(cè)試,由小組人員通過自己親自去玩,然后觀察游戲在運(yùn)行過程中,所需要實(shí)現(xiàn)的功能有沒有實(shí)現(xiàn),以及在測(cè)試過程中有沒有發(fā)現(xiàn)新的問題記錄在案。然后根據(jù)測(cè)試后所產(chǎn)生的一系列的問題,有本組負(fù)責(zé)編碼人員對(duì)游戲進(jìn)行改進(jìn),然后在進(jìn)行測(cè)試,就這樣重復(fù)的進(jìn)行這樣的工作,直到游戲的運(yùn)行與預(yù)想時(shí)的狀況基本一致時(shí),才算通過測(cè)試。圖4.1完整游戲圖4.3白盒測(cè)試通過程序的源代碼進(jìn)行測(cè)試而不使用用戶界面。這種類型的測(cè)試需要從代碼句法發(fā)現(xiàn)內(nèi)部代碼在算法,溢出,路徑,條件等等中的缺點(diǎn)或者錯(cuò)誤,進(jìn)而加以修正,這一方法是把測(cè)試對(duì)象看作一個(gè)打開的盒子,測(cè)試人員依據(jù)程序內(nèi)部邏輯結(jié)構(gòu)相關(guān)信息,設(shè)計(jì)或選擇測(cè)試用例,對(duì)程序所有邏輯路徑進(jìn)行測(cè)試,通過在不同點(diǎn)檢查程序的狀態(tài),確定實(shí)際的狀態(tài)是否與預(yù)期的狀態(tài)一致。用軟件白盒測(cè)試產(chǎn)生的測(cè)試用例能夠:1.保證一個(gè)模塊中的所有獨(dú)立路徑至少被使用一次;2.對(duì)所有邏輯值均需測(cè)試true和false;3.在上下邊界及可操作范圍內(nèi)運(yùn)行所有循環(huán);4.檢查內(nèi)部數(shù)據(jù)結(jié)構(gòu)以確保其有效性。4.3.1測(cè)試用例〔1用例1:因?yàn)轭怌hessFrame主要功能是創(chuàng)建五子棋游戲主窗體,所以對(duì)其進(jìn)行測(cè)試,看其構(gòu)造五子棋游戲的主窗體的方法是否正確。classChessFrameextendsJFrameimplementsActionListener{privateString[]strsize={"20x15","30x20","40x30"};privateString[]strmode={"人機(jī)對(duì)弈","人人對(duì)弈"};publicstaticbooleaniscomputer=true,checkcomputer=true;privateintwidth,height;privateChessModelcm;privateMainPanelmp;publicChessFrame<>{ this.setTitle<"五子棋游戲">;cm=newChessModel<1>;mp=newMainPanel<cm>;Containercon=this.getContentPane<>;con.add<mp,"Center">;this.setResizable<false>;this.addWindowListener<newChessWindowEvent<>>;MapSize<20,15>;JMenuBarmbar=newJMenuBar<>;this.setJMenuBar<mbar>; JMenugameMenu=newJMenu<"游戲">;mbar.add<makeMenu<gameMenu,newObject[]{ "開局","棋盤","模式",null,"退出"},this>>; JMenulookMenu=newJMenu<"視圖">;mbar.add<makeMenu<lookMenu,newObject[]{"Metal","Motif","Windows"},this>>; JMenuhelpMenu=newJMenu<"幫助">;mbar.add<makeMenu<helpMenu,newObject[]{ "關(guān)于"},this>>;}〔2用例2:用play<intx,inty>方法實(shí)現(xiàn)電腦下子,并先通過方法readyplay<intx,inty>判斷某坐標(biāo)位置是否可下棋子。publicvoidreadyplay<intx,inty>{if<badxy<x,y>>return;if<chessExist<x,y>>return;this.arrMapShow[x][y]=3;}publicvoidplay<intx,inty>{if<badxy<x,y>>return;if<chessExist<x,y>>{this.isExist=true;return;}elsethis.isExist=false;if<getisOdd<>>{setisOdd<false>;this.arrMapShow[x][y]=1;}else{setisOdd<true>;this.arrMapShow[x][y]=2;}}〔3用例3: 計(jì)算機(jī)走棋方法〔computerDo測(cè)試通過方法computerDo實(shí)現(xiàn)電腦下子的思想publicvoidcomputerDo<intwidth,intheight>{intmax_black,max_white,max_temp,max=0;setisOdd<true>;System.out.println<"計(jì)算機(jī)走棋...">;for<inti=0;i<=width;i++>{for<intj=0;j<=height;j++>{ if<!chessExist<i,j>>{ max_white=checkMax<i,j,2>; max_black=checkMax<i,j,1>;max_temp=Math.max<max_white,max_black>;if<max_temp>max>{max=max_temp;this.x=i;this.y=j;}}}}〔4用例4:根據(jù)提供的棋子信息〔顏色、坐標(biāo)畫棋子方法〔draw的測(cè)試publicvoiddraw<Graphicsg,inti,intj,intv>{intx=20*i+20;inty=20*j+20;//畫棋盤if<i!=width&&j!=height>{g.setColor<Color.white>;g.drawRect<x,y,20,20>;}//畫黑色棋子if<v==1>{g.setColor<Color.gray>;g.drawOval<x-8,y-8,16,16>;g.setColor<Color.black>;g.fillOval<x-8,y-8,16,16>;}//畫白色棋子if<v==2>{g.setColor<Color.gray>;g.drawOval<x-8,y-8,16,16>;g.setColor<Color.white>;g.fillOval<x-8,y-8,16,16>;}if<v==3>{g.setColor<Color.cyan>;g.drawOval<x-8,y-8,16,16>;}}〔5用例5:響應(yīng)鼠標(biāo)的點(diǎn)擊事件,構(gòu)造方法〔mousePressed實(shí)現(xiàn)鼠標(biāo)的點(diǎn)擊來實(shí)現(xiàn)下棋的動(dòng)作。publicvoidmousePressed<MouseEventevt>{intx=<evt.getX<>-10>/20;inty=<evt.getY<>-10>/20;System.out.println<x+""+y>;if<evt.getModifiers<>==MouseEvent.BUTTON1_MASK>{cm.play<x,y>;System.out.println<cm.getisOdd<>+""+cm.getarrMapShow<>[x][y]>;repaint<>;if<cm.judgeSuccess<x,y,cm.getisOdd<>>>{cm.showSuccess<this>;evt.consume<>;ChessFrame.iscomputer=false;}〔6用例6:構(gòu)造方法judgeSuccess<intx,inty,booleanisodd>對(duì)當(dāng)前棋子各個(gè)位置的判斷來得出是否勝負(fù)。publicbooleanjudgeSuccess<intx,inty,booleanisodd>{intnum=1;intarrvalue;intx_temp=x,y_temp=y;if<isodd>arrvalue=2;elsearrvalue=1;intx_temp1=x_temp,y_temp1=y_temp;4.4黑盒測(cè)試軟件黑盒測(cè)試也是軟件測(cè)試的主要方法之一,也可以稱為功能測(cè)試、數(shù)據(jù)驅(qū)動(dòng)測(cè)試或基于規(guī)格說明的測(cè)試。測(cè)試者不了解程序的內(nèi)部情況,只知道程序的輸入、輸出和系統(tǒng)的功能,這是從用戶的角度針對(duì)軟件界面、功能及外部結(jié)構(gòu)進(jìn)行測(cè)試,而不考慮程序內(nèi)部邏輯結(jié)構(gòu)。軟件黑盒測(cè)試法注重于測(cè)試軟件的功能需求,主要試圖發(fā)現(xiàn)下列幾類錯(cuò)誤:1功能不正確或遺漏;2界面錯(cuò)誤;3數(shù)據(jù)庫(kù)訪問錯(cuò)誤;4性能錯(cuò)誤;5初始化和終止錯(cuò)誤等。測(cè)試方法可以分為以下幾種:等價(jià)類劃分法、邊界值分析法、錯(cuò)誤推測(cè)法、因果圖法、判定表驅(qū)動(dòng)法、正交試驗(yàn)設(shè)計(jì)法、功能圖法等。從理論上講,軟件黑盒測(cè)試只有采用窮舉輸入測(cè)試,把所有可能的輸入都作為測(cè)試情況考慮,才能查出程序中所有的錯(cuò)誤。實(shí)際上測(cè)試情況有無窮多個(gè),人們不僅要測(cè)試所有合法的輸入,而且還要對(duì)那些不合法但可能的輸入進(jìn)行測(cè)試。這樣看來,完全測(cè)試是不可能的,所以我們要進(jìn)行有針對(duì)性的測(cè)試,通過制定測(cè)試案例指導(dǎo)測(cè)試的實(shí)施,保證軟件測(cè)試有組織、按步驟,以及有計(jì)劃地進(jìn)行。軟件黑盒測(cè)試行為必須能夠加以量化,才能真正保證軟件質(zhì)量,而測(cè)試用例就是將測(cè)試行為具體量化的方法之一。五子棋游戲測(cè)試用例如下表所示:用例操作預(yù)期結(jié)果實(shí)際結(jié)果用例1能否在不同版本的eclipese中運(yùn)行該游戲游戲能夠在設(shè)計(jì)該游戲版本及以上中正常運(yùn)行Pass用例2運(yùn)行時(shí)能否正常顯示主界面運(yùn)行時(shí)能正常顯示主界面Pass用例3鼠標(biāo)單擊菜單—開始,是否可以運(yùn)行游戲可以運(yùn)行游戲Pass用例4鼠標(biāo)單擊棋盤,是否會(huì)有棋子落于該位置棋子落于鼠標(biāo)單擊位置Pass用例5當(dāng)人下子出現(xiàn)"活三"、"沖四",電腦是否會(huì)下子堵截電腦會(huì)下子阻擋Pass用例6多次游戲測(cè)試:在人〔黑棋沒有出現(xiàn)"活三"、"沖四"的情況下,電腦〔白棋落子是否存在規(guī)律黑棋沒有出現(xiàn)"活三"、"沖四"的情況下,電腦〔白棋隨機(jī)落子,不存在規(guī)律Pass用例7進(jìn)行對(duì)戰(zhàn)時(shí),按照規(guī)則下棋能否正常輸贏可以正常輸贏Pass用例8判斷在橫線上5子能否獲得勝利可以Pass用例9判斷在豎線上5子能否獲得勝利可以Pass用例10判斷在斜線上5子能否獲得勝利可以Pass4.5測(cè)試游戲存在的問題1.通過小組以外人員的游戲測(cè)試發(fā)現(xiàn),由于棋盤大小問題,使得可能導(dǎo)致有時(shí)棋子滿格也沒有分出勝負(fù),這樣,就很難顯示博弈者的水平。2.小組以外人員的游戲測(cè)試后建議認(rèn)為,我們所設(shè)計(jì)的五子棋游戲只能實(shí)現(xiàn)人機(jī)博弈,不能實(shí)現(xiàn)人與人之間的博弈,這樣很難讓更多的人一展他們的高超棋藝。4.6游戲不足的解決方案1.通過對(duì)后臺(tái)代碼的修改實(shí)現(xiàn)對(duì)游戲棋盤大小的規(guī)格控制選擇,新添規(guī)格30*20格和40*30格模式,讓博弈者盡展各自高超棋藝。2.在人機(jī)對(duì)戰(zhàn)的基礎(chǔ)上新增人人對(duì)戰(zhàn)模式,以方便人與人之間棋藝博弈的樂趣讓更多的愛好五子棋的玩家參與進(jìn)來。4.6.1游戲改進(jìn)在菜單中新加棋盤選項(xiàng),再在模式中新增規(guī)格30*20格和40*30格模式實(shí)現(xiàn)代碼如下:publicChessModel<intmodeChess>{this.isOdd=true;if<modeChess==1>{PanelInit<20,15,modeChess>;}if<modeChess==2>{PanelInit<30,20,modeChess>;}if<modeChess==3>{PanelInit<40,30,modeChess>;}}privatevoidPanelInit<intwidth,intheight,intmodeChess>{this.width=width;this.height=height;this.modeChess=modeChess;arrMapShow=newint[width+1][height+1];for<inti=0;i<=width;i++>{for<intj=0;j<=height;j++>{arrMapShow[i][j]=-5;}}}2在菜單中新加模式選項(xiàng),新增人人對(duì)戰(zhàn)模式if<arg.equals<"人人對(duì)弈">>{this.checkcomputer=false;this.iscomputer=false;cm=newChessModel<cm.getModeChess<>>;MapSize<cm.getWidth<>,cm.getHeight<>>;SwingUtilities.updateComponentTreeUI<this>;}4.7回歸測(cè)試對(duì)修改后的游戲版本執(zhí)行回歸測(cè)試用例操作預(yù)期結(jié)果測(cè)試結(jié)果用例1選擇不同規(guī)格棋盤,能否正常運(yùn)行能正常運(yùn)行Pass用例2選擇人人對(duì)戰(zhàn),能否正常運(yùn)行能正常運(yùn)行Pass用例3選擇不同規(guī)格棋盤,對(duì)其他功能正常運(yùn)行是否產(chǎn)生影響沒有影響Pass用例4選擇人人對(duì)戰(zhàn)模式,對(duì)其他功能正常運(yùn)行是否產(chǎn)生影響沒有影響Pass5.總結(jié)在測(cè)試階段,一系列的測(cè)試方案都是為了"破壞"已經(jīng)建造好的軟件系統(tǒng)而特地設(shè)計(jì)的,它的存在是為了竭力證明程序中的錯(cuò)誤不能按照預(yù)定要求正確工作。軟件測(cè)試從不同的角度出發(fā)會(huì)派生出兩種不同的測(cè)試原則,從用戶的角度出發(fā),就是希望通過軟件測(cè)試能充分暴露軟件中存在的問題和缺陷,從而考慮是否可以接受該產(chǎn)品,從開發(fā)者的角度出發(fā),就是希望測(cè)試能表明軟件產(chǎn)品不存在錯(cuò)誤,已經(jīng)正確地實(shí)現(xiàn)了用戶的需求,確立人們對(duì)軟件質(zhì)量的信心。通過此次軟件測(cè)試的課程設(shè)計(jì),深刻學(xué)習(xí)掌握了軟件測(cè)試和軟件測(cè)試過程的基本方法和基本技術(shù),關(guān)于黑盒、白盒的測(cè)試用例的設(shè)計(jì),也進(jìn)行了認(rèn)真學(xué)習(xí)研究,從而進(jìn)一步提高了自己在程序上的編寫能力,以及一些之前未觸及的問題??傊?收獲頗豐,增強(qiáng)了自己動(dòng)手以及團(tuán)隊(duì)合作的能力。付出才會(huì)有回報(bào),實(shí)踐才能出真知。為即將踏上社會(huì)的自己又做了一份理論和實(shí)踐的準(zhǔn)備。參考文獻(xiàn)[1]謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)〔第五版[M].北京:電子工業(yè)出版社,20XX2月[2]胡小強(qiáng)計(jì)算機(jī)網(wǎng)絡(luò)[M]北京:北京郵電大學(xué)出版社20XX1月[3]劉群策LoadRunner和軟件項(xiàng)目性能測(cè)試[M]機(jī)械工業(yè)出版社20XX[4]朱少民軟件測(cè)試方法和技術(shù)[M]清華大學(xué)出版社20XX[5]鄭人杰軟件測(cè)試[M]人民郵電出版社20XX附錄//Java編程:五子棋游戲源代碼importjava.awt.*;importjava.awt.event.*;importjava.applet.*;importjavax.swing.*;importjava.io.PrintStream;importjavax.swing.JComponent;importjavax.swing.JPanel;/**main方法創(chuàng)建了ChessFrame類的一個(gè)實(shí)例對(duì)象〔cf,*并啟動(dòng)屏幕顯示顯示該實(shí)例對(duì)象。**/publicclassFiveChessAppletDemo{publicstaticvoidmain<Stringargs[]>{ChessFramecf=newChessFrame<>;cf.show<>;}}/**類ChessFrame主要功能是創(chuàng)建五子棋游戲主窗體和菜單**/classChessFrameextendsJFrameimplementsActionListener{privateString[]strsize={"20x15","30x20","40x30"};privateString[]strmode={"人機(jī)對(duì)弈","人人對(duì)弈"};publicstaticbooleaniscomputer=true,checkcomputer=true;privateintwidth,height;privateChessModelcm;privateMainPanelmp;//構(gòu)造五子棋游戲的主窗體publicChessFrame<>{this.setTitle<"五子棋游戲">;cm=newChessModel<1>;mp=newMainPanel<cm>;Containercon=this.getContentPane<>;con.add<mp,"Center">;this.setResizable<false>;this.addWindowListener<newChessWindowEvent<>>;MapSize<20,15>;JMenuBarmbar=newJMenuBar<>;this.setJMenuBar<mbar>;JMenugameMenu=newJMenu<"游戲">;mbar.add<makeMenu<gameMenu,newObject[]{"開局","棋盤","模式",null,"退出"},this>>;JMenulookMenu=newJMenu<"視圖">;mbar.add<makeMenu<lookMenu,newObject[]{"Metal","Motif","Windows"},this>>;JMenuhelpMenu=newJMenu<"幫助">;mbar.add<makeMenu<helpMenu,newObject[]{"關(guān)于"},this>>;}//構(gòu)造五子棋游戲的主菜單publicJMenumakeMenu<Objectparent,Objectitems[],Objecttarget>{JMenum=null;if<parentinstanceofJMenu>m=<JMenu>parent;elseif<parentinstanceofString>m=newJMenu<<String>parent>;elsereturnnull;for<inti=0;i<items.length;i++>if<items[i]==null>m.addSeparator<>;elseif<items[i]=="棋盤">{JMenujm=newJMenu<"棋盤">;ButtonGroupgroup=newButtonGroup<>;JRadioButtonMenuItemrmenu;for<intj=0;j<strsize.length;j++>{rmenu=makeRadioButtonMenuItem<strsize[j],target>;if<j==0>rmenu.setSelected<true>;jm.add<rmenu>;group.add<rmenu>;}m.add<jm>;}elseif<items[i]=="模式">{JMenujm=newJMenu<"模式">;ButtonGroupgroup=newButtonGroup<>;JRadioButtonMenuItemrmenu;for<inth=0;h<strmode.length;h++>{rmenu=makeRadioButtonMenuItem<strmode[h],target>;if<h==0>rmenu.setSelected<true>;jm.add<rmenu>;group.add<rmenu>;}m.add<jm>;}elsem.add<makeMenuItem<items[i],target>>;returnm;}//構(gòu)造五子棋游戲的菜單項(xiàng)publicJMenuItemmakeMenuItem<Objectitem,Objecttarget>{JMenuItemr=null;if<iteminstanceofString>r=newJMenuItem<<String>item>;elseif<iteminstanceofJMenuItem>r=<JMenuItem>item;elsereturnnull;if<targetinstanceofActionListener>r.addActionListener<<ActionListener>target>;returnr;}//構(gòu)造五子棋游戲的單選按鈕式菜單項(xiàng)publicJRadioButtonMenuItemmakeRadioButtonMenuItem<Objectitem,Objecttarget>{JRadioButtonMenuItemr=null;if<iteminstanceofString>r=newJRadioButtonMenuItem<<String>item>;elseif<iteminstanceofJRadioButtonMenuItem>r=<JRadioButtonMenuItem>item;elsereturnnull;if<targetinstanceofActionListener>r.addActionListener<<ActionListener>target>;returnr;}publicvoidMapSize<intw,inth>{setSize<w*20+50,h*20+100>;if<this.checkcomputer>this.iscomputer=true;elsethis.iscomputer=false;mp.setModel<cm>;mp.repaint<>;}publicbooleangetiscomputer<>{returnthis.iscomputer;}publicvoidrestart<>{intmodeChess=cm.getModeChess<>;if<modeChess<=3&&modeChess>=1>{cm=newChessModel<modeChess>;MapSize<cm.getWidth<>,cm.getHeight<>>;}else{System.out.println<"\u81EA\u5B9A\u4E49">;}}publicvoidactionPerformed<ActionEvente>{Stringarg=e.getActionCommand<>;try{if<arg.equals<"Windows">>UIManager.setLookAndFeel<"com.sun.java.swing.plaf.windows.WindowsLookAndFeel">;elseif<arg.equals<"Motif">>UIManager.setLookAndFeel<"com.sun.java.swing.plaf.motif.MotifLookAndFeel">;elseUIManager.setLookAndFeel<"javax.swing.plaf.metal.MetalLookAndFeel">;SwingUtilities.updateComponentTreeUI<this>;}catch<Exceptionee>{}if<arg.equals<"20x15">>{this.width=20;this.height=15;cm=newChessModel<1>;MapSize<this.width,this.height>;SwingUtilities.updateComponentTreeUI<this>;}if<arg.equals<"30x20">>{this.width=30;this.height=20;cm=newChessModel<2>;MapSize<this.width,this.height>;SwingUtilities.updateComponentTreeUI<this>;}if<arg.equals<"40x30">>{this.width=40;this.height=30;cm=newChessModel<3>;MapSize<this.width,this.height>;SwingUtilities.updateComponentTreeUI<this>;}if<arg.equals<"人機(jī)對(duì)弈">>{this.checkcomputer=true;this.iscomputer=true;cm=newChessModel<cm.getModeChess<>>;MapSize<cm.getWidth<>,cm.getHeight<>>;SwingUtilities.updateComponentTreeUI<this>;}if<arg.equals<"人人對(duì)弈">>{this.checkcomputer=false;this.iscomputer=false;cm=newChessModel<cm.getModeChess<>>;MapSize<cm.getWidth<>,cm.getHeight<>>;SwingUtilities.updateComponentTreeUI<this>;}if<arg.equals<"開局">>{restart<>;}if<arg.equals<"關(guān)于">>JOptionPane.showMessageDialog<this,"五子棋游戲測(cè)試版本","關(guān)于",0>;if<arg.equals<"退出">>System.exit<0>;}}/**類ChessModel實(shí)現(xiàn)了整個(gè)五子棋程序算法的核心*/classChessModel{//棋盤的寬度、高度、棋盤的模式〔如20×15privateintwidth,height,modeChess;//棋盤方格的橫向、縱向坐標(biāo)privateintx=0,y=0;//棋盤方格的橫向、縱向坐標(biāo)所對(duì)應(yīng)的棋子顏色,//數(shù)組arrMapShow只有3個(gè)值:1,2,3,-5,//其中1代表該棋盤方格上下的棋子為黑子,//2代表該棋盤方格上下的棋子為白子,//3代表為該棋盤方格上沒有棋子,//-5代表該棋盤方格不能夠下棋子privateint[][]arrMapShow;//交換棋手的標(biāo)識(shí),棋盤方格上是否有棋子的標(biāo)識(shí)符privatebooleanisOdd,isExist;publicChessModel<>{}//該構(gòu)造方法根據(jù)不同的棋盤模式〔modeChess來構(gòu)建對(duì)應(yīng)大小的棋盤publicChessModel<intmodeChess>{this.isOdd=true;if<modeChess==1>{PanelInit<20,15,modeChess>;}if<modeChess==2>{PanelInit<30,20,modeChess>;}if<modeChess==3>{PanelInit<40,30,modeChess>;}}//按照棋盤模式構(gòu)建棋盤大小privatevoidPanelInit<intwidth,intheight,intmodeChess>{this.width=width;this.height=height;this.modeChess=modeChess;arrMapShow=newint[width+1][height+1];for<inti=0;i<=width;i++>{for<intj=0;j<=height;j++>{arrMapShow[i][j]=-5;}}}//獲取是否交換棋手的標(biāo)識(shí)符publicbooleangetisOdd<>{returnthis.isOdd;}//設(shè)置交換棋手的標(biāo)識(shí)符publicvoidsetisOdd<booleanisodd>{if<isodd>this.isOdd=true;elsethis.isOdd=false;}//獲取某棋盤方格是否有棋子的標(biāo)識(shí)值publicbooleangetisExist<>{returnthis.isExist;}//獲取棋盤寬度publicintgetWidth<>{returnthis.width;}//獲取棋盤高度publicintgetHeight<>{returnthis.height;}//獲取棋盤模式publicintgetModeChess<>{returnthis.modeChess;}//獲取棋盤方格上棋子的信息publicint[][]getarrMapShow<>{returnarrMapShow;}//判斷下子的橫向、縱向坐標(biāo)是否越界privatebooleanbadxy<intx,inty>{if<x>=width+20||x<0>returntrue;returny>=height+20||y<0;}//計(jì)算棋盤上某一方格上八個(gè)方向棋子的最大值,//這八個(gè)方向分別是:左、右、上、下、左上、左下、右上、右下publicbooleanchessExist<inti,intj>{if<this.arrMapShow[i][j]==1||this.arrMapShow[i][j]==2>returntrue;returnfalse;}//判斷該坐標(biāo)位置是否可下棋子publicvoidreadyplay<intx,inty>{if<badxy<x,y>>return;if<chessExist<x,y>>return;this.arrMapShow[x][y]=3;}//在該坐標(biāo)位置下棋子publicvoidplay<intx,inty>{if<badxy<x,y>>return;if<chessExist<x,y>>{this.isExist=true;return;}elsethis.isExist=false;if<getisOdd<>>{setisOdd<false>;this.arrMapShow[x][y]=1;}else{setisOdd<true>;this.arrMapShow[x][y]=2;}}//計(jì)算機(jī)走棋/**說明:用窮舉法判斷每一個(gè)坐標(biāo)點(diǎn)的四個(gè)方向的的最大棋子數(shù),*最后得出棋子數(shù)最大值的坐標(biāo),下子**/publicvoidcomputerDo<intwidth,intheight>{intmax_black,max_white,max_temp,max=0;setisOdd<true>;System.out.println<"計(jì)算機(jī)走棋...">;for<inti=0;i<=width;i++>{for<intj=0;j<=height;j++>{if<!chessExist<i,j>>{//算法判斷是否下子max_white=checkMax<i,j,2>;//判斷白子的最大值max_black=checkMax<i,j,1>;//判斷黑子的最大值max_temp=Math.max<max_white,max_black>;if<max_temp>max>{max=max_temp;this.x=i;this.y=j;}}}}setX<this.x>;setY<this.y>;this.arrMapShow[this.x][this.y]=2;}//記錄電腦下子后的橫向坐標(biāo)publicvoidsetX<intx>{this.x=x;}//記錄電腦下子后的縱向坐標(biāo)publicvoidsetY<inty>{this.y=y;}//獲取電腦下子的橫向坐標(biāo)publicintgetX<>{returnthis.x;}//獲取電腦下子的縱向坐標(biāo)publicintgetY<>{returnthis.y;}//計(jì)算棋盤上某一方格上八個(gè)方向棋子的最大值,//這八個(gè)方向分別是:左、右、上、下、左上、左下、右上、右下publicintcheckMax<intx,inty,intblack_or_white>{intnum=0,max_num,max_temp=0;intx_temp=x,y_temp=y;intx_temp1=x_temp,y_temp1=y_temp;//judgerightfor<inti=1;i<5;i++>{x_temp1+=1;if<x_temp1>this.width>break;if<this.arrMapShow[x_temp1][y_temp1]==black_or_white>num++;elsebreak;}//judgeleftx_temp1=x_temp;for<inti=1;i<5;i++>{x_temp1-=1;if<x_temp1<0>break;if<this.arrMapShow[x_temp1][y_temp1]==black_or_white>num++;elsebreak;}if<num<5>max_temp=num;//judgeupx_temp1=x_temp;y_temp1=y_temp;num=0;for<inti=1;i<5;i++>{y_temp1-=1;if<y_temp1<0>break;if<this.arrMapShow[x_temp1][y_temp1]==black_or_white>num++;elsebreak;}//judgedowny_temp1=y_temp;for<inti=1;i<5;i++>{y_temp1+=1;if<y_temp1>this.height>break;if<this.arrMapShow[x_temp1][y_temp1]==black_or_white>num++;elsebreak;}if<num>max_temp&&num<5>max_temp=num;//judgeleft_upx_temp1=x_temp;y_temp1=y_temp;num=0;for<inti=1;i<5;i++>{x_temp1-=1;y_temp1-=1;if<y_temp1<0||x_temp1<0>break;if<this.arrMapShow[x_temp1][y_temp1]==black_or_white>num++;elsebreak;}//judgeright_downx_temp1=x_temp;y_temp1=y_temp;for<inti=1;i<5;i++>{x_temp1+=1;y_temp1+=1;if<y_temp1>this.height||x_temp1>this.width>break;if<this.arrMapShow[x_temp1][y_temp1]==black_or_white>num++;elsebreak;}if<num>max_temp&&num<5>max_temp=num;//judgeright_upx_temp1=x_temp;y_temp1=y_temp;num=0;for<inti=1;i<5;i++>{x_temp1+=1;y_temp1-=1;if<y_temp1<0||x_temp1>this.width>break;if<this.arrMapShow[x_temp1][y_temp1]==black_or_white>num++;elsebreak;}//judgeleft_downx_temp1=x_temp;y_temp1=y_temp;for<inti=1;i<5;i++>{x_temp1-=1;y_temp1+=1;if<y_temp1>this.height||x_temp1<0>break;if<this.arrMapShow[x_temp1][y_temp1]==black_or_white>num++;elsebreak;}if<num>max_temp&&num<5>max_temp=num;max_num=max_temp;returnmax_num;}//判斷勝負(fù)publicbooleanjudgeSuccess<intx,inty,booleanisodd>{intnum=1;intarrvalue;intx_temp=x,y_temp=y;if<isodd>arrvalue=2;elsearrvalue=1;intx_temp1=x_temp,y_temp1=y_temp;//判斷右邊f(xié)or<inti=1;i<6;i++>{x_temp1+=1;if<x_temp1>this.width>break;if<this.arrMapShow[x_temp1][y_temp1]==arrvalue>num++;elsebreak;}//判斷左邊x_temp1=x_temp;for<inti=1;i<6;i++>{x_temp1-=1;if<x_temp1<0>break;if<this.arrMapShow[x_temp1][y_temp1]==arrvalue>num++;elsebreak;}if<num==5>returntrue;//判斷上方x_temp1=x_temp;y_temp1=y_temp;num=1;for<inti=1;i<6;i++>{y_temp1-=1;if<y_temp1<0>break;if<this.arrMapShow[x_temp1][y_temp1]==arrvalue>num++;elsebreak;}//判斷下方y(tǒng)_temp1=y_temp;for<inti=1;i<6;i++>{y_temp1+=1;if<y_temp1>this.height>break;if<this.arrMapShow[x_temp1][y_temp1]==arrvalue>num++;elsebreak;}if<num==5>returntrue;//判斷左上x_temp1=x_temp;y_temp1=y_temp;num=1;for<inti=1;i<6;i++>{x_temp1-=1;y_temp1-=1;if<y_temp1<0||x_temp1<0>break;if<this.arrMapShow[x_temp1][y_temp1]==arrvalue>num++;elsebreak;}//判斷右下x_temp1=x_temp;y_temp1=y_temp;for<inti=1;i<6;i++>{x_temp1+=1;y_temp1+=1;if<y_temp1>this.height||x_temp1>this.width>break;if<this.arrMapShow[x_temp1][y_temp1]==arrvalue>num++;elsebreak;}if<num==5>returntrue;//判斷右上x_temp1=x_temp;y_temp1=y_temp;num=1;for<inti=1;i<6;i++>{x_temp1+=1;y_temp1-=1;if<y_temp1<0||x_temp1>this.width>break;if<this.arrMapShow[x_temp1][y_temp1]==arrvalue>num++;elsebreak;}//判斷左下x_temp1=x_temp;y_temp1=y_temp;for<inti=1;i<6;i++>{x_temp1-=1;y_temp1+=1;if<y_temp1>this.height||x_temp1<0>break;if<this.arrMapShow[x_temp1][y_temp1]==arrvalue>num++;elsebreak;}if<num==5>returntrue;returnfalse;}//贏棋后的提示publicvoidshowSuccess<JPaneljp>{JOptionPane.showMessageDialog<jp,"你贏了,好厲害!","win",JOptionPane.INFORMATION_MESSAGE>;}//輸棋后的提示publicvoidshowDefeat<JPaneljp>{JOptionPane.showMessageDialog<jp,"你輸了,請(qǐng)重新開始!","lost",JOptionPane.INFORMATION_MESSAGE>;}}/**類MainPanel主要完成如下功能:*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論