2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論