




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、軟件工程課程設(shè)計報告題目: 井字棋游戲 二 一四 年 十二 月一 日課程設(shè)計題目說明書課程設(shè)計題目:井字棋游戲設(shè)計要求:“井字棋”游戲(又叫“三子棋”),或是一字棋,是一款十分經(jīng)典的益智小游戲,想必很多玩家都有玩過?!熬制濉钡钠灞P很簡單,是一個33的格子,很像中國文字中的“井”字,所以得名“井字棋”。“井字棋”游戲的規(guī)則與“五子棋”十分類似,“五子棋”的規(guī)則是一方首先五子連成一線就勝利;“井字棋”是一方首先三子連成一線就勝利。要求:屏幕輸出棋盤和棋子(可用特殊符號代替),實現(xiàn):用戶與電腦下棋難點(diǎn):判斷輸贏的算法及簡單的人工智能實現(xiàn)工作量:(根據(jù)項目實際情況選擇,在所作的工作后打) 具體工作量
2、分為幾個部分:1 可行性研究分析和可行性研究報告的撰寫工作。2 軟件需求的調(diào)查和軟件需求說明書的撰寫;3 軟件的概要設(shè)計和概要設(shè)計說明書的撰寫;4 軟件的詳細(xì)設(shè)計和詳細(xì)設(shè)計說明書的撰寫;5 軟件的實現(xiàn)工作,包括代碼的實現(xiàn)和實現(xiàn)過程中的具體要求工作;6 測試的準(zhǔn)備工作和測試計劃報告的撰寫;7 整個軟件試運(yùn)行、軟件測試、測試報告的撰寫和用戶手冊的撰寫工作;8 項目文檔和代碼的規(guī)范化整合;10整個項目的總結(jié)和課程設(shè)計總結(jié)報告的撰寫。 工作計劃安排: 11月26日: 確定研究課題,進(jìn)行可行性研究。 11月26日: 做好內(nèi)容安排。 11月26日11月28日: 完成概要設(shè)計、完成詳細(xì)設(shè)計。 11月27日1
3、1月28日: 完成代碼的編寫。 11月28日: 進(jìn)行測試和維護(hù)。 11月28日: 對整個設(shè)計進(jìn)行補(bǔ)充和檢查。第一章 可行性研究1.1 引言1.1.1 可行性研究目的 在課程設(shè)計項目中,井字棋游戲設(shè)計作為初學(xué)者的我們來說,是個比較適合和有研究意義的題目。 “井字棋”游戲(又叫“三子棋”),或是一字棋,是一款十分經(jīng)典的益智小游戲,想必很多玩家都有玩過。“井字棋”的棋盤很簡單,是一個33的格子,很像中國文字中的“井”字,所以得名“井字棋”?!熬制濉庇螒虻囊?guī)則與“五子棋”十分類似,“五子棋”的規(guī)則是一方首先五子連成一線就勝利;“井字棋”是一方首先三子連成一線就勝利。雖然這只是個很簡單的小游戲,但作為
4、初學(xué)者的我們認(rèn)識項目設(shè)計的技巧與結(jié)構(gòu)及其概念的理解,封裝性、繼承派生、多肽的理解及實現(xiàn),是比較好的課題。對我們以后的大型程序的設(shè)計奠定了基礎(chǔ)。所以作為我們這次的課程設(shè)計項目來說,我們認(rèn)為是個很好的、有可研究性的設(shè)計項目。1.1.2 背景(說明井字棋設(shè)計背景,開發(fā)目的等)對于21世紀(jì)的人們來說,游戲日益成為我們生活中必不可少的休閑娛樂工具。為了滿足人們的需要,現(xiàn)在越來越多的人們把游戲作為一種商品對待,就比如中國,像盛大、網(wǎng)易、滕訊等大型的游戲開發(fā)公司更把游戲的研究看作是一棵搖錢樹,所以游戲程序設(shè)計人員在未來是不可多得的人才。對于學(xué)軟件工程的我們來說,一個優(yōu)秀的程序員也許是我們學(xué)習(xí)的優(yōu)秀目標(biāo),所以
5、在出始階段我們就注重項目設(shè)計的理念,而且喜歡游戲的我們更希望自己在將來能夠做出一個自己很滿意且適合市場的游戲來,所以我們這次以這個為題目就是想熟悉游戲編程的最基礎(chǔ)的設(shè)計思想和實現(xiàn)手段的了解,為我們以后打下基礎(chǔ)。雖然井字棋是個很簡單的小游戲,基本上人們都不玩了,但是作為一種我們的設(shè)計項目,我們都覺得是個很好的且適合的項目。1.2 可行性研究的前提1.2.1 要求(說明井字棋的預(yù)期要求)功能:屏幕輸出棋盤和棋子(可用特殊符號代替);實現(xiàn):用戶與電腦下棋(可選)功能和修改。難點(diǎn):判斷輸贏的算法及簡單的人工智能實現(xiàn)。1.2.2 目標(biāo)首先:能做出棋盤的基本樣式。最后:能實現(xiàn)玩家與電腦的對弈,最好能做到電
6、腦的智能化。1.2.3 評價尺度 第一:實現(xiàn)電腦的智能化;第二:做到界面美觀易懂;第三:達(dá)到娛樂的最低水平。第二章 需求分析2.1 任務(wù)概述該軟件的設(shè)計主要是實現(xiàn)簡單的三字棋,能做到玩家與玩家之間的對弈或者玩家與電腦之間的對弈,可考慮怎樣實現(xiàn)電腦的智能化。其次,從程序的設(shè)計過程中理解實現(xiàn)程序的方法和理念,學(xué)會怎么樣做到面向?qū)ο笤O(shè)計,理解面向?qū)ο蟮母拍罴敖Y(jié)構(gòu)的封裝性和實用性,能為以后的設(shè)計奠定一些良好的基礎(chǔ)。2.2對性能的規(guī)定 此節(jié)說明軟件的性能要求:精度: 本程序中按照系統(tǒng)給出的提示,輸入數(shù)字,實現(xiàn)程序的功能。應(yīng)該注意,輸入的一定只能是數(shù)字,若輸入字母或其他,則出錯。時間特性:由于本程序并不是
7、很龐大,故響應(yīng)時間短,顯示結(jié)果迅速。故障處理要求:只有在非法輸入是,出現(xiàn)死循環(huán),此時應(yīng)該退出程序,重新輸入。運(yùn)行環(huán)境規(guī)定運(yùn)行的軟件環(huán)境 :windows 7、windowsxp、運(yùn)行該軟件所需要的硬設(shè)備: pc機(jī)一臺。第三章 概要設(shè)計3.1 總體設(shè)計3.1.1 基本設(shè)計概念和處理流程人機(jī)對弈的難點(diǎn)在于當(dāng)人走一步棋之后,計算機(jī)如何走下一步,即計算機(jī)如何找出最合適的位置去走棋。這就需要一定的算法,或者叫做計算機(jī)的ai。對于井字棋、五子棋等兩方較量的游戲來說,minimax算法(極小極大算法)是最基本也是最常用的。算法的原理不在這里解釋了,我們直接看該算法在井字棋中的應(yīng)用。井字棋中,假設(shè)使用“x”的
8、是人,使用“o”的是計算機(jī)?!皒”方先走,設(shè)定x方的最大利益為正無窮(程序使用常量+infinity表示),o方的最大利益為負(fù)無窮(程序中使用-infinity表示),即x方和o方走的每步棋都要力圖使自己的利益最大化,而使對方的利益最小化。這樣我們稱x方為max(因為他總是追求更大的值),o方為min(它總是追求更小的值),各自都為爭取自己的最大獲益而努力?,F(xiàn)在舉例說明,比如圖4所示的棋局樹:圖1棋局形成的樹x方先走,有三種選擇,如圖4中第二層所示。假設(shè)x方選擇最左邊的走法,那么o方接下來將有5種走法,o方會選擇最小化的走法,即值為-1的走法,因為它的最大利益是負(fù)無窮;同理,x方的另外兩種走法
9、會分別得到o方的最小值1和-2。這樣,對于x方來說,三種走法會導(dǎo)致o方最小化值分別為-1、1、-2,x方的最佳策略則是選擇其中最大的,即第二層中間的走法,因為它的最大利益是正無窮,這就是極小極大算法的體現(xiàn)x方的選擇總是極大化,o方的選擇總是極小化。對于其中那些值的是如何計算的,我們舉例說明,比如對于第三層最左邊的棋局,在這種狀態(tài)下,如果把棋局空白處都填上x,則x共有6中3連子情況,即獲勝情況;如果把空白處都填上o,則o共有5種3連子情況,所以結(jié)果是二者相減等于1。在具體走起過程中,max面對min最大獲利中的最小值時,會選擇其中最大的,比如圖4第二層小括號內(nèi)的值都是第三層中能使min最大獲利的
10、最小值,這時候max選擇其中最大的,這對max最為有利,所以max方選擇圖4第二層中間的走法最好。同樣道理,min也會一樣,選擇對自己最有利的,即max有可能獲得的最大值。這時候,min在走棋時會考慮max方占據(jù)哪個位置對max最有利,然后min把這個位置先占了。有點(diǎn)難理解,其實就是搶先把對對手有利的位置搶占了。簡單說,x方或者max方的走棋時由人來控制的,我們不仔細(xì)說了。對于o方或者min方,它走棋時要考慮哪個位置對x方最有利,然后把該位置占據(jù),即o的最佳走棋就是x的最佳走棋。所以o在走棋之前,先站在x的角度尋找最佳走棋位置。后文中minimax方法就是站在x角度來考慮極小極大算法,找到x的
11、最佳走棋位置,然后由o方來占據(jù)該位置。2、極小極大算法整個算法包括如下幾個部分:首先要有一個評估方法gamestate,對每走一步棋后的棋局進(jìn)行評估,估值為win常量說明x方,即max方獲勝;估值為lose則o方,即min方獲勝;估值draw為平局;估值為inprogress,說明棋未走完;估值為double_link,說明棋局中有兩連子情況然后用一個minimax方法尋找在當(dāng)前棋局狀態(tài)下x方的最佳位置, x方的最佳位置就是當(dāng)x走該位置后,o方所有走法中最小值里的最大值,比如圖4中第二層x 的位置選擇。當(dāng)找到該位置后,由o方來搶先占據(jù)該位置。最后用兩個遞歸方法min和max來遍歷所有的棋局。m
12、in方法負(fù)責(zé)找出o方的最小值,比如圖1第二層最左邊的棋局會導(dǎo)致5中o方的走法,min方法就是找出這5種走法中的最小值。同理,max方法負(fù)責(zé)找出x方的最大值,比如圖1第二層三種棋局中的中間棋局。3.1.2功能需求與程序的關(guān)系計算機(jī)為一方,人為一方,交替下棋,誰先連成一條直線誰勝;允許人選擇先下還是后下。 2界面要求:初始狀態(tài)顯示棋盤,并顯示玩家的操作鍵;游戲進(jìn)行狀態(tài)動態(tài)顯示棋盤不同玩家的棋子用不同符號顯示,屏幕上顯示當(dāng)前玩家號,結(jié)束時顯示贏家號。 3提示計算機(jī)自動下棋的規(guī)則:計算機(jī)下時,應(yīng)考慮所有空位,并按行、列、對角線計算每個空位的分值,若在某行(列、對角線)上,(設(shè)計算機(jī)畫x,人畫o) 已有
13、xx 加50分 已有oo 加25分 已有x空 加10分 已有o空 加8分 都是空 加4分 然后選分值最高的位置畫x。3.2 系統(tǒng)出錯處理設(shè)計(1)違規(guī)輸入字符,程序可能會出現(xiàn)死循環(huán)或者直接結(jié)束程序。(2)規(guī)則里面所定義的若有錯誤輸入,則會根據(jù)程序的提示重新輸入。3.3 性能1程序耗費(fèi)電腦內(nèi)存和cpu開銷很小。2玩家與電腦對戰(zhàn)時al的智能很高。3可以選擇電腦難度,適合各種水平的玩家。4游戲界面比較美觀,親近,方便大眾接受。3.4 程序設(shè)計:/ 按鈕的監(jiān)聽事件private class jbclick implements actionlistener / 當(dāng)單擊按鈕時public void ac
14、tionperformed(actionevent e) for (int i = 0; i 9; i+) if (e.getsource() = jbi) jbi.settext(x); / 被單擊的按鈕走“x”jbi.setenabled(false); /置為不可用int gamestate = gamestate(jb); / 獲取棋盤狀態(tài)/ 如果棋局未結(jié)束,則計算機(jī)走下一步if (!(gamestate = win | gamestate = lose | gamestate = draw) int nextpos = getnextmove(jb); / 獲取下一步走棋位置jbne
15、xtpos.settext(o); / 走棋“o”jbnextpos.setenabled(false);gamestate = gamestate(jb); / 獲取最新的棋盤狀態(tài)/ 輸出棋局勝負(fù)switch (gamestate) case win: joptionpane.showmessagedialog(null, x方獲勝, 提示,joptionpane.default_option); break;case lose:joptionpane.showmessagedialog(null, o方獲勝, 提示,joptionpane.default_option);break;cas
16、e draw: joptionpane.showmessagedialog(null, 平局, 提示,joptionpane.default_option);break;/ 如果結(jié)束,則提示if (gamestate = win | gamestate = lose | gamestate = draw) int over = joptionpane.showconfirmdialog(null, 是否再來一局?, 提示, joptionpane.yes_no_option, joptionpane.question_message);if (over = joptionpane.yes_op
17、tion) / 再來一局for (int i = 0; i 9; i+) jbi.settext( );jbi.setenabled(true); else system.exit(0); / 退出游戲然后,獲取棋局狀態(tài)的方法加入尋找兩連子的代碼,如下:/ 獲取棋盤當(dāng)前狀態(tài)public int gamestate(jbutton jb) int result = inprogress;boolean isfull = true;/ 判斷棋盤是否已滿for (int pos = 0; pos 9; pos+) char chess = jbpos.gettext().charat(0);if (
18、empty = chess) isfull = false;/ 尋找三連子情況for (int status : win_status) / 遍歷8中棋局獲勝狀態(tài)/ 得到某個獲勝棋局狀態(tài)的第一個索引的字符char chess = jbstatus0.gettext().charat(0);/ 如果為空,說明此處未下棋子,跳出循環(huán),找下一個狀態(tài)if (chess = empty) continue;int i;for (i = 1; i status.length; i+) / 查看其余兩個字符if (jbstatusi.gettext().charat(0) != chess) / 不與第一個
19、索引字符一致break; / 表明未三子連線,跳出if (i = status.length) / 三子連線result = chess = x ? win : lose;break;/ 尋找兩連子情況if (result != win & result != lose) if (isfull) result = draw;/不輸不贏且棋盤滿則為平 else int finds = new int2;/ 存放x或o的兩連子情況for (int status : win_status) char chess = empty;boolean hasempty = false;int count =
20、 0;/ 計數(shù)for (int i = 0; i 1) if (chess = x) finds0+; else finds1+;/ 兩連子情況if (finds1 0) / o的兩連子result = -double_link; else if (finds0 0) / x的兩連子result = double_link;return result;/ 記錄了勝負(fù)平或者兩連子情況o方走棋時,要得到走棋位置,我們用一個方法來獲取該位置,如下:public int getnextmove(jbutton board) int nextpos = minimax(board, 3);return
21、nextpos;上面方法中調(diào)用了極小極大算法minimax,如下:/以x的角度來考慮的極小極大算法public int minimax(jbutton board, int depth) int bestmoves = new int9;/存放最佳走棋位置int index = 0;int bestvalue = -infinity;/ 搜索所有空位,試探填上x,然后選其中最小值的for (int pos = 0; pos bestvalue) / 選擇最小值里最大的bestvalue = value;index = 0;bestmovesindex = pos; else if (value
22、 = bestvalue) index+;bestmovesindex = pos;boardpos.settext( );return bestmovesindex;最后,兩個遞歸方法min和max如下:/對于o,估值越小對其越有利public int min(jbutton board, int depth) int evalvalue = gamestate(board);boolean isgameover = (evalvalue = win | evalvalue = lose | evalvalue = draw);if (depth = 0 | isgameover) retu
23、rn evalvalue;int bestvalue = infinity;for (int pos = 0; pos 9; pos+) if (boardpos.gettext().charat(0) = empty) boardpos.settext(o);/ 選擇最小值bestvalue = math.min(bestvalue, max(board, depth - 1);boardpos.settext( );return evalvalue;/對于x,估值越大對其越有利public int max(jbutton board, int depth) int evalvalue =
24、gamestate(board);boolean isgameover = (evalvalue = win | evalvalue = lose | evalvalue = draw);if (depth = 0 | isgameover) return evalvalue;int bestvalue = -infinity;for (int pos = 0; pos 9; pos+) if (boardpos.gettext().charat(0) = empty) boardpos.settext(x);/ 選擇最大值bestvalue = math.max(bestvalue, min(board, depth - 1)boardpos.settext( );return evalvalue;第五章 測試分析 本程序的功能非常明顯:#字棋。本程序提供1種對戰(zhàn)模式:玩家vs電腦。玩家和電腦對戰(zhàn)時選擇難度和誰先手,玩家很容易贏簡單
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年考試復(fù)習(xí)關(guān)鍵試題及答案
- 2024年育嬰師考試的注意要點(diǎn)試題及答案
- 注冊會計師實務(wù)考點(diǎn)試題及答案
- 2024年人力資源管理師實戰(zhàn)試題及答案
- 2024年陪診師考試通過率及試題及答案
- 2025年甘肅省建筑安全員知識題庫及答案
- 生態(tài)環(huán)境修復(fù)的地理策略試題及答案
- 提高電化學(xué)傳感器中電極穩(wěn)定性
- 國際物流師面臨的變化與挑戰(zhàn)試題及答案
- 物聯(lián)網(wǎng)智能家居設(shè)備安裝與配置手冊
- GB/T 23444-2024金屬及金屬復(fù)合材料吊頂板
- 2024會計職業(yè)規(guī)劃
- 重大決策社會穩(wěn)定風(fēng)險評估工作規(guī)范
- 公眾號轉(zhuǎn)移合同模板
- 醫(yī)院培訓(xùn)課件:《病區(qū)藥品安全管理與使用》
- 術(shù)后下床活動方案及流程
- 牙科手機(jī)清洗、消毒與滅菌操作流程
- 再生障礙性貧血幻燈片
- 國家開放大學(xué)2024春《1474臨床醫(yī)學(xué)概論(本)》期末考試真題及答案
- 小學(xué)五年級下冊數(shù)學(xué)選擇題60道必考題
- 公司職稱評審管理辦法
評論
0/150
提交評論