井字棋課程設計報告_第1頁
井字棋課程設計報告_第2頁
井字棋課程設計報告_第3頁
井字棋課程設計報告_第4頁
井字棋課程設計報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、軟件工程課程設計報告題目: 井字棋游戲 二 一四 年 十二 月一 日課程設計題目說明書課程設計題目:井字棋游戲設計要求:“井字棋”游戲(又叫“三子棋”),或是一字棋,是一款十分經典的益智小游戲,想必很多玩家都有玩過?!熬制濉钡钠灞P很簡單,是一個33的格子,很像中國文字中的“井”字,所以得名“井字棋”?!熬制濉庇螒虻囊?guī)則與“五子棋”十分類似,“五子棋”的規(guī)則是一方首先五子連成一線就勝利;“井字棋”是一方首先三子連成一線就勝利。要求:屏幕輸出棋盤和棋子(可用特殊符號代替),實現(xiàn):用戶與電腦下棋難點:判斷輸贏的算法及簡單的人工智能實現(xiàn)工作量:(根據項目實際情況選擇,在所作的工作后打) 具體工作量

2、分為幾個部分:1 可行性研究分析和可行性研究報告的撰寫工作。2 軟件需求的調查和軟件需求說明書的撰寫;3 軟件的概要設計和概要設計說明書的撰寫;4 軟件的詳細設計和詳細設計說明書的撰寫;5 軟件的實現(xiàn)工作,包括代碼的實現(xiàn)和實現(xiàn)過程中的具體要求工作;6 測試的準備工作和測試計劃報告的撰寫;7 整個軟件試運行、軟件測試、測試報告的撰寫和用戶手冊的撰寫工作;8 項目文檔和代碼的規(guī)范化整合;10整個項目的總結和課程設計總結報告的撰寫。 工作計劃安排: 11月26日: 確定研究課題,進行可行性研究。 11月26日: 做好內容安排。 11月26日11月28日: 完成概要設計、完成詳細設計。 11月27日1

3、1月28日: 完成代碼的編寫。 11月28日: 進行測試和維護。 11月28日: 對整個設計進行補充和檢查。第一章 可行性研究1.1 引言1.1.1 可行性研究目的 在課程設計項目中,井字棋游戲設計作為初學者的我們來說,是個比較適合和有研究意義的題目。 “井字棋”游戲(又叫“三子棋”),或是一字棋,是一款十分經典的益智小游戲,想必很多玩家都有玩過。“井字棋”的棋盤很簡單,是一個33的格子,很像中國文字中的“井”字,所以得名“井字棋”。“井字棋”游戲的規(guī)則與“五子棋”十分類似,“五子棋”的規(guī)則是一方首先五子連成一線就勝利;“井字棋”是一方首先三子連成一線就勝利。雖然這只是個很簡單的小游戲,但作為

4、初學者的我們認識項目設計的技巧與結構及其概念的理解,封裝性、繼承派生、多肽的理解及實現(xiàn),是比較好的課題。對我們以后的大型程序的設計奠定了基礎。所以作為我們這次的課程設計項目來說,我們認為是個很好的、有可研究性的設計項目。1.1.2 背景(說明井字棋設計背景,開發(fā)目的等)對于21世紀的人們來說,游戲日益成為我們生活中必不可少的休閑娛樂工具。為了滿足人們的需要,現(xiàn)在越來越多的人們把游戲作為一種商品對待,就比如中國,像盛大、網易、滕訊等大型的游戲開發(fā)公司更把游戲的研究看作是一棵搖錢樹,所以游戲程序設計人員在未來是不可多得的人才。對于學軟件工程的我們來說,一個優(yōu)秀的程序員也許是我們學習的優(yōu)秀目標,所以

5、在出始階段我們就注重項目設計的理念,而且喜歡游戲的我們更希望自己在將來能夠做出一個自己很滿意且適合市場的游戲來,所以我們這次以這個為題目就是想熟悉游戲編程的最基礎的設計思想和實現(xiàn)手段的了解,為我們以后打下基礎。雖然井字棋是個很簡單的小游戲,基本上人們都不玩了,但是作為一種我們的設計項目,我們都覺得是個很好的且適合的項目。1.2 可行性研究的前提1.2.1 要求(說明井字棋的預期要求)功能:屏幕輸出棋盤和棋子(可用特殊符號代替);實現(xiàn):用戶與電腦下棋(可選)功能和修改。難點:判斷輸贏的算法及簡單的人工智能實現(xiàn)。1.2.2 目標首先:能做出棋盤的基本樣式。最后:能實現(xiàn)玩家與電腦的對弈,最好能做到電

6、腦的智能化。1.2.3 評價尺度 第一:實現(xiàn)電腦的智能化;第二:做到界面美觀易懂;第三:達到娛樂的最低水平。第二章 需求分析2.1 任務概述該軟件的設計主要是實現(xiàn)簡單的三字棋,能做到玩家與玩家之間的對弈或者玩家與電腦之間的對弈,可考慮怎樣實現(xiàn)電腦的智能化。其次,從程序的設計過程中理解實現(xiàn)程序的方法和理念,學會怎么樣做到面向對象設計,理解面向對象的概念及結構的封裝性和實用性,能為以后的設計奠定一些良好的基礎。2.2對性能的規(guī)定 此節(jié)說明軟件的性能要求:精度: 本程序中按照系統(tǒng)給出的提示,輸入數字,實現(xiàn)程序的功能。應該注意,輸入的一定只能是數字,若輸入字母或其他,則出錯。時間特性:由于本程序并不是

7、很龐大,故響應時間短,顯示結果迅速。故障處理要求:只有在非法輸入是,出現(xiàn)死循環(huán),此時應該退出程序,重新輸入。運行環(huán)境規(guī)定運行的軟件環(huán)境 :windows 7、windowsxp、運行該軟件所需要的硬設備: pc機一臺。第三章 概要設計3.1 總體設計3.1.1 基本設計概念和處理流程人機對弈的難點在于當人走一步棋之后,計算機如何走下一步,即計算機如何找出最合適的位置去走棋。這就需要一定的算法,或者叫做計算機的ai。對于井字棋、五子棋等兩方較量的游戲來說,minimax算法(極小極大算法)是最基本也是最常用的。算法的原理不在這里解釋了,我們直接看該算法在井字棋中的應用。井字棋中,假設使用“x”的

8、是人,使用“o”的是計算機。“x”方先走,設定x方的最大利益為正無窮(程序使用常量+infinity表示),o方的最大利益為負無窮(程序中使用-infinity表示),即x方和o方走的每步棋都要力圖使自己的利益最大化,而使對方的利益最小化。這樣我們稱x方為max(因為他總是追求更大的值),o方為min(它總是追求更小的值),各自都為爭取自己的最大獲益而努力?,F(xiàn)在舉例說明,比如圖4所示的棋局樹:圖1棋局形成的樹x方先走,有三種選擇,如圖4中第二層所示。假設x方選擇最左邊的走法,那么o方接下來將有5種走法,o方會選擇最小化的走法,即值為-1的走法,因為它的最大利益是負無窮;同理,x方的另外兩種走法

9、會分別得到o方的最小值1和-2。這樣,對于x方來說,三種走法會導致o方最小化值分別為-1、1、-2,x方的最佳策略則是選擇其中最大的,即第二層中間的走法,因為它的最大利益是正無窮,這就是極小極大算法的體現(xiàn)x方的選擇總是極大化,o方的選擇總是極小化。對于其中那些值的是如何計算的,我們舉例說明,比如對于第三層最左邊的棋局,在這種狀態(tài)下,如果把棋局空白處都填上x,則x共有6中3連子情況,即獲勝情況;如果把空白處都填上o,則o共有5種3連子情況,所以結果是二者相減等于1。在具體走起過程中,max面對min最大獲利中的最小值時,會選擇其中最大的,比如圖4第二層小括號內的值都是第三層中能使min最大獲利的

10、最小值,這時候max選擇其中最大的,這對max最為有利,所以max方選擇圖4第二層中間的走法最好。同樣道理,min也會一樣,選擇對自己最有利的,即max有可能獲得的最大值。這時候,min在走棋時會考慮max方占據哪個位置對max最有利,然后min把這個位置先占了。有點難理解,其實就是搶先把對對手有利的位置搶占了。簡單說,x方或者max方的走棋時由人來控制的,我們不仔細說了。對于o方或者min方,它走棋時要考慮哪個位置對x方最有利,然后把該位置占據,即o的最佳走棋就是x的最佳走棋。所以o在走棋之前,先站在x的角度尋找最佳走棋位置。后文中minimax方法就是站在x角度來考慮極小極大算法,找到x的

11、最佳走棋位置,然后由o方來占據該位置。2、極小極大算法整個算法包括如下幾個部分:首先要有一個評估方法gamestate,對每走一步棋后的棋局進行評估,估值為win常量說明x方,即max方獲勝;估值為lose則o方,即min方獲勝;估值draw為平局;估值為inprogress,說明棋未走完;估值為double_link,說明棋局中有兩連子情況然后用一個minimax方法尋找在當前棋局狀態(tài)下x方的最佳位置, x方的最佳位置就是當x走該位置后,o方所有走法中最小值里的最大值,比如圖4中第二層x 的位置選擇。當找到該位置后,由o方來搶先占據該位置。最后用兩個遞歸方法min和max來遍歷所有的棋局。m

12、in方法負責找出o方的最小值,比如圖1第二層最左邊的棋局會導致5中o方的走法,min方法就是找出這5種走法中的最小值。同理,max方法負責找出x方的最大值,比如圖1第二層三種棋局中的中間棋局。3.1.2功能需求與程序的關系計算機為一方,人為一方,交替下棋,誰先連成一條直線誰勝;允許人選擇先下還是后下。 2界面要求:初始狀態(tài)顯示棋盤,并顯示玩家的操作鍵;游戲進行狀態(tài)動態(tài)顯示棋盤不同玩家的棋子用不同符號顯示,屏幕上顯示當前玩家號,結束時顯示贏家號。 3提示計算機自動下棋的規(guī)則:計算機下時,應考慮所有空位,并按行、列、對角線計算每個空位的分值,若在某行(列、對角線)上,(設計算機畫x,人畫o) 已有

13、xx 加50分 已有oo 加25分 已有x空 加10分 已有o空 加8分 都是空 加4分 然后選分值最高的位置畫x。3.2 系統(tǒng)出錯處理設計(1)違規(guī)輸入字符,程序可能會出現(xiàn)死循環(huán)或者直接結束程序。(2)規(guī)則里面所定義的若有錯誤輸入,則會根據程序的提示重新輸入。3.3 性能1程序耗費電腦內存和cpu開銷很小。2玩家與電腦對戰(zhàn)時al的智能很高。3可以選擇電腦難度,適合各種水平的玩家。4游戲界面比較美觀,親近,方便大眾接受。3.4 程序設計:/ 按鈕的監(jiān)聽事件private class jbclick implements actionlistener / 當單擊按鈕時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)/ 如果棋局未結束,則計算機走下一步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)/ 輸出棋局勝負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;/ 如果結束,則提示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)的方法加入尋找兩連子的代碼,如下:/ 獲取棋盤當前狀態(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;/ 計數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;/ 記錄了勝負平或者兩連子情況o方走棋時,要得到走棋位置,我們用一個方法來獲取該位置,如下:public int getnextmove(jbutton board) int nextpos = minimax(board, 3);return

21、nextpos;上面方法中調用了極小極大算法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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論