【正文】
...................................................................................................... 22 聲 明 ........................................................................................................................ 23 第 1 頁 共 23 頁 1 引言 課題背景 五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一。服務(wù)器維護(hù)在線用戶的基本信息和任意兩個(gè)對(duì)戰(zhàn)用戶的棋盤信息,動(dòng)態(tài)維護(hù)用戶列 表 。在 人機(jī)對(duì)弈中 通過深度搜索和估值模塊, 來提高電腦棋手的智能 ?,F(xiàn)代五子棋日文稱之為連珠,英譯為 Renju,英文稱之為 Gobang 或 FIR(Five in a Row 的縮寫 ),亦有連五子、五子連、串珠、 五目、五目碰、五格等多種稱謂。其中戰(zhàn)勝過國(guó)際象棋世界冠軍 卡斯帕羅夫的 “ 深藍(lán) ” 便是最具說服力的代表;其它像圍棋的 “ 手淡 ” 、象棋的 “ 將族 ” 等也以其優(yōu)秀的人工智能深受棋迷喜愛 。 并且人工智能中的博弈部分,由于采用了大量的搜索算法,其中很多被利用到各方面。難點(diǎn)是人工智能,可以這樣說,人工智能的好壞決定了這個(gè)題目的完成深度。 2:最先在棋盤的橫向、豎向、斜向形成連續(xù)的相同色五個(gè)棋子的一方為勝利。 五子棋是由兩個(gè)人在一盤棋上進(jìn)行對(duì)抗的競(jìng)技運(yùn)動(dòng)。 死二:即再下一子可形成死三的二,見圖 3。如果是死三,將特別指出。 沖四:在同一條線上相連的相同顏色的四個(gè)棋子,它與活四不同的是,其中的一端有對(duì)方的棋子進(jìn)行阻擋,它只有再在另一端下一手棋才可形成“連五”。白棋無禁手 ,如果黑子在落下的關(guān)鍵的第五子即形成五連的同時(shí),又形成禁手。 D、 E 中的 X 點(diǎn)為四、四禁手。 五子棋的點(diǎn)的選擇十分關(guān)鍵。而雙攻棋指雙向或雙行的攻棋。 2:面向?qū)ο?(ObjectOriented) 面向?qū)ο笫墙陙硇畔⒔鐝V為使用的概念 和技術(shù)。 5:安全性 (Secure) Java 是被設(shè)計(jì)用于網(wǎng)絡(luò)及分布式環(huán)境中的,所以安全性是一個(gè)很重要的考慮。 源 文 件 : 文 件 名 . j a v a由 J a v a 解 釋 器 執(zhí) 行 由 瀏 覽 器 執(zhí) 行字 節(jié) 碼 文 件J a v a 編 譯 器 : j a v a c編譯生成Java應(yīng)用程序Java小應(yīng)用程序 圖 10 Java程序的開發(fā)過程 源文件:使用一個(gè)文本編輯器,如 Edit 或記事本來編寫源文件。在命令提示窗口輸入 Java version 如果能正確顯示版本號(hào),則表示環(huán)境配置成功。 則負(fù)責(zé) 網(wǎng)絡(luò)對(duì)戰(zhàn)的處理。239。639。 char [] rowNum2={39。,39。,39。}。 ()。i++,j+=2){ (rowNum2,j,2,10,35+i*30)。 (455, 25, 455, 455)。 (xp,yp,28,28)。 // 棋子 Y 坐標(biāo) if(col==1) ()。 第 14 頁 共 23 頁 圖 14 獲勝 勝負(fù)判斷條件以下給出了 X 方向的代碼: protected boolean judge(int x,int y,int clr){ int i=0,j=0,count=0。 if(count==5) return true。 } return false。 //繼續(xù)新游戲 (Player2)。如果,有一方獲勝,則提示消息通知雙方,確定則繼續(xù)開始新游戲。 } 圖 16 邀請(qǐng)游戲 電腦 AI 廣義上來講,博弈是指在一定的環(huán)境條件和一定的規(guī)則約束 下,依靠自己所能夠掌握的信息,從各自選擇的行為或是策略進(jìn)行選擇并加以實(shí)施,并從各自取得相應(yīng)結(jié)果或收益的過程。 參考了很多五子棋算法,大部分思想差不多,就是搜索估值確定重要性,然后選取最大的一個(gè)點(diǎn)下子 。但是有些棋類游戲,比如在中國(guó)象棋和國(guó)際象棋中,情況就有些復(fù)雜了,每個(gè)棋子都有它特定的著法, 電腦下子要考慮自己和玩家的棋型,優(yōu)先防守 ,如果沒有要防的棋型,則搜索自己的棋型下子。flag=0。 break。 } } n=weight(value,flag)。j++){ if(arr[i][j]swt){ temp[0]=i。因此,要使棋手做出這種判斷,就要把第一種情況的估值設(shè)置得高。 if(y+414) RectY2=14。不過即使沒采用遞歸算法,要是讓電腦先下子的話,你的大部分時(shí)間也是花在防守上,可能是我的棋力太菜了,我自己還沒有下贏過電腦。 關(guān)于電腦學(xué)習(xí),這聽起來似乎是算法無法實(shí)現(xiàn)的功能。它的概念、方法和技術(shù),正在各行各業(yè)廣泛滲透。 [6] 彭建國(guó) ,那威 .連珠五子棋入門 .北京:金盾出版社 .。 ( 3)學(xué)??梢詫W(xué)術(shù)交流為目的復(fù)制、贈(zèng)送和交換學(xué)位論文。t guarantee to explain everything. You39。d better tell you who I am. My name is Leo Resnic k. I39。m open to offers. Miriam that39。s wedding. End of life story. There39。d known about her. Which they didn39。 39。I wasn39。t waiting at the desk. The duty nurse, w ho knew who I was, phoned around and located Miriam in the mue. I tried to figure out what she was doing there. Normally, she works in Emergency and I know she hates losing out. Miriam told the nurse that she39。t like to tell them that I preferre d Fritz the Cat to Mic key Mouse and that I hadn39。m not married. I39。ve put down everything I saw and everything that was said just the way it happened. It can all be checked against this account I am writing now. It39。s over. Or end them. It39。 關(guān)于學(xué)位論文使用權(quán)和研究成果知識(shí)產(chǎn)權(quán)的說明: 本人完全了解成都信息工程學(xué)院有關(guān)保管使用學(xué)位論文的規(guī)定,其中包括: ( 1)學(xué)校有權(quán)保管并向有關(guān)部門遞交學(xué)位論文的原件與復(fù)印件。 [4] 徐立 ,孫計(jì)安 .Java 應(yīng)用與開發(fā)案例教程 .北京: 清華大學(xué)出版社 ,。對(duì)五子棋相關(guān)規(guī)則及技巧有了新的收獲,最重要的是自己動(dòng)手解決問題的能力得到了提高。關(guān)于 增加細(xì)致的特定棋形的判斷 ,前面已經(jīng)說過,以為不同的棋型,例如“死四”就有不同的幾種情況,如果對(duì)每一種設(shè)置不同的重要值,也可以提高電腦 AI,但是要設(shè)置合適的分?jǐn)?shù)就要在實(shí)踐中檢驗(yàn)了,因?yàn)檫@個(gè)不是大小的問題,而是相差多少。 } 努力提高電腦 AI 一直是五子棋游戲關(guān)鍵,第一步的人工智能只是估值和搜索算法的集合,要真正的提高電腦 AI 還有很多步,例如,我的電腦 AI 只是片面的分析了雙方的器型,沒有前瞻性。 if(y40) RectY1=y4。 } 對(duì)于特定的棋型,都有一個(gè)不同的估值,以此來區(qū)別不同棋型的優(yōu)劣,也以此來決定最終的落子位置。i++){ for(int j=0。 } if([i+k][j]==0){ flag++。 continue。i++){ if([i][j]!=0){ continue。不同的棋類游戲各有所謂的規(guī)則,規(guī)則中就有博弈雙方都可以走哪些著法。換言之,博弈就是研究個(gè)體如何在錯(cuò)綜復(fù)雜的相互影響中得出最合理的策略,博弈論正是衍生于古老的游戲或曰博弈如象棋、撲克等。 } else{ ss = new String(black)。 /** * 消息列表 * type = 1 // 請(qǐng)求連接 , msg = 連接者名字 * type = 2 // 放棋子 * type = 3 // 請(qǐng)求和其他人游戲 第 16 頁 共 23 頁 * type = 4 // 拒絕游戲請(qǐng)求 * type = 5 // 同意請(qǐng)求 * type = 6 // 發(fā)送勝利消息 * type = 7 // 斷開連接請(qǐng)求 * type = 8 // 保存游戲,但是不放在磁盤上,在下一局開始時(shí)將會(huì)丟失 * type = 9 // 添加新的玩家到所有客戶端的玩家列表 * type = 10// 響應(yīng)信息 type ==1 * type = 11// 和玩家游戲 ,msg 保存玩家的名字 ,創(chuàng)建游戲的玩家設(shè)置游戲 * type = 12//信息設(shè)置 * type = 13// 設(shè)置玩家顏色 * type = 14// msg= 接受請(qǐng)求的一方設(shè)置 * type = 15// 服務(wù)端更新信息 * type = 16// 發(fā)送控制或錯(cuò)誤信息 * type = 17// 游戲失敗 * type = 18// 服務(wù)端套接字關(guān)閉 * type = 19// 玩家結(jié)束游戲及更新 * tyep = 20// 電腦獲勝 / 玩家獲勝 */ SOCKET 監(jiān)聽端口,如果有玩家則更新玩家列表, 如果雙擊除自己以外的玩家,則可以開始游戲,發(fā)送游戲請(qǐng)求,如果同意則返回棋子顏色并開始游戲,同時(shí)清空玩家列表。 如果有一方獲勝,彈出提示框,如果確認(rèn)則清空棋盤繼續(xù)新游戲。 }else{ break。 } else{ break。由于代碼太多,下面給出了一般狀況的判斷勝負(fù)函數(shù) ,及以坐標(biāo)( x,y)為中心的9X9 矩形,只能在棋盤的內(nèi)部,如果超過棋盤,就要另外考慮。 private static int xp。 yp=16+j*30。 (25, 25, 25, 455)。 } for(int i=9,j=0。 //()。,39。,39。,39。939。539。139。 定義了面板上的其他元素,包括玩家列表,標(biāo)題欄等。 Java 應(yīng)用程序必須通過 Java 解釋器( )來解釋執(zhí)行其字節(jié)碼文件; Java 小應(yīng)用程序可通過支持 Java 標(biāo)準(zhǔn)的瀏覽器來解釋執(zhí)行。 7:多線程 (Multithreaded) 多線程是開發(fā)復(fù)雜和功能強(qiáng)大的程序所必須的手段之一, Java 同樣支持這個(gè)重要功能。 4:強(qiáng)壯性 (Robust) 由 Java 所編寫的程序要能在各種情況下運(yùn)行,而且必須具 有高的穩(wěn)定性。 Java 有以下主要特點(diǎn): 1:簡(jiǎn)單( Simple) 制定 Java 的原則之一,是要建立一種結(jié)構(gòu)簡(jiǎn)單而且使用容易的系統(tǒng),可以讓用戶不必接受很深的訓(xùn)練就可以開始設(shè)計(jì)程序,所以 Java 的語法盡可能與在當(dāng)前許多程序設(shè)計(jì)師都采用的 C 及 C++語言相似。如果是黑方,還特別要注意進(jìn)攻終被對(duì)方反擊時(shí)出現(xiàn)的各種禁手點(diǎn)的可能性。所以,在五子棋的對(duì)局眾進(jìn)攻和防守都是從“二”和“三”的爭(zhēng)奪開始的。 A B C D 第 7 頁 共 23 頁 E F 圖 9 禁手 見圖 9。 自由獲勝:除了追下取勝以外的