版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 軟件工程</b></p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 題目: 井字棋游戲 </p><p> 二 ○ 一四 年 十二 月一 日</p&
2、gt;<p><b> 課程設(shè)計(jì)題目說明書</b></p><p><b> 第一章 可行性研究</b></p><p><b> 引言</b></p><p><b> 可行性研究目的</b></p><p> 在課程設(shè)計(jì)項(xiàng)目中,
3、井字棋游戲設(shè)計(jì)作為初學(xué)者的我們來說,是個(gè)比較適合和有研究意義的題目。 “井字棋”游戲(又叫“三子棋”),或是一字棋,是一款十分經(jīng)典的益智小游戲,想必很多玩家都有玩過?!熬制濉钡钠灞P很簡(jiǎn)單,是一個(gè)3×3的格子,很像中國(guó)文字中的“井”字,所以得名“井字棋”?!熬制濉庇螒虻囊?guī)則與“五子棋”十分類似,“五子棋”的規(guī)則是一方首先五子連成一線就勝利;“井字棋”是一方首先三子連成一線就勝利。雖然這只是個(gè)很簡(jiǎn)單的小游戲,但作為初學(xué)者的我們
4、認(rèn)識(shí)項(xiàng)目設(shè)計(jì)的技巧與結(jié)構(gòu)及其概念的理解,封裝性、繼承派生、多肽的理解及實(shí)現(xiàn),是比較好的課題。對(duì)我們以后的大型程序的設(shè)計(jì)奠定了基礎(chǔ)。所以作為我們這次的課程設(shè)計(jì)項(xiàng)目來說,我們認(rèn)為是個(gè)很好的、有可研究性的設(shè)計(jì)項(xiàng)目。</p><p> 背景(說明井字棋設(shè)計(jì)背景,開發(fā)目的等)</p><p> 對(duì)于21世紀(jì)的人們來說,游戲日益成為我們生活中必不可少的休閑娛樂工具。為了滿足人們的需要,現(xiàn)在越來越多
5、的人們把游戲作為一種商品對(duì)待,就比如中國(guó),像盛大、網(wǎng)易、滕訊等大型的游戲開發(fā)公司更把游戲的研究看作是一棵搖錢樹,所以游戲程序設(shè)計(jì)人員在未來是不可多得的人才。對(duì)于學(xué)軟件工程的我們來說,一個(gè)優(yōu)秀的程序員也許是我們學(xué)習(xí)的優(yōu)秀目標(biāo),所以在出始階段我們就注重項(xiàng)目設(shè)計(jì)的理念,而且喜歡游戲的我們更希望自己在將來能夠做出一個(gè)自己很滿意且適合市場(chǎng)的游戲來,所以我們這次以這個(gè)為題目就是想熟悉游戲編程的最基礎(chǔ)的設(shè)計(jì)思想和實(shí)現(xiàn)手段的了解,為我們以后打下基礎(chǔ)。雖
6、然井字棋是個(gè)很簡(jiǎn)單的小游戲,基本上人們都不玩了,但是作為一種我們的設(shè)計(jì)項(xiàng)目,我們都覺得是個(gè)很好的且適合的項(xiàng)目。</p><p><b> 可行性研究的前提</b></p><p> 要求(說明井字棋的預(yù)期要求)</p><p> 功能:屏幕輸出棋盤和棋子(可用特殊符號(hào)代替);</p><p> 實(shí)現(xiàn):用戶與電腦下
7、棋(可選)功能和修改。</p><p> 難點(diǎn):判斷輸贏的算法及簡(jiǎn)單的人工智能實(shí)現(xiàn)。</p><p><b> 目標(biāo)</b></p><p> 首先:能做出棋盤的基本樣式。</p><p> 最后:能實(shí)現(xiàn)玩家與電腦的對(duì)弈,最好能做到電腦的智能化。</p><p><b> 評(píng)價(jià)
8、尺度 </b></p><p> 第一:實(shí)現(xiàn)電腦的智能化;第二:做到界面美觀易懂;第三:達(dá)到娛樂的最低水平。</p><p><b> 第二章 需求分析</b></p><p><b> 2.1 任務(wù)概述</b></p><p> 該軟件的設(shè)計(jì)主要是實(shí)現(xiàn)簡(jiǎn)單的三字棋,能做到
9、玩家與玩家之間的對(duì)弈或者玩家與電腦之間的對(duì)弈,可考慮怎樣實(shí)現(xiàn)電腦的智能化。其次,從程序的設(shè)計(jì)過程中理解實(shí)現(xiàn)程序的方法和理念,學(xué)會(huì)怎么樣做到面向?qū)ο笤O(shè)計(jì),理解面向?qū)ο蟮母拍罴敖Y(jié)構(gòu)的封裝性和實(shí)用性,能為以后的設(shè)計(jì)奠定一些良好的基礎(chǔ)。</p><p><b> 2.2對(duì)性能的規(guī)定</b></p><p> 此節(jié)說明軟件的性能要求:</p><p>
10、; 精度: 本程序中按照系統(tǒng)給出的提示,輸入數(shù)字,實(shí)現(xiàn)程序的功能。應(yīng)該注意,輸入的一定只能是數(shù)字,若輸入字母或其他,則出錯(cuò)。</p><p> 時(shí)間特性:由于本程序并不是很龐大,故響應(yīng)時(shí)間短,顯示結(jié)果迅速。</p><p> 故障處理要求:只有在非法輸入是,出現(xiàn)死循環(huán),此時(shí)應(yīng)該退出程序,重新輸入。</p><p> 運(yùn)行環(huán)境規(guī)定運(yùn)行的軟件環(huán)境 :</
11、p><p> windows 7、windowsXP、</p><p> 運(yùn)行該軟件所需要的硬設(shè)備: PC機(jī)一臺(tái)。</p><p><b> 第三章 概要設(shè)計(jì)</b></p><p><b> 3.1 總體設(shè)計(jì)</b></p><p> 3.1.1 基本設(shè)計(jì)概念和處理
12、流程</p><p> 人機(jī)對(duì)弈的難點(diǎn)在于當(dāng)人走一步棋之后,計(jì)算機(jī)如何走下一步,即計(jì)算機(jī)如何找出最合適的位置去走棋。這就需要一定的算法,或者叫做計(jì)算機(jī)的AI。對(duì)于井字棋、五子棋等兩方較量的游戲來說,Minimax算法(極小極大算法)是最基本也是最常用的。算法的原理不在這里解釋了,我們直接看該算法在井字棋中的應(yīng)用。</p><p> 井字棋中,假設(shè)使用“X”的是人,使用“O”的是計(jì)算機(jī)。
13、“X”方先走,設(shè)定X方的最大利益為正無窮(程序使用常量+INFINITY表示),O方的最大利益為負(fù)無窮(程序中使用-INFINITY表示),即X方和O方走的每步棋都要力圖使自己的利益最大化,而使對(duì)方的利益最小化。這樣我們稱X方為MAX(因?yàn)樗偸亲非蟾蟮闹担?,O方為MIN(它總是追求更小的值),各自都為爭(zhēng)取自己的最大獲益而努力?,F(xiàn)在舉例說明,比如圖4所示的棋局樹:</p><p><b> 圖1棋局
14、形成的樹</b></p><p> X方先走,有三種選擇,如圖4中第二層所示。假設(shè)X方選擇最左邊的走法,那么O方接下來將有5種走法,O方會(huì)選擇最小化的走法,即值為-1的走法,因?yàn)樗淖畲罄媸秦?fù)無窮;同理,X方的另外兩種走法會(huì)分別得到O方的最小值1和-2。這樣,對(duì)于X方來說,三種走法會(huì)導(dǎo)致O方最小化值分別為-1、1、-2,X方的最佳策略則是選擇其中最大的,即第二層中間的走法,因?yàn)樗淖畲罄媸钦裏o窮
15、,這就是極小極大算法的體現(xiàn)——X方的選擇總是極大化,O方的選擇總是極小化。</p><p> 對(duì)于其中那些值的是如何計(jì)算的,我們舉例說明,比如對(duì)于第三層最左邊的棋局,在這種狀態(tài)下,如果把棋局空白處都填上X,則X共有6中3連子情況,即獲勝情況;如果把空白處都填上O,則O共有5種3連子情況,所以結(jié)果是二者相減等于1。</p><p> 在具體走起過程中,MAX面對(duì)MIN最大獲利中的最小值時(shí)
16、,會(huì)選擇其中最大的,比如圖4第二層小括號(hào)內(nèi)的值都是第三層中能使MIN最大獲利的最小值,這時(shí)候MAX選擇其中最大的,這對(duì)MAX最為有利,所以MAX方選擇圖4第二層中間的走法最好。同樣道理,MIN也會(huì)一樣,選擇對(duì)自己最有利的,即MAX有可能獲得的最大值。這時(shí)候,MIN在走棋時(shí)會(huì)考慮MAX方占據(jù)哪個(gè)位置對(duì)MAX最有利,然后MIN把這個(gè)位置先占了。有點(diǎn)難理解,其實(shí)就是搶先把對(duì)對(duì)手有利的位置搶占了。</p><p> 簡(jiǎn)
17、單說,X方或者M(jìn)AX方的走棋時(shí)由人來控制的,我們不仔細(xì)說了。對(duì)于O方或者M(jìn)IN方,它走棋時(shí)要考慮哪個(gè)位置對(duì)X方最有利,然后把該位置占據(jù),即O的最佳走棋就是X的最佳走棋。所以O(shè)在走棋之前,先站在X的角度尋找最佳走棋位置。后文中minimax方法就是站在X角度來考慮極小極大算法,找到X的最佳走棋位置,然后由O方來占據(jù)該位置。</p><p><b> 2、極小極大算法</b></p>
18、;<p> 整個(gè)算法包括如下幾個(gè)部分:</p><p> 首先要有一個(gè)評(píng)估方法gameState,對(duì)每走一步棋后的棋局進(jìn)行評(píng)估,估值為WIN常量說明X方,即MAX方獲勝;估值為L(zhǎng)OSE則O方,即MIN方獲勝;估值DRAW為平局;估值為INPROGRESS,說明棋未走完;估值為DOUBLE_LINK,說明棋局中有兩連子情況</p><p> 然后用一個(gè)minimax方法尋
19、找在當(dāng)前棋局狀態(tài)下X方的最佳位置, X方的最佳位置就是當(dāng)X走該位置后,O方所有走法中最小值里的最大值,比如圖4中第二層X 的位置選擇。當(dāng)找到該位置后,由O方來搶先占據(jù)該位置。</p><p> 最后用兩個(gè)遞歸方法min和max來遍歷所有的棋局。min方法負(fù)責(zé)找出O方的最小值,比如圖1第二層最左邊的棋局會(huì)導(dǎo)致5中O方的走法,min方法就是找出這5種走法中的最小值。同理,max方法負(fù)責(zé)找出X方的最大值,比如圖1第二
20、層三種棋局中的中間棋局。</p><p> 3.1.2功能需求與程序的關(guān)系</p><p> ?。保?jì)算機(jī)為一方,人為一方,交替下棋,誰先連成一條直線誰勝;允許人選擇先下還是后下。 </p><p> 2.界面要求:初始狀態(tài)——顯示棋盤,并顯示玩家的操作鍵;游戲進(jìn)行狀態(tài)——?jiǎng)討B(tài)顯示棋盤不同玩家的棋子用不同符號(hào)顯示,屏幕上顯示當(dāng)前玩家號(hào),結(jié)束時(shí)顯示贏家號(hào)。 &l
21、t;/p><p> 3.提示計(jì)算機(jī)自動(dòng)下棋的規(guī)則:計(jì)算機(jī)下時(shí),應(yīng)考慮所有空位,并按行、列、對(duì)角線計(jì)算每個(gè)空位的分值,若在某行(列、對(duì)角線)上,(設(shè)計(jì)算機(jī)畫X,人畫O) </p><p> 已有XX 加50分 </p><p> 已有OO 加25分 </p><p> 已有X空 加10分 </p>
22、<p> 已有O空 加8分 </p><p> 都是空 加4分 然后選分值最高的位置畫X。</p><p> 3.2 系統(tǒng)出錯(cuò)處理設(shè)計(jì)</p><p> (1)違規(guī)輸入字符,程序可能會(huì)出現(xiàn)死循環(huán)或者直接結(jié)束程序。</p><p> ?。?)規(guī)則里面所定義的若有錯(cuò)誤輸入,則會(huì)根據(jù)程序的提示重新輸入。</p
23、><p><b> 3.3 性能</b></p><p> 1.程序耗費(fèi)電腦內(nèi)存和CPU開銷很小。</p><p> 2.玩家與電腦對(duì)戰(zhàn)時(shí)AL的智能很高。</p><p> 3.可以選擇電腦難度,適合各種水平的玩家。</p><p> 4.游戲界面比較美觀,親近,方便大眾接受。</p
24、><p><b> 3.4 程序設(shè)計(jì):</b></p><p> // 按鈕的監(jiān)聽事件</p><p> private class JBClick implements ActionListener {</p><p><b> // 當(dāng)單擊按鈕時(shí)</b></p><p&g
25、t; public void actionPerformed(ActionEvent e) {</p><p> for (int i = 0; i < 9; i++) {</p><p> if (e.getSource() == jb[i]) { jb[i].setText("X"); // 被單擊的按鈕走“X”</p>&l
26、t;p> jb[i].setEnabled(false); //置為不可用</p><p><b> }</b></p><p><b> }</b></p><p> int gamestate = gameState(jb); // 獲取棋盤狀態(tài)</p><p> // 如果棋局
27、未結(jié)束,則計(jì)算機(jī)走下一步</p><p> if (!(gamestate == WIN || gamestate == LOSE || gamestate == DRAW)) {</p><p> int nextpos = getNextMove(jb); // 獲取下一步走棋位置</p><p> jb[nextpos].setText("O&
28、quot;); // 走棋“O”</p><p> jb[nextpos].setEnabled(false);</p><p> gamestate = gameState(jb); // 獲取最新的棋盤狀態(tài)</p><p><b> }</b></p><p><b> // 輸出棋局勝負(fù)</
29、b></p><p> switch (gamestate) {</p><p><b> case WIN:</b></p><p> JOptionPane.showMessageDialog(null, "X方獲勝", "提示",JOptionPane.DEFAULT_OPTION);
30、</p><p><b> break;</b></p><p> case LOSE:</p><p> JOptionPane.showMessageDialog(null, "O方獲勝", "提示",JOptionPane.DEFAULT_OPTION);</p><p&g
31、t;<b> break;</b></p><p> case DRAW:</p><p> JOptionPane.showMessageDialog(null, "平局", "提示",JOptionPane.DEFAULT_OPTION);</p><p><b> break;&l
32、t;/b></p><p><b> }</b></p><p> // 如果結(jié)束,則提示</p><p> if (gamestate == WIN || gamestate == LOSE || gamestate == DRAW) {</p><p> int over = JOptionPane&l
33、t;/p><p> .showConfirmDialog(null, "是否再來一局?", "提示", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);</p><p> if (over == JOptionPane.YES_OPTION) {// 再來一局
34、for (int i = 0; i < 9; i++) {</p><p> jb[i].setText(" ");</p><p> jb[i].setEnabled(true);</p><p><b> }</b></p><p><b> } else {</
35、b></p><p> System.exit(0); // 退出游戲</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b&
36、gt;</p><p> 然后,獲取棋局狀態(tài)的方法加入尋找兩連子的代碼,如下:</p><p> // 獲取棋盤當(dāng)前狀態(tài)</p><p> public int gameState(JButton[] jb) {</p><p> int result = INPROGRESS;</p><p> boole
37、an isFull = true;</p><p> // 判斷棋盤是否已滿</p><p> for (int pos = 0; pos < 9; pos++) {</p><p> char chess = jb[pos].getText().charAt(0);</p><p> if (empty == chess) {
38、</p><p> isFull = false;</p><p><b> }</b></p><p><b> }</b></p><p> // 尋找三連子情況</p><p> for (int[] status : WIN_STATUS) {// 遍歷8中
39、棋局獲勝狀態(tài)</p><p> // 得到某個(gè)獲勝棋局狀態(tài)的第一個(gè)索引的字符</p><p> char chess = jb[status[0]].getText().charAt(0);</p><p> // 如果為空,說明此處未下棋子,跳出循環(huán),找下一個(gè)狀態(tài)</p><p> if (chess == empty) {<
40、/p><p><b> continue;</b></p><p><b> }</b></p><p><b> int i;</b></p><p> for (i = 1; i < status.length; i++) {// 查看其余兩個(gè)字符</p&g
41、t;<p> if (jb[status[i]].getText().charAt(0) != chess) { // 不與第一個(gè)索引字符一致</p><p> break; // 表明未三子連線,跳出</p><p><b> }</b></p><p><b> }</b></p>
42、<p> if (i == status.length) { // 三子連線</p><p> result = chess == 'X' ? WIN : LOSE;</p><p><b> break;</b></p><p><b> }</b></p><p&g
43、t;<b> }</b></p><p> // 尋找兩連子情況</p><p> if (result != WIN & result != LOSE) {</p><p> if (isFull) {</p><p> result = DRAW;//不輸不贏且棋盤滿則為平</p>
44、<p><b> } else {</b></p><p> int[] finds = new int[2];// 存放X或O的兩連子情況</p><p> for (int[] status : WIN_STATUS) {</p><p> char chess = empty;</p><p>
45、 boolean hasEmpty = false;</p><p> int count = 0;// 計(jì)數(shù)</p><p> for (int i = 0; i < status.length; i++) {</p><p> if (jb[status[i]].getText().charAt(0) == empty) {</p>
46、<p> hasEmpty = true;// 該處沒有棋子</p><p><b> } else {</b></p><p> if (chess == empty) {// 有棋子</p><p> chess = jb[status[i]].getText().charAt(0);</p><p
47、><b> }</b></p><p> if (jb[status[i]].getText().charAt(0) == chess) {</p><p> count++;//且棋子相同則加1</p><p><b> }</b></p><p><b> }<
48、/b></p><p><b> }</b></p><p> if (hasEmpty && count > 1) {</p><p> if (chess == 'X') {</p><p> finds[0]++;</p><p><
49、b> } else {</b></p><p> finds[1]++;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b>
50、// 兩連子情況</b></p><p> if (finds[1] > 0) {// O的兩連子</p><p> result = -DOUBLE_LINK;</p><p> } else if (finds[0] > 0) {// X的兩連子</p><p> result = DOUBLE_LIN
51、K;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> return result;// 記錄了勝負(fù)平或者兩連子情況</p><p><b> }&l
52、t;/b></p><p> O方走棋時(shí),要得到走棋位置,我們用一個(gè)方法來獲取該位置,如下:</p><p> public int getNextMove(JButton[] board) {</p><p> int nextPos = minimax(board, 3);</p><p> return nextPos;&
53、lt;/p><p><b> }</b></p><p> 上面方法中調(diào)用了極小極大算法minimax,如下:</p><p> //以'X'的角度來考慮的極小極大算法</p><p> public int minimax(JButton[] board, int depth) {</p>
54、;<p> int[] bestMoves = new int[9];//存放最佳走棋位置</p><p> int index = 0;</p><p> int bestValue = -INFINITY;</p><p> // 搜索所有空位,試探填上X,然后選其中最小值的</p><p> for (int
55、 pos = 0; pos < 9; pos++) {</p><p> if (board[pos].getText().charAt(0) == empty) {</p><p> board[pos].setText("X");</p><p> int value = min(board, depth);// 得到最小值<
56、;/p><p> if (value > bestValue) {// 選擇最小值里最大的</p><p> bestValue = value;</p><p> index = 0;</p><p> bestMoves[index] = pos;</p><p> } else if (value =
57、= bestValue) {</p><p><b> index++;</b></p><p> bestMoves[index] = pos;</p><p><b> }</b></p><p> board[pos].setText(" ");</p>
58、<p><b> }</b></p><p><b> }</b></p><p> return bestMoves[index];</p><p><b> }</b></p><p> 最后,兩個(gè)遞歸方法min和max如下:</p>
59、<p> //對(duì)于'O',估值越小對(duì)其越有利</p><p> public int min(JButton[] board, int depth) {</p><p> int evalValue = gameState(board);</p><p> boolean isGameOver = (evalValue == WIN
60、 || evalValue == LOSE || evalValue == DRAW);</p><p> if (depth == 0 || isGameOver) {</p><p> return evalValue;</p><p><b> }</b></p><p> int bestValue
61、= INFINITY;</p><p> for (int pos = 0; pos < 9; pos++) {</p><p> if (board[pos].getText().charAt(0) == empty) {</p><p> board[pos].setText("O");</p><p>&
62、lt;b> // 選擇最小值</b></p><p> bestValue = Math.min(bestValue, max(board, depth - 1));</p><p> board[pos].setText(" ");</p><p><b> }</b></p>&l
63、t;p><b> }</b></p><p> return evalValue;</p><p><b> }</b></p><p> //對(duì)于'X',估值越大對(duì)其越有利</p><p> public int max(JButton[] board, int d
64、epth) {</p><p> int evalValue = gameState(board);</p><p> boolean isGameOver = (evalValue == WIN || evalValue == LOSE || evalValue == DRAW);</p><p> if (depth == 0 || isGameOver)
65、 {</p><p> return evalValue;</p><p><b> }</b></p><p> int bestValue = -INFINITY;</p><p> for (int pos = 0; pos < 9; pos++) {</p><p> if
66、 (board[pos].getText().charAt(0) == empty) {</p><p> board[pos].setText("X");</p><p><b> // 選擇最大值</b></p><p> bestValue = Math.max(bestValue, min(board, dep
67、th - 1))board[pos].setText(" ");</p><p><b> }</b></p><p><b> }</b></p><p> return evalValue;</p><p><b> }</b></p
68、><p><b> 第五章 測(cè)試分析 </b></p><p> 本程序的功能非常明顯:#字棋。</p><p> 本程序提供1種對(duì)戰(zhàn)模式:玩家VS電腦。</p><p> 玩家和電腦對(duì)戰(zhàn)時(shí)選擇難度和誰先手,玩家很容易贏簡(jiǎn)單的電腦,但是贏中等的電腦很困難,至于和困難的電腦對(duì)戰(zhàn)幾乎贏不了。程序目前之發(fā)現(xiàn)一處BUG,那就
69、是當(dāng)玩家輸入非數(shù)字字符時(shí)程序會(huì)結(jié)束或者陷入死循環(huán)。</p><p> 通過測(cè)試,發(fā)現(xiàn)以下一些不足的地方:</p><p> 電腦不夠完全智能,只能按照指定的步驟來進(jìn)行選擇。</p><p> 如果玩家不小心輸入錯(cuò)誤,那么程序直接結(jié)束或者陷入死循環(huán)。、</p><p><b> 第六章 用戶手冊(cè)</b></p
70、><p> 使用軟件的方法及注意事項(xiàng)</p><p> 1、本程序在輸入的時(shí)候只能輸入0~9數(shù)字,請(qǐng)不要輸入其他字符,不然會(huì)造成死循環(huán)或者程序直接結(jié)束。</p><p> 2、本程序在輸入后請(qǐng)回車以確定。</p><p><b> 第七章 總結(jié)</b></p><p> 在本程序中的井字棋程
71、序使用了極大極小值算法,這種算法的思想是“考慮雙方對(duì)弈若干步之后,從可能的走法中選一步相對(duì)較好的走法來走”,并且“在有限的搜索深度范圍內(nèi)進(jìn)行求解”。最大最小值算法的核心是將搜索樹的層分為MAX層和MIN層,MAX層和MIN層交替相鄰(即,一個(gè)節(jié)點(diǎn)如果在MAX層,則其子女節(jié)點(diǎn)在MIN層;如果在MIN層,則其子女節(jié)點(diǎn)中的最大者,在MIN層的節(jié)點(diǎn)的評(píng)估函數(shù)值取其子女節(jié)點(diǎn)中的最小者。 此外,需要定義一個(gè)評(píng)估函數(shù)來計(jì)算葉節(jié)點(diǎn)的評(píng)估函數(shù)值
72、,要注意將某方獲勝的狀態(tài)節(jié)點(diǎn)的評(píng)估函數(shù)值設(shè)為計(jì)算機(jī)能表示的最大數(shù)(無窮大)或最小數(shù)(無窮小)以表明在該狀態(tài)下有一方獲勝。 最后,還要“在有限的搜索深度范圍內(nèi)進(jìn)行求解”,如果搜索深度太大,則在狀態(tài)數(shù)較多的情況下會(huì)使時(shí)間耗費(fèi)或空間耗費(fèi)達(dá)到無法忍受的程度。</p><p> 本設(shè)計(jì)中的程序的博弈算法采用的是極大極小值算法,如果采用α-β剪枝算法,則可以在一定程度上減少博弈樹的節(jié)點(diǎn)數(shù)。假設(shè)一棵樹的深度為d,且
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四子棋課程設(shè)計(jì)報(bào)告
- 五子棋-課程設(shè)計(jì)報(bào)告
- c語言課程設(shè)計(jì)報(bào)告五子棋游戲課程設(shè)計(jì)
- java課程設(shè)計(jì)報(bào)告-五子棋
- 五子棋游戲課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--四子棋
- 五子棋畢業(yè)課程設(shè)計(jì)報(bào)告
- 五子棋java語言課程設(shè)計(jì)報(bào)告
- c++五子棋課程設(shè)計(jì)報(bào)告
- 五子棋課程設(shè)計(jì)
- c語言圖形五子棋課程設(shè)計(jì)報(bào)告
- c語言圖形五子棋課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告---java 五子棋游戲設(shè)計(jì)
- 人工智能課程設(shè)計(jì)報(bào)告-五子棋
- 同步tcp網(wǎng)絡(luò)五子棋-課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告---單機(jī)版五子棋
- java五子棋課程設(shè)計(jì)
- java課程設(shè)計(jì)--五子棋
- 五子棋java課程設(shè)計(jì)
- 五子棋java課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論