版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 學(xué)生畢業(yè)論文</b></p><p> 題 目: 連珠五子棋的編程與制作 </p><p> 作 者: </p><p> 指導(dǎo)教師: </p><p> 電子信息工程 學(xué)院 計(jì)算機(jī) 系</p><p> 軟件技術(shù) 專
2、業(yè) 07 級(jí)</p><p> 三 年制 1 班</p><p> 2009年 12 月 9 日</p><p><b> 目錄</b></p><p><b> 目錄2</b></p><p><b> 主要內(nèi)容
3、簡(jiǎn)介:3</b></p><p><b> 1 引言4</b></p><p> 1.1 五子棋介紹4</p><p> 1.2 開發(fā)背景4</p><p> 1.3 開發(fā)環(huán)境及運(yùn)行環(huán)境5</p><p> 1.3.1 開發(fā)環(huán)境5</p><p
4、> 1.3.2 運(yùn)行環(huán)境5</p><p><b> 2 軟件架構(gòu)5</b></p><p> 3 系統(tǒng)需求分析6</p><p> 4、系統(tǒng)流程及模塊劃分7</p><p><b> 4.1 棋盤類7</b></p><p> 4.2 游戲模式類
5、8</p><p> 4.3、人工智能模塊14</p><p> 4.4、聲音播放模塊25</p><p><b> 結(jié)論28</b></p><p><b> 參考文獻(xiàn):29</b></p><p><b> 致謝30</b>&l
6、t;/p><p> 連珠五子棋的編程與制作</p><p><b> 陳濤</b></p><p> ?。ǜ拭C聯(lián)合大學(xué)電子信息工程學(xué)院07軟件技術(shù)專業(yè),甘肅 蘭州730000)</p><p> 摘 要:當(dāng)前網(wǎng)絡(luò)上流傳的五子棋游戲功能并不盡善盡美,其中最主要的問(wèn)題就是人機(jī)對(duì)戰(zhàn)和玩家對(duì)戰(zhàn)不能夠一起實(shí)現(xiàn),所以我決定開發(fā)一
7、個(gè)既能夠人機(jī)對(duì)戰(zhàn),玩家對(duì)戰(zhàn)。下面就對(duì)連珠五子棋的各模塊內(nèi)的耦合與模塊間的內(nèi)聚進(jìn)行分析。主要是各模塊的實(shí)現(xiàn)全過(guò)程進(jìn)行詳細(xì)的分解講述。</p><p> 關(guān)鍵字:圖形界面;人工智能;聲音</p><p><b> 1 引言</b></p><p><b> 1.1 五子棋介紹</b></p><p&g
8、t; 五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一?,F(xiàn)代五子棋日文稱之為“連珠”,英譯為“Renju”,英文稱之為“Gobang”或“FIR”(Five in a Row的縮寫),亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱謂。</p><p> 五子棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快”,又有古典哲學(xué)的高深學(xué)問(wèn)“陰
9、陽(yáng)易理”;它既有簡(jiǎn)單易學(xué)的特性,為人民群眾所喜聞樂(lè)見,又有深?yuàn)W的技巧和高水平的國(guó)際性比賽;它的棋文化源淵流長(zhǎng),具有東方的神秘和西方的直觀;既有“場(chǎng)”的概念,亦有“點(diǎn)”的連接。它是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。</p><p><b> 1.2 開發(fā)背景</b></p><p> 當(dāng)前網(wǎng)絡(luò)上流傳的五子棋游戲功能并不盡善盡美,其中最主要的問(wèn)題就是人機(jī)對(duì)戰(zhàn)和玩家對(duì)
10、戰(zhàn)不能夠一起實(shí)現(xiàn),所以我決定開發(fā)一個(gè)既能夠人機(jī)對(duì)戰(zhàn),玩家對(duì)戰(zhàn)。</p><p> 1.3 開發(fā)環(huán)境及運(yùn)行環(huán)境</p><p> 1.3.1 開發(fā)環(huán)境</p><p> ADM Athlon(tm) 64 X2 1.9GHz,2G內(nèi)存,250G硬盤</p><p> Microsoft® Windows 7 旗艦版</p
11、><p> JDK-1_6_0_04-windows-i586-p</p><p> Eclipse-SDK-3.2.1</p><p> Myeclipse6.0-Myclipse5.5</p><p> 1.3.2 運(yùn)行環(huán)境</p><p> Intel® Pentium® 2及以上處理器
12、,32M以上內(nèi)存,4G以上硬盤</p><p> Microsoft® Windows? 9X/NT操作系統(tǒng)</p><p> 800*600或以上的屏幕分辨率</p><p><b> 安裝JVM虛擬機(jī)</b></p><p><b> 2 軟件架構(gòu)</b></p>
13、<p> 圖1.軟件的總體架構(gòu)</p><p> 考慮到整個(gè)的下棋過(guò)程可以分為:玩家一對(duì)戰(zhàn)玩家二、玩家對(duì)戰(zhàn)電腦,設(shè)置己方棋盤數(shù)據(jù)這一系列過(guò)程。</p><p><b> 3 系統(tǒng)需求分析</b></p><p><b> 棋盤類基本功能分析</b></p><p> 棋盤類是整
14、個(gè)系統(tǒng)的核心部分,它除了負(fù)責(zé)繪制棋盤和棋子之外,還封裝了人機(jī)對(duì)弈所需的人工智能算法,例如下一步的最優(yōu)落子位置、判斷勝負(fù)等。</p><p> 總的來(lái)說(shuō),人工智能算法就是要讓電腦知道在哪一點(diǎn)下子,這就需要根據(jù)棋盤的優(yōu)勢(shì),為每一可落子的點(diǎn)計(jì)算其重要程度,也就是當(dāng)著子落下后會(huì)形成什么樣的棋型(如“沖四”、“活三”等),然后統(tǒng)攬全盤選出最重要的一點(diǎn),這便是最基本的算法思想。當(dāng)然,僅依靠當(dāng)前盤面進(jìn)行判斷是遠(yuǎn)遠(yuǎn)不夠的,這樣
15、下棋很容易掉進(jìn)對(duì)方預(yù)先設(shè)下的陷阱,因?yàn)樗麤]有考慮以后的變化,所以在此基礎(chǔ)上加入遞歸調(diào)用,及在電腦中預(yù)測(cè)出今后幾步的各種走法,以便作出最佳選擇。</p><p> 下面是五子棋人工智能部分的核心算法。</p><p> 首先是數(shù)據(jù)結(jié)構(gòu):建立一張表用已記錄棋子信息,這里使用一個(gè)15*15(15*15是五子棋棋盤的大小)的二位數(shù)組Table[15][15],數(shù)組的每一個(gè)元素對(duì)應(yīng)棋盤上的一個(gè)交
16、叉點(diǎn),用0表示空位、1代表己方的子、2代表對(duì)方棋子。這張表也是盤面分析的基礎(chǔ)。</p><p> 此外還要為電腦和玩家雙方各建立一張棋型表Computer[15][15][4]和player[15][15][4],用來(lái)存放棋型數(shù)據(jù),代表點(diǎn)的重要程度,比如用20代表“沖四”的點(diǎn),用15代表“活三”的點(diǎn)。那么在計(jì)算機(jī)的重要性時(shí),就可以根據(jù)20>15得出前者比后者重要,落子時(shí)電腦自動(dòng)選擇“沖四”的點(diǎn),那為什么棋
17、型表要選三位數(shù)組呢?棋盤上的每一個(gè)點(diǎn)都可以與橫、豎、左斜、右斜四個(gè)方向的棋子構(gòu)成不同的棋型,所以一點(diǎn)共有四個(gè)記錄;這樣做的另一個(gè)好處是可以輕易判斷出復(fù)合棋型,例如:如果同一點(diǎn)有兩個(gè)15就表示“雙三”,有一個(gè)15一個(gè)20就表示“四三”。</p><p> 這些數(shù)組結(jié)構(gòu)構(gòu)成程序的基本構(gòu)架,下面將討論深入到算法中。</p><p> 人工智能算法的核心是進(jìn)行盤面分析,填寫棋型表,其具體實(shí)現(xiàn)方
18、法如下:</p><p> 先分析己方的棋型,算法從棋盤的左上角出發(fā),向右逐行搜索,但遇到一個(gè)空白點(diǎn)時(shí),以它為中心向左挨個(gè)查找,如果遇到己方棋子則記錄后繼續(xù)查找,如果遇到對(duì)方棋子、空白點(diǎn)或邊界就停止查找。左邊完成后再向右進(jìn)行同樣的操作,最后把左右兩邊的記錄合并起來(lái)得到的數(shù)據(jù)就是橫向上的棋型,然后把棋型的編號(hào)填寫到Computer[x][y][n]中(x,y代表坐標(biāo),n=0、1、2、3分別代表橫、豎、左斜、右斜四
19、個(gè)方向),而其他三個(gè)方向上的棋型也用相同的方法得到。當(dāng)搜索完整個(gè)棋盤后,己方棋型表也就填寫完畢了,然后用同樣的方法填寫棋型表。</p><p> 有了上面填寫的兩張棋型表,現(xiàn)在要做的就是讓電腦知道在哪一點(diǎn)下子。其中最簡(jiǎn)單的方法就是便利棋型表Computer[15][15][4]和Player[15][15][4],找出其中數(shù)值最大的一點(diǎn),在該點(diǎn)下子即可。但是這種算法的弱點(diǎn)非常明顯,只顧眼前的利益,不能顧全大局。
20、</p><p> 為了解決這個(gè)問(wèn)題這里引入了“今后幾步預(yù)測(cè)法”具體方法是這樣的。</p><p> 讓電腦分析一個(gè)可能的弱點(diǎn),如果在某個(gè)位置下子將會(huì)形成對(duì)手不得不防守的棋型(例如:“沖四”、“活三”):那么下一步對(duì)手就必須照你的思路下子防守,如此便完成了第一步的預(yù)測(cè)。</p><p> 重新調(diào)用棋型表填寫算法對(duì)預(yù)測(cè)后的棋進(jìn)行盤面分析,如果出現(xiàn)了“四三”、“雙
21、三”或“雙四”等制勝點(diǎn),那么己方就可以獲勝了;否則按照同樣的方法向下分析,就可以預(yù)測(cè)出第二步、第三步等。</p><p> 但是要是盤面上沒有沒有對(duì)手防的棋型,那該怎么辦呢?進(jìn)攻不成不成就得考慮防守,將自己和對(duì)手調(diào)換位置,然后用上面的方法來(lái)預(yù)測(cè)對(duì)手的棋。這樣既可以防守住對(duì)方巧妙地攻擊,又能待機(jī)發(fā)動(dòng)反擊。</p><p> 4、系統(tǒng)流程及模塊劃分</p><p>
22、 根據(jù)上面的需求分析,將系統(tǒng)分為以下幾個(gè)模塊。</p><p> 初始化模塊:建立棋盤數(shù)組Table[15][15]、對(duì)戰(zhàn)雙方棋型表Computer[15][15][4]和Player[15][15][4]并將它們清零以備使用;然后初始化鍵盤、鼠標(biāo)等輸入/輸出設(shè)備并在屏幕上畫出棋盤。</p><p> 主循環(huán)控制模塊:負(fù)責(zé)控制下棋順序,當(dāng)輪到某方下子時(shí),負(fù)責(zé)將程序流程轉(zhuǎn)到相應(yīng)的模塊中
23、,主要擔(dān)當(dāng)一個(gè)調(diào)度者的角色。</p><p> 玩家落子模塊:當(dāng)輪到玩家下子時(shí),通過(guò)鍵盤或鼠標(biāo)在棋盤上落子,程序會(huì)根據(jù)該點(diǎn)的位置,在Table[15][15]數(shù)組的相應(yīng)地方記錄2,以表明該子是玩家下的。</p><p> 分析盤面棋型表模塊:本程序核心模塊之一,人工智能算法的根本依據(jù)。</p><p> 勝負(fù)判斷模塊:根據(jù)預(yù)先設(shè)定的規(guī)則判斷游戲勝負(fù)。</
24、p><p><b> 4.1 棋盤類</b></p><p> 整個(gè)架構(gòu)的核心部分,類名為BoardPanel。封裝了棋盤的各種可能用到的功能,如繪制棋盤、初始化、判斷勝負(fù),人工智能落子等。用戶操作主界面,主界面與ChessWZQ進(jìn)行交互來(lái)完成對(duì)游戲的操作。</p><p> 五子棋主界面由輕組件Swing編寫而成,封裝在ChessWZQ中,
25、在JFrame窗體上由菜單條、棋盤、標(biāo)簽三部分組成</p><p><b> Java圖形編程</b></p><p> Java中的Graphics類適用于繪圖和顯示格式化文本的工具類。在java程序中繪圖必須在一個(gè)窗口(容器)中進(jìn)行,繪圖窗口經(jīng)常被設(shè)計(jì)成為一個(gè)組件容器。一般首先在一個(gè)面板中進(jìn)行繪制,然后再將這個(gè)面板添加到顯示窗口中。</p>&l
26、t;p> Graphics類是在java.awt包中聲明,顯示格式化文本和繪圖是通過(guò)調(diào)用Graphics類的drawXXX()方法實(shí)現(xiàn)的,例如drawSting(String),drawline()等。繪圖采用的坐標(biāo)系是原點(diǎn)在左上角,縱軸向下以像素為單位的坐標(biāo)系。</p><p> 下面是Grapics類中常用的各種圖形的繪制方法。</p><p> Drawline(int,
27、int,int,int)畫直線,參數(shù)為起點(diǎn)的x和y坐標(biāo)、終點(diǎn)的x和y坐標(biāo)</p><p> DrawRect(int,int,int,int)畫矩形,參數(shù)左上角的x和y坐標(biāo)、寬、高</p><p> DrawlRoundRect(int,int,int,int,int,int)畫圓角矩形,參數(shù)為參數(shù)左上角的x和y坐標(biāo)、x寬、y高、x深度、y深度</p><p>
28、 Drawl3DRect(int,int,int,int,boolean)畫3D矩形,參數(shù)為參數(shù)左上角的x和y坐標(biāo)、x寬、y高、ture</p><p> DrawOval(int,int,int,int)畫卵形,參數(shù)為起點(diǎn)的x和y坐標(biāo)、長(zhǎng)軸和短軸</p><p> 畫填充圖形都是選用當(dāng)前的顏色來(lái)繪制和填充的,黑色是系統(tǒng)默認(rèn)的顏色,也可以使用Grapics類中的SetColor()來(lái)
29、設(shè)定繪圖的顏色。</p><p> 本系統(tǒng)的棋盤類中,棋盤和棋子都是通過(guò)Grapics類完成的,具體代碼如下:</p><p> public void paint(Graphics gc){</p><p> super.paint(gc);</p><p> gc.setColor(Color.blue);</p>
30、<p> gc.drawString(line,25,15);</p><p> for(int i=0;i<9;i++){</p><p> gc.drawChars(rowNum1,i,1,10,35+i*30);</p><p><b> }</b></p><p> for(int i=
31、9,j=0;i<15;i++,j+=2){</p><p> gc.drawChars(rowNum2,j,2,10,35+i*30);</p><p><b> }</b></p><p><b> // 繪制棋盤</b></p><p> for (int i = 0; i <
32、; 15; i++) {</p><p> gc.drawLine(30, 30 + i * 30, 450, 30 + i * 30); //繪制棋盤的行線</p><p> gc.drawLine(30 + i * 30, 30, 30 + i * 30, 450); //繪制棋盤的列線</p><p><b> }</b></
33、p><p> gc.drawLine(25, 25, 455, 25);</p><p> gc.drawLine(25, 25, 25, 455);</p><p> gc.drawLine(25, 455, 455, 455);</p><p> gc.drawLine(455, 25, 455, 455);</p>&
34、lt;p> //當(dāng)窗體被重畫時(shí),將繪制出棋盤重畫之前的狀態(tài)</p><p> for(int i=0;i<15;i++){</p><p> for (int j = 0; j < 15; j++) {</p><p> xp=16+i*30;</p><p> yp=16+j*30;</p><
35、;p> if (board[i][j] == 1){</p><p> gc.setColor(Color.black);</p><p> gc.fillOval(xp,yp,28,28);</p><p><b> }</b></p><p> if (board[i][j] == 2){</p
36、><p> gc.setColor(Color.white);</p><p> gc.fillOval(xp,yp,28,28);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>&
37、lt;/p><p><b> 4.2 游戲模式類</b></p><p> 用來(lái)管理人機(jī)對(duì)弈/玩家對(duì)弈兩種游戲模式,類名為ChessWZQ。ChessWZQ封裝了圖形界面的各種可能用到的功能[3],如主控界面、人機(jī)對(duì)弈棋型表繪制等</p><p> 人工智能算法的核心是進(jìn)行盤面分析,填寫棋型表,其具體實(shí)現(xiàn)方法如下:</p>&l
38、t;p> 先分析己方的棋型,算法從棋盤的左上角出發(fā),向右逐行搜索,但遇到一個(gè)空白點(diǎn)時(shí),以它為中心向左挨個(gè)查找,如果遇到己方棋子則記錄后繼續(xù)查找,如果遇到對(duì)方棋子、空白點(diǎn)或邊界就停止查找。左邊完成后再向右進(jìn)行同樣的操作,最后把左右兩邊的記錄合并起來(lái)得到的數(shù)據(jù)就是橫向上的棋型,然后把棋型的編號(hào)填寫到Computer[x][y][n]中(x,y代表坐標(biāo),n=0、1、2、3分別代表橫、豎、左斜、右斜四個(gè)方向),而其他三個(gè)方向上的棋型也用
39、相同的方法得到。當(dāng)搜索完整個(gè)棋盤后,己方棋型表也就填寫完畢了,然后用同樣的方法填寫棋型表。</p><p><b> 具體代碼如下:</b></p><p> public void ptoComputer(){</p><p> int x=0,y=0;</p><p> int position;</p
40、><p> if(pFirst==false){</p><p><b> x=7;</b></p><p><b> y=7;</b></p><p> bpanel.updateBoard(x,y);</p><p> bpanel.drawChess(x,y);&
41、lt;/p><p> beginFlag=true;</p><p><b> }else{</b></p><p> beginFlag=true;</p><p><b> }</b></p><p><b> }</b></p>
42、<p><b> /**</b></p><p> * 選擇最優(yōu)位置落子</p><p><b> */</b></p><p> private void cPutChess(int x,int y){</p><p> setRect(x,y);</p>&l
43、t;p> setWeight(x,y,pColor);</p><p> getBetter(3);</p><p><b> }</b></p><p><b> /**</b></p><p> * 設(shè)定一個(gè) 9*9的矩形</p><p><b>
44、; */</b></p><p> private void setRect(int x,int y){</p><p> if(x-4>0) RectX1=x-4;</p><p> else RectX1=0;</p><p> if(x+4>14) RectX2=14;</p>
45、<p> else RectX2=x+4;</p><p> if(y-4>0) RectY1=y-4;</p><p> else RectY1=0;</p><p> if(y+4>14) RectY2=14;</p><p> else RectY2=y+4;&l
46、t;/p><p> if(RectX1>RectY1) RectX1 = x-(y-RectY1);</p><p> else RectY1 = y-(x-RectX1);</p><p> if(RectX2>RectY2) RectY2 = y+(RectX2-x);</p><p> else
47、 RectX2 = x+(RectY2-y);</p><p><b> }</b></p><p><b> /**</b></p><p> * 在棋盤中中設(shè)置每一個(gè)黑色棋子的權(quán)重</p><p><b> */</b></p>
48、<p> private void setWeight(int x,int y,int tcolor){</p><p> int i=RectX1,j=RectY1,value=0,k=0,n=0,flag=0;</p><p><b> // X軸方向</b></p><p> for(i=RectX1,j=y;i&l
49、t;=RectX2;i++){</p><p> if(BoardPanel.board[i][j]!=0){</p><p><b> continue;</b></p><p><b> }</b></p><p> value=0;flag=0;</p><p>
50、; for(k=1;i-k>=RectX1 && k<5;k++){</p><p> if(BoardPanel.board[i-k][j]==tcolor){</p><p><b> value++;</b></p><p><b> continue;</b></p>
51、<p><b> }</b></p><p> if(BoardPanel.board[i-k][j]==0){//black space</p><p><b> flag++;</b></p><p><b> break;</b></p><p>&
52、lt;b> }</b></p><p><b> }</b></p><p> for(k=1;i+k<RectX2 && k<5;k++){</p><p> if(BoardPanel.board[i+k][j]==tcolor){</p><p><b&g
53、t; value++;</b></p><p><b> }</b></p><p> if(BoardPanel.board[i+k][j]==0){</p><p><b> flag++;</b></p><p><b> break;</b><
54、;/p><p><b> }</b></p><p><b> }</b></p><p> n=weight(value,flag);</p><p> if(weightBoard[i][j]<n){</p><p> weightBoard[i][j]=n;
55、</p><p><b> }</b></p><p><b> }</b></p><p><b> //y軸方向</b></p><p> for(i=x,j=RectY1;j<=RectY2;j++){</p><p> if(Bo
56、ardPanel.board[i][j]!=0){</p><p><b> continue;</b></p><p><b> }</b></p><p> value=0;flag=0;</p><p> for(k=1;j-k>=RectY1 && k<5
57、;k++){</p><p> if(BoardPanel.board[i][j-k]==tcolor){</p><p><b> value++;</b></p><p><b> continue;</b></p><p><b> }</b></p>
58、<p> if(BoardPanel.board[i][j-k]==0){</p><p><b> flag++;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }&l
59、t;/b></p><p> for(k=1;j+k<RectY2 && k<5;k++){</p><p> if(BoardPanel.board[i][j+k]==tcolor){</p><p><b> value++;</b></p><p><b> }&
60、lt;/b></p><p> if(BoardPanel.board[i][j+k]==0){</p><p><b> flag++;</b></p><p><b> break;</b></p><p><b> }</b></p><
61、p><b> }</b></p><p> n=weight(value,flag);</p><p> if(weightBoard[i][j]<n){</p><p> weightBoard[i][j]=n;</p><p><b> }</b></p>&
62、lt;p><b> }</b></p><p> // 左上到右下方向</p><p> for(i=RectX1,j=RectY1;i<=RectX2;i++,j++){</p><p> if(BoardPanel.board[i][j]!=0){</p><p><b> conti
63、nue;</b></p><p><b> }</b></p><p> value=0;flag=0;</p><p> for(k=1;i-k>=RectX1 && k<5 ;k++){</p><p> if(BoardPanel.board[i-k][j-k]==t
64、color){</p><p><b> value++;</b></p><p><b> continue;</b></p><p><b> }</b></p><p> if(BoardPanel.board[i-k][j-k]==0){</p>
65、<p><b> flag++;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> for(k=1;i+k<RectX2 &
66、;& k<5;k++){</p><p> if(BoardPanel.board[i+k][j+k]==tcolor){</p><p><b> value++;</b></p><p><b> }</b></p><p> if(BoardPanel.board[i+k
67、][j+k]==0){</p><p><b> flag++;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> n=w
68、eight(value,flag);</p><p> if(weightBoard[i][j]<n){</p><p> weightBoard[i][j]=n;</p><p><b> }</b></p><p><b> }</b></p><p>
69、// 左下到右上方向</p><p> for(i=RectX2,j=RectY1;i>=RectX1;i--,j++){</p><p> if(BoardPanel.board[i][j]!=0){</p><p><b> continue;</b></p><p><b> }</b
70、></p><p> value=0;flag=0;</p><p> for(k=1;i+k<=RectX2 && k<5;k++){</p><p> if(BoardPanel.board[i+k][j-k]==tcolor){</p><p><b> value++;</b&
71、gt;</p><p><b> continue;</b></p><p><b> }</b></p><p> if(BoardPanel.board[i+k][j-k]==0){</p><p><b> flag++;</b></p><p
72、><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> for(k=1;i-k>=RectX1 && k<5;k++){</p><p> if(BoardPan
73、el.board[i-k][j+k]==tcolor){</p><p><b> value++;</b></p><p><b> }</b></p><p> if(BoardPanel.board[i-k][j+k]==0){</p><p><b> flag++;<
74、;/b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> n=weight(value,flag);</p><p> if(weightBoa
75、rd[i][j]<n){</p><p> weightBoard[i][j]=n;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> /
76、**</b></p><p><b> * 返回棋子的權(quán)重</b></p><p><b> */</b></p><p> private int weight(int count, int flag)</p><p><b> {</b></p&g
77、t;<p> int weight=0;</p><p> switch(count){</p><p><b> case 0:{</b></p><p> if(flag>0) weight=200;</p><p> else weight=0;</p><p>
78、;<b> break;</b></p><p><b> }</b></p><p><b> case 1:{</b></p><p> if(flag>0) weight=1000;</p><p> else weight=0;</p>&
79、lt;p><b> break;</b></p><p><b> }</b></p><p><b> case 2:{</b></p><p> if(flag>0) weight=5000;</p><p> else weight=0;</p
80、><p><b> break;</b></p><p><b> }</b></p><p><b> case 3:{</b></p><p> if(flag>0) weight=8000;</p><p> else weight=0
81、;</p><p><b> break;</b></p><p><b> }</b></p><p><b> case 4:{</b></p><p> if(flag>0) weight=10000;</p><p> else
82、weight=0;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> return weight;</p><p><b> }</b&
83、gt;</p><p><b> /**</b></p><p> * 在棋盤中找到最優(yōu)的位置</p><p><b> */</b></p><p> private void getBetter(int count){</p><p> int [][] bet
84、ter = new int [count][2];</p><p> int [][] tempArray = new int [15][15];</p><p> for(int i=0;i<15;i++){</p><p> for(int j=0;j<15;j++){</p><p> tempArray[i][j]
85、=weightBoard[i][j];</p><p><b> }</b></p><p><b> }</b></p><p> for(int i=0;i<count;i++){</p><p> getBiggest(tempArray,better[i][0],better[
86、i][1]);</p><p><b> }</b></p><p> bestX=better[0][0];bestY=better[0][1];</p><p><b> }</b></p><p><b> /**</b></p><p>
87、<b> *得到權(quán)重最大值</b></p><p><b> */</b></p><p> private void getBiggest(int [][] arr,int x,int y){</p><p> int [] temp=new int[2];</p><p> int s
88、wt=arr[0][0],tmp=0;</p><p> for(int i=0;i<15;i++){</p><p> for(int j=0;j<15;j++){</p><p> if(arr[i][j]>swt){</p><p> temp[0]=i;temp[1]=j;</p><p&
89、gt; swt=arr[i][j];</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> x=temp[0];</p><p> y=temp[1];</p
90、><p> arr[x][y]=0;</p><p><b> }</b></p><p><b> }</b></p><p> 4.3、人工智能模塊</p><p> 有了上面填寫的兩張棋型表,現(xiàn)在要做的就是讓電腦知道在哪一點(diǎn)下子。其中最簡(jiǎn)單的方法就是便利棋型表Co
91、mputer[15][15][4]和Player[15][15][4],找出其中數(shù)值最大的一點(diǎn),在該點(diǎn)下子即可。但是這種算法的弱點(diǎn)非常明顯,只顧眼前的利益,不能顧全大局。</p><p> 為了解決這個(gè)問(wèn)題這里引入了“今后幾步預(yù)測(cè)法”具體方法是這樣的。</p><p> 讓電腦分析一個(gè)可能的弱點(diǎn),如果在某個(gè)位置下子將會(huì)形成對(duì)手不得不防守的棋型(例如:“沖四”、“活三”):那么下一步對(duì)手
92、就必須照你的思路下子防守,如此便完成了第一步的預(yù)測(cè)。</p><p> 重新調(diào)用棋型表填寫算法對(duì)預(yù)測(cè)后的棋進(jìn)行盤面分析,如果出現(xiàn)了“四三”、“雙三”或“雙四”等制勝點(diǎn),那么己方就可以獲勝了;否則按照同樣的方法向下分析,就可以預(yù)測(cè)出第二步、第三步等。</p><p> 但是要是盤面上沒有沒有對(duì)手防的棋型,那該怎么辦呢?進(jìn)攻不成不成就得考慮防守,將自己和對(duì)手調(diào)換位置,然后用上面的方法來(lái)預(yù)測(cè)
93、對(duì)手的棋。這樣既可以防守住對(duì)方巧妙地攻擊,又能待機(jī)發(fā)動(dòng)反擊。</p><p><b> 具體代碼:</b></p><p> Analyse(int chessc[][]){</p><p><b> int i, j;</b></p><p> chessBoard = new int[1
94、7][17];</p><p> for (i = 0; i <= 16; i++) {</p><p> for (j = 0; j <= 16; j++) {</p><p> if (i == 0 || j == 0 || i == 16 || j == 16) {</p><p> chessBoard[i][j]
95、 = 4;</p><p><b> }</b></p><p><b> else {</b></p><p> chessBoard[i][j] = chessc[i - 1][j - 1];</p><p><b> }</b></p><p&
96、gt;<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> private long pow(int base, int pow){</p><p><b> int i;</b>&l
97、t;/p><p> long result=1;</p><p> for(i=1;i<=pow;i++){</p><p> result*=base;</p><p><b> }</b></p><p> return result;</p><p>&l
98、t;b> }</b></p><p><b> /**</b></p><p><b> *判斷上下位置</b></p><p><b> */</b></p><p> private long analyseUd(int x, int y, in
99、t side){</p><p> int tt[][] = new int[17][17];</p><p><b> int i, j;</b></p><p> int tempx, tempy;</p><p> long mark = 0;</p><p> int base
100、= BASE;</p><p> int uppersign = 0;</p><p> int downsign = 0;</p><p> int c_count = 1;</p><p> for (i = 0; i < 17; i++) {</p><p> for (j = 0; j <
101、 17; j++) {</p><p> tt[i][j] = chessBoard[i][j];</p><p><b> }</b></p><p><b> }</b></p><p> tt[y][x] = side;</p><p> tempx = x;
102、</p><p> tempy = y;</p><p> if (tt[tempy - 1][tempx] != side) {</p><p> if (tt[tempy - 1][tempx] == 0) {</p><p> uppersign = 1;</p><p><b> }<
103、/b></p><p> if (tt[tempy - 1][tempx] != 0) {</p><p> uppersign = 0;</p><p><b> }</b></p><p><b> }</b></p><p><b> else
104、 {</b></p><p> tempy -= 1;</p><p> while (tt[tempy][tempx] == side) {</p><p> c_count += 1;</p><p><b> tempy--;</b></p><p><b>
105、 }</b></p><p> if (tt[tempy][tempx] == 0) {</p><p> uppersign = 1;</p><p><b> }</b></p><p> if (tt[tempy][tempx] != 0) {</p><p> upp
106、ersign = 0;</p><p><b> }</b></p><p><b> }</b></p><p> tempx = x;</p><p> tempy = y;</p><p> if (tt[tempy + 1][tempx] != side)
107、{</p><p> if (tt[tempy + 1][tempx] == 0) {</p><p> downsign = 1;</p><p><b> }</b></p><p> if (tt[tempy + 1][tempx] != 0) {</p><p> downsig
108、n = 0;</p><p><b> }</b></p><p><b> }</b></p><p><b> else {</b></p><p> tempy += 1;</p><p> while (tt[tempy][tempx]
109、 == side) {</p><p> c_count += 1;</p><p><b> tempy++;</b></p><p><b> }</b></p><p> if (tt[tempy][tempx] == 0) {</p><p> downsi
110、gn = 1;</p><p><b> }</b></p><p> if (tt[tempy][tempx] != 0) {</p><p> downsign = 0;</p><p><b> }</b></p><p><b> }</b&
111、gt;</p><p> mark += pow(base, c_count);</p><p> if ( (uppersign + downsign) > 0) {</p><p> if ( (uppersign + downsign) == 2) {</p><p> mark *= (uppersign + downs
112、ign);</p><p><b> }</b></p><p> if ( (uppersign + downsign) == 1) {</p><p> mark = mark / 2;</p><p><b> }</b></p><p><b>
113、}</b></p><p> else if (c_count == 5) {</p><p> mark *= 4;</p><p><b> }</b></p><p><b> else {</b></p><p><b> mark =
114、 0;</b></p><p><b> }</b></p><p> if (c_count == 5) {</p><p> mark += INVALID;</p><p><b> }</b></p><p> return mark;</
115、p><p><b> }</b></p><p><b> /**</b></p><p><b> *判斷左右位置</b></p><p><b> */</b></p><p> private long analyseL
116、r(int x, int y, int side){</p><p> int tt[][] = new int[17][17];</p><p> int i, j,tx, ty;</p><p> long mark = 0;</p><p> int base = BASE,uppersign = 0,downsign = 0,
117、c_count = 1;</p><p> for (i = 0; i < 17; i++) {</p><p> for (j = 0; j < 17; j++) {</p><p> tt[i][j] = chessBoard[i][j];</p><p><b> }</b></p>
118、<p><b> }</b></p><p> tt[y][x] = side;</p><p><b> tx = x;</b></p><p><b> ty = y;</b></p><p> if (tt[ty][tx - 1] != side)
119、 {</p><p> if (tt[ty][tx - 1] == 0) {</p><p> uppersign = 1;</p><p><b> }</b></p><p> if (tt[ty][tx - 1] != 0) {</p><p> uppersign = 0;<
120、;/p><p><b> }</b></p><p><b> }</b></p><p><b> else {</b></p><p><b> tx -= 1;</b></p><p> while (tt[ty][tx
121、] == side) {</p><p> c_count += 1;</p><p><b> tx--;</b></p><p><b> }</b></p><p> if (tt[ty][tx] == 0) {</p><p> uppersign = 1;
122、</p><p><b> }</b></p><p> if (tt[ty][tx] != 0) {</p><p> uppersign = 0;</p><p><b> }</b></p><p><b> }</b></p>
123、;<p><b> tx = x;</b></p><p><b> ty = y;</b></p><p> if (tt[ty][tx + 1] != side) {</p><p> if (tt[ty][tx + 1] == 0) {</p><p> downsig
124、n = 1;</p><p><b> }</b></p><p> if (tt[ty][tx + 1] != 0) {</p><p> downsign = 0;</p><p><b> }</b></p><p><b> }</b>
125、</p><p><b> else {</b></p><p><b> tx += 1;</b></p><p> while (tt[ty][tx] == side) {</p><p> c_count += 1;</p><p><b> tx+
126、+;</b></p><p><b> }</b></p><p> if (tt[ty][tx] == 0) {</p><p> downsign = 1;</p><p><b> }</b></p><p> if (tt[ty][tx] !=
127、0) {</p><p> downsign = 0;</p><p><b> }</b></p><p><b> }</b></p><p> mark += pow(base, c_count);</p><p> if ( (uppersign + dow
128、nsign) > 0) {</p><p> if ( (uppersign + downsign) == 2) {</p><p> mark *= (uppersign + downsign);</p><p><b> }</b></p><p> if ( (uppersign + downsign
129、) == 1) {</p><p> mark = mark / 2;</p><p><b> }</b></p><p><b> }</b></p><p> else if (c_count == 5) {</p><p> mark *= 4;</p
130、><p><b> }</b></p><p><b> else {</b></p><p><b> mark = 0;</b></p><p><b> }</b></p><p> if (c_count == 5)
131、{</p><p> mark += INVALID;</p><p><b> }</b></p><p> return mark;</p><p><b> }</b></p><p><b> /**</b></p>&l
132、t;p> *判斷右上到左下的斜線位置</p><p><b> */</b></p><p> private long analyseLdru(int x, int y, int side){</p><p> int tt[][] = new int[17][17];</p><p><b>
133、 int i, j;</b></p><p> int tx, ty;</p><p> long mark = 0;</p><p> int base = BASE;</p><p> int uppersign = 0;</p><p> int downsign = 0;</p&g
134、t;<p> int c_count = 1;</p><p> for (i = 0; i < 17; i++) {</p><p> for (j = 0; j < 17; j++) {</p><p> tt[i][j] = chessBoard[i][j];</p><p><b> }&
135、lt;/b></p><p><b> }</b></p><p> tt[y][x] = side;</p><p><b> tx = x;</b></p><p><b> ty = y;</b></p><p> if (tt[t
136、y - 1][tx - 1] != side) {</p><p> if (tt[ty - 1][tx - 1] == 0) {</p><p> uppersign = 1;</p><p><b> }</b></p><p> if (tt[ty - 1][tx - 1] != 0) {</p>
137、;<p> uppersign = 0;</p><p><b> }</b></p><p><b> }</b></p><p><b> else {</b></p><p><b> tx -= 1;</b></p&g
138、t;<p><b> ty -= 1;</b></p><p> while (tt[ty][tx] == side) {</p><p> c_count += 1;</p><p><b> tx--;</b></p><p><b> ty--;</b&
139、gt;</p><p><b> }</b></p><p> if (tt[ty][tx] == 0) {</p><p> uppersign = 1;</p><p><b> }</b></p><p> if (tt[ty][tx] != 0) {<
140、/p><p> uppersign = 0;</p><p><b> }</b></p><p><b> }</b></p><p><b> tx = x;</b></p><p><b> ty = y;</b><
141、;/p><p> if (tt[ty + 1][tx + 1] != side) {</p><p> if (tt[ty + 1][tx + 1] == 0) {</p><p> downsign = 1;</p><p><b> }</b></p><p> if (tt[ty +
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五子棋畢業(yè)論文
- 五子棋畢業(yè)論文-html開發(fā)五子棋的原型設(shè)計(jì)
- 五子棋游戲設(shè)計(jì)畢業(yè)論文
- java五子棋游戲畢業(yè)論文
- 畢業(yè)論文——五子棋游戲設(shè)計(jì)
- 畢業(yè)論文---網(wǎng)絡(luò)五子棋游戲設(shè)計(jì)
- 網(wǎng)絡(luò)五子棋的設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文
- 網(wǎng)絡(luò)五子棋五子棋設(shè)計(jì)與實(shí)現(xiàn).doc
- 畢業(yè)論文 基于android的五子棋設(shè)計(jì)
- qt網(wǎng)絡(luò)五子棋五子棋設(shè)計(jì)與實(shí)現(xiàn)
- 五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)論文】
- 五子棋畢業(yè)論文--人工智能課題
- flash五子棋畢業(yè)設(shè)計(jì)論文
- java五子棋畢業(yè)設(shè)計(jì)論文
- 五子棋項(xiàng)目
- java五子棋畢業(yè)設(shè)計(jì)--java五子棋對(duì)弈程序的設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)論文---五子棋人機(jī)對(duì)弈系統(tǒng)(vc++)
- 基于vc的五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)論文】
- 基于java的五子棋游戲的設(shè)計(jì)——畢業(yè)論文
- 五子棋棋譜
評(píng)論
0/150
提交評(píng)論