基于Java的五子棋游戲的設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文-JAVA畢業(yè)設(shè)計(jì)論文_第1頁(yè)
基于Java的五子棋游戲的設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文-JAVA畢業(yè)設(shè)計(jì)論文_第2頁(yè)
基于Java的五子棋游戲的設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文-JAVA畢業(yè)設(shè)計(jì)論文_第3頁(yè)
基于Java的五子棋游戲的設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文-JAVA畢業(yè)設(shè)計(jì)論文_第4頁(yè)
基于Java的五子棋游戲的設(shè)計(jì)-畢業(yè)設(shè)計(jì)論文-JAVA畢業(yè)設(shè)計(jì)論文_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、畢畢 業(yè)業(yè)論論 文文 基于基于 JavaJava 的五子棋游戲的設(shè)計(jì)的五子棋游戲的設(shè)計(jì) 論文作者姓名論文作者姓名:XXX:XXX 申請(qǐng)學(xué)位類(lèi)別申請(qǐng)學(xué)位類(lèi)別: :計(jì)算機(jī)科學(xué)與技術(shù)計(jì)算機(jī)科學(xué)與技術(shù) 申請(qǐng)學(xué)位類(lèi)別申請(qǐng)學(xué)位類(lèi)別: :工學(xué)學(xué)士工學(xué)學(xué)士 論文提交日期論文提交日期: : XXXXXXXX 年年 XXXX 月月 XXXX 日日 基于基于 Java 的五子棋游戲的設(shè)計(jì)的五子棋游戲的設(shè)計(jì) 摘摘 要要 五子棋作為一個(gè)棋類(lèi)競(jìng)技運(yùn)動(dòng),在民間十分流行,為了熟悉五子棋規(guī)則及技 巧,以及研究簡(jiǎn)單的人工智能,決定用 Java 開(kāi)發(fā)五子棋游戲。主要完成了人機(jī)對(duì) 戰(zhàn)和玩家之間聯(lián)網(wǎng)對(duì)戰(zhàn) 2 個(gè)功能。網(wǎng)絡(luò)連接部分為 S

2、ocket 編程應(yīng)用,客戶(hù)端和 服務(wù)器端的交互用 Class Message 定義,有很好的可擴(kuò)展性,客戶(hù)端負(fù)責(zé)界面維護(hù) 和收集用戶(hù)輸入的信息,及錯(cuò)誤處理。服務(wù)器維護(hù)在線(xiàn)用戶(hù)的基本信息和任意兩 個(gè)對(duì)戰(zhàn)用戶(hù)的棋盤(pán)信息,動(dòng)態(tài)維護(hù)用戶(hù)列表。在人機(jī)對(duì)弈中通過(guò)深度搜索和估值 模塊,來(lái)提高電腦棋手的智能。分析估值模塊中的影響精準(zhǔn)性的幾個(gè)要素,以及 提出若干提高精準(zhǔn)性的辦法,以及對(duì)它們搜索的節(jié)點(diǎn)數(shù)進(jìn)行比較,在這些算法的 基礎(chǔ)上分析一些提高電腦 AI 方案,如遞歸算法、電腦學(xué)習(xí)等。算法的研究有助 于理解程序結(jié)構(gòu),增強(qiáng)邏輯思維能力,在其他人工智能方面也有很大的參考作用。 關(guān)鍵詞關(guān)鍵詞: :深度搜索;估值;電腦

3、AI;五子棋;算法 Gobang Java-based games design Abstract As a sport, gobang is very popular in civil, in order to become familiar with gobang rules and techniques, and the study of simple artificial intelligence, I decide to use the Java to develope gobang games and complete the two functions including man

4、-machine war and man-man war. Network Connection is Socket Programming for some applications, client and server interaction is definited by Class Message, which is a very good scalability, Client interface is responsible for the collection and maintenance of user input information, and error handlin

5、g. Server users maintain online basic information and arbitrary two-time users of the chessboard of information, dynamic maintenance user list. During the man-machine players, it improves intelligence of the computer players through depth search and valuation module. Analyzes Module valuation of the

6、 precise elements, as well as a number of increased precision, and compares their search for nodes, which raises some computer AI programs on the basis of analysis, such as recursive algorithm, computer learning. Algorithm of procedures contribute to the understanding of the structure, logical think

7、ing ability, In other areas of artificial intelligence has great references. . Key words: Search depth; Valuation; Computer AI; Gobang ; Algorithm 目目 錄錄 論文總頁(yè)數(shù):23 頁(yè) 1引言.1 1.1課題背景.1 1.2本課題研究的意義.1 1.3本課題的研究方法.2 2課題相關(guān)基礎(chǔ).2 2.1五子棋.2 2.1.1棋盤(pán)和棋子.2 2.1.2規(guī)則及解釋.3 2.1.3五子棋常用術(shù)語(yǔ).4 2.1.4五子棋攻防.7 3JAVA .8 3.1JAVA簡(jiǎn)介.

8、8 3.2JAVA開(kāi)發(fā)環(huán)境.9 4課題詳細(xì)研究方法.10 4.1程序結(jié)構(gòu)說(shuō)明.10 4.2棋盤(pán)及棋子的類(lèi).11 4.2.1棋盤(pán).11 4.2.2棋子.13 4.3勝負(fù)判斷條件.13 4.4網(wǎng)絡(luò)對(duì)戰(zhàn).15 4.5電腦 AI.17 結(jié) 論.21 參考文獻(xiàn).21 致 謝.22 聲 明.23 第 1 頁(yè) 共 23 頁(yè) 1 1 引言引言 1.11.1 課題背景課題背景 五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一。現(xiàn)代五子棋日文稱(chēng)之為連 珠,英譯為 Renju,英文稱(chēng)之為 Gobang 或 FIR(Five in a Row 的縮寫(xiě)),亦有連五 子、五子連、串珠、五目、五目碰、五格等多種稱(chēng)謂。 五子棋起源于

9、古代中國(guó),發(fā)展于日本,風(fēng)靡于歐洲。對(duì)于它與圍棋的關(guān)系有 兩種說(shuō)法,一說(shuō)早于圍棋,早在 “ 堯造圍棋 ” 之前,民間就已有五子棋游戲; 一說(shuō)源于圍棋,是圍棋發(fā)展的一個(gè)分支。在中國(guó)的文化里,倍受人們的青睞。本 世紀(jì)初五子棋傳入歐洲并迅速風(fēng)靡全歐。通過(guò)一系列的變化,使五子棋這一簡(jiǎn)單 的游戲復(fù)雜化、規(guī)范化,而最終成為今天的職業(yè)連珠五子棋,同時(shí)也成為一種國(guó) 際比賽棋。 Java 語(yǔ)言是當(dāng)今最為流行的程序設(shè)計(jì)語(yǔ)言之一 作為一門(mén)非常優(yōu)秀和極為 健壯的編程語(yǔ)言,它同時(shí)具有的面向?qū)ο?與平臺(tái)無(wú)關(guān),分布式應(yīng)用,安全,穩(wěn)定和 多線(xiàn)程等優(yōu)良的特征,使用 Java 語(yǔ)言,不僅可以開(kāi)發(fā)出功能強(qiáng)大的大型應(yīng)用程序,而 且 J

10、ava 語(yǔ)言本身突出的跨平臺(tái)的特性也使得它特別適合于 Internet 上的應(yīng)用 開(kāi)發(fā),可以這樣說(shuō),Java 的出現(xiàn)使得所開(kāi)發(fā)的應(yīng)用程序“一次編寫(xiě),處處可用” 的實(shí)現(xiàn)成為了可能。 1.21.2 本課題研究的意義本課題研究的意義 近來(lái)隨著計(jì)算機(jī)的快速發(fā)展,各種各樣的電腦游戲?qū)映霾桓F,使得我們能有 更多的娛樂(lè)項(xiàng)目,而棋類(lèi)游戲能起到鍛煉人的思維和修身養(yǎng)性的作用,而且棋類(lèi) 游戲水平頗高,大有與人腦分庭抗禮之勢(shì)。其中戰(zhàn)勝過(guò)國(guó)際象棋世界冠軍-卡斯 帕羅夫的“深藍(lán)”便是最具說(shuō)服力的代表;其它像圍棋的“手淡” 、象棋的“將 族”等也以其優(yōu)秀的人工智能深受棋迷喜愛(ài)。 越來(lái)越多的具有智能的機(jī)器進(jìn)入了人類(lèi)的生活,人

11、工智能的重要性如今顯而 易見(jiàn)。自己對(duì)人工智能比較感興趣,而五子棋游戲程序的開(kāi)發(fā)實(shí)現(xiàn)這個(gè)課題,正 好提供給我這樣一個(gè)研究的機(jī)會(huì),通過(guò)對(duì)人工智能中博弈方面的研究(人機(jī)對(duì)弈),讓 我在簡(jiǎn)單的人機(jī)對(duì)弈全局設(shè)計(jì),以及具體到相關(guān)算法上有了深入的了解。人工智 能屬于計(jì)算機(jī)科學(xué)的領(lǐng)域,它以計(jì)算機(jī)技術(shù)為基礎(chǔ),近幾十年來(lái),它的理論和技術(shù) 已經(jīng)日益成熟,應(yīng)用領(lǐng)域也正在不斷擴(kuò)大,顯示出強(qiáng)大的生命力。人工智能大致 可以分成幾個(gè)學(xué)科,它們每一個(gè)都是獨(dú)特的,但是它們常常又互相結(jié)合起來(lái)完成 設(shè)計(jì)任務(wù),這時(shí),這些學(xué)科之間的差別就變的很模糊。人工智能在專(zhuān)家系統(tǒng),自然 語(yǔ)言理解,自動(dòng)定理證明,自動(dòng)程序設(shè)計(jì),人工智能在機(jī)器人學(xué)、模式

12、識(shí)別、物景 分析、數(shù)據(jù)庫(kù)的智能檢索、機(jī)器下棋(實(shí)質(zhì)上是博弈論問(wèn)題)和家用電器智能化 等領(lǐng)域都有廣泛的應(yīng)用。而這個(gè)課題就是和人工智能中的博弈論領(lǐng)域緊密相關(guān) 第 2 頁(yè) 共 23 頁(yè) 的。 這個(gè)題目核心是人工智能和 Socekt 編程,。并且人工智能中的博弈部分,由 于采用了大量的搜索算法,其中很多被利用到各方面。它的概念、方法和技術(shù), 正在各行各業(yè)廣泛滲透。智能已經(jīng)成為當(dāng)今各種新產(chǎn)品、新裝備的發(fā)展方向。 所以,趁著這個(gè)機(jī)會(huì),對(duì)人工智能中比較容易實(shí)現(xiàn)的人機(jī)博弈進(jìn)行了解研究學(xué)習(xí), 也是很實(shí)用且很有必要的。 1.31.3 本課題的研究方法本課題的研究方法 在進(jìn)行游戲設(shè)計(jì)之前,首先決定的第一個(gè)問(wèn)題就是,

13、使用什么開(kāi)發(fā)環(huán)境來(lái)編 寫(xiě)環(huán)境? 自己雖然比較熟悉 Java 語(yǔ)言,但是實(shí)際開(kāi)發(fā)項(xiàng)目經(jīng)驗(yàn)很少,所以決定用 Jcreator,其擁有高亮語(yǔ)法編輯、使用向?qū)б约巴耆ㄖ频挠脩?hù)界面,最主要的 是能夠自動(dòng)查找文件于 Main 方法或 Html 文件以支持 Java 小應(yīng)用程序,然后 啟動(dòng)相應(yīng)的工具。 其次確定整個(gè)程序的結(jié)構(gòu)框架。由于 Applet 運(yùn)行速度較慢,如果在加上算 法搜索時(shí)間,顯然不符合程序的設(shè)計(jì)要求,決定用 Java 應(yīng)用程序開(kāi)發(fā).整個(gè)程序 的功能實(shí)現(xiàn)流程是這樣的:網(wǎng)絡(luò)對(duì)戰(zhàn)涉及算法較少,所以先實(shí)現(xiàn)網(wǎng)絡(luò)部分,實(shí)現(xiàn)基 本的棋盤(pán)和棋子的類(lèi),添加判斷勝負(fù)條件,這部是基礎(chǔ),也是很重要的,電腦 AI 也

14、 在這些基礎(chǔ)上添加上來(lái)的。這個(gè)題目的 2 個(gè)功能包括 2 個(gè)重要算法,電腦 AI 和 勝負(fù)條件,勝負(fù)條件運(yùn)算量不大,有固定的模式。難點(diǎn)是人工智能,可以這樣說(shuō), 人工智能的好壞決定了這個(gè)題目的完成深度。所以,大部份時(shí)間花在 AI 算法的 研究和改進(jìn)上,對(duì)于算法我掌握的不多,研究了一些國(guó)內(nèi)的五子棋算法,參考了一 些游戲設(shè)計(jì)算法,詳細(xì)比較各種算法的優(yōu)缺點(diǎn),而且參考了現(xiàn)代五子棋比賽的各 種規(guī)則和技巧,盡量聯(lián)系實(shí)際,努力提高電腦 AI。 2 2課題相關(guān)基礎(chǔ)課題相關(guān)基礎(chǔ) 2.12.1 五子棋五子棋 .1 棋盤(pán)和棋子棋盤(pán)和棋子 現(xiàn)代五子棋棋盤(pán),經(jīng)過(guò)國(guó)際棋聯(lián)的多次修改 ,最終定為 15 X 1

15、5 路,即棋 盤(pán)由橫豎各 15 條平行線(xiàn)交叉組成,共有 225 個(gè)交叉點(diǎn);棋盤(pán)上共有五個(gè)星位 ,中 間的星位稱(chēng)為天元,周?chē)狞c(diǎn)為小星,與圍棋盤(pán)略有不同。見(jiàn)圖 1 。 第 3 頁(yè) 共 23 頁(yè) 圖 1 棋盤(pán) 五子棋的棋子和圍棋相同 ,分黑白 2 種顏色,通常為散圓形,有一面凸起 或二面凸起等形狀,一副棋子總數(shù)為 225 枚,其中黑子 113 枚,白子 112 枚。 關(guān)于計(jì)時(shí),正規(guī)比賽按不同級(jí)別設(shè)置了不同的時(shí)間限制 ,一般的玩家都沒(méi) 有這個(gè)限制。 .2 規(guī)則及解釋規(guī)則及解釋 1:黑棋先行,白棋隨后。從天元開(kāi)始相互順序落子。 2:最先在棋盤(pán)的橫向、豎向、斜向形成連續(xù)的相同色五個(gè)棋子的

16、一方為勝 利。 3:黑棋禁手判負(fù)、白棋無(wú)禁手。黑棋禁手包括“三、三” ;“四、四” ; “長(zhǎng)連” 。黑方只能用“四、三”去取勝。 4:如分不出勝負(fù),則定位平局。 5:對(duì)局中拔子、中途退場(chǎng)均判為負(fù) 6:五連與禁手同時(shí)形成,先五為勝。 7:黑方禁手形成時(shí),白方應(yīng)立即指出。若白方未發(fā)現(xiàn)或發(fā)現(xiàn)后不立即指正, 反而繼續(xù)落子,則不能判黑方負(fù)。 五子棋是由兩個(gè)人在一盤(pán)棋上進(jìn)行對(duì)抗的競(jìng)技運(yùn)動(dòng)。在對(duì)局開(kāi)始時(shí),先由執(zhí) 黑棋的一方將一枚棋子的落在“天元”上,然后由執(zhí)白棋的一方在黑棋周?chē)慕?第 4 頁(yè) 共 23 頁(yè) 叉點(diǎn)上落子。如此輪流落子直到某一方首先在棋盤(pán)的直線(xiàn) 橫線(xiàn)或斜線(xiàn)上形成連 續(xù)的五子或五子以上,則該方就

17、算獲勝。但是五子棋的特點(diǎn)是先行的一方優(yōu)勢(shì)很 大。因此,在職業(yè)比賽種對(duì)黑方做了種種限制,以利公平競(jìng)爭(zhēng)。黑白雙方的勝負(fù) 結(jié)果必須按照職業(yè)五子棋的規(guī)則要求來(lái)決定。 .3五子棋常用術(shù)語(yǔ)五子棋常用術(shù)語(yǔ) 二:二是五子棋的一切進(jìn)攻的基礎(chǔ);又分為活二和死二。 活二:即再下一子可形成活三的二,見(jiàn)圖 2。 死二:即再下一子可形成死三的二,見(jiàn)圖 3。 圖 2 活二 圖 3 死二 三:三是五子棋最常見(jiàn)的攻擊手段。三分為活三、死三、眠三。 活三:為再下一子即可變成活四的三(活四介紹見(jiàn)后)。或三分為連三、跳三。 見(jiàn)圖 4。 我們通常所說(shuō)的“三”。就是指活三而言。如果是死三,將特別指出。 死三:即對(duì)方有棋子

18、在同一條線(xiàn)相鄰交叉點(diǎn)防守的三;死三分為三種。見(jiàn)圖 5。 眠三:是死三的一種特性,它看上去相鄰點(diǎn)沒(méi)有對(duì)方棋子防守,很像活三,但 由于受空間限制,不論如何發(fā)展都不可能稱(chēng)為活四,故稱(chēng)為“眠三“。見(jiàn)圖 5。 第 5 頁(yè) 共 23 頁(yè) 圖 4 活三 圖 5 死三 反三:反三不是指一種“三”的形狀,而是指再阻止對(duì)方進(jìn)攻的同時(shí)使自己 稱(chēng)為一道活三的反攻,稱(chēng)為反三。 四:四的形狀有三種,它分為:活四,沖四、跳沖四。 活四:在同一條線(xiàn)上相連的四個(gè)同色棋子成為“連五”,如圖 6 所示。 沖四:在同一條線(xiàn)上相連的相同顏色的四個(gè)棋子,它與活四不同的是,其中的 一端有對(duì)方的棋子進(jìn)行阻擋,它只有再在另一端下一手棋才可形成

19、“連五”。 跳沖四:它的形狀在“四”中是比較特殊的,一般分為兩種,它的特點(diǎn)是同一 條線(xiàn)上的同色的四個(gè)棋子,有一個(gè)或兩個(gè)棋子與另外三個(gè)或兩個(gè)棋子之間有一個(gè) 交叉點(diǎn)的間隔,它的下一手棋只有下在間隔的交叉點(diǎn)上才能形成“連五”,因此, 對(duì)方的棋子防守時(shí),也只能阻擋在間隔的交叉點(diǎn)上,見(jiàn)圖 7。 圖 6 活四 第 6 頁(yè) 共 23 頁(yè) 圖 7 跳沖四 圖 8 反沖四 如圖 8,黑棋在 1 點(diǎn)進(jìn)攻,形成一子雙殺,這時(shí)白棋的妙手是在 a 位活三,它 同時(shí)阻擋了黑棋的兩種取勝方法。當(dāng)黑棋仍在 c 位跳沖四活三時(shí),白棋即在 b 位 阻斷黑棋沖四并形成反沖四,是黑棋的進(jìn)攻功虧一簣。 一子雙殺:指用同一手棋同時(shí)形成兩

20、個(gè)勝點(diǎn)的著法。 追下取勝:是指白棋逼迫黑棋形成禁手而取勝的方法。 自由獲勝:除了追下取勝以外的獲勝方法,稱(chēng)之為自由取勝。 禁手(Forbidden):指黑方一子落下同時(shí)形成兩個(gè)或兩個(gè)以上的活三、沖四 或形成長(zhǎng)連的棋形,是對(duì)局中對(duì)黑棋禁止使用的戰(zhàn)術(shù)或被判為負(fù)的行棋手段,見(jiàn) 圖 15。白棋無(wú)禁手,如果黑子在落下的關(guān)鍵的第五子即形成五連的同時(shí),又形成 禁手。此時(shí),因黑方已成連五,故禁手失效,黑方勝利。之所以這么規(guī)定也是為了 規(guī)范比賽,其實(shí)我們業(yè)余的棋手,黑白棋子誰(shuí)先下都不限制,只是先落子會(huì)有比較 大的優(yōu)勢(shì),另一方始終處于防守的被動(dòng)狀態(tài)。所以那一方先下子,他就有禁手,這 是為了保持公平的一種手段。但是

21、職業(yè)連珠五子棋雖然對(duì)黑棋采取了種限制,但 是先行的一方優(yōu)勢(shì)依然很大。在高段位的比賽中還添加了一些規(guī)定,由于很少用 到,就不必詳細(xì)敘述了。 A B C D 第 7 頁(yè) 共 23 頁(yè) E F 圖 9 禁手 見(jiàn)圖 9。A、B、C 中的 x 點(diǎn)為三、三禁手。D、E 中的 X 點(diǎn)為四、四禁 手。F 中的 X 點(diǎn)為長(zhǎng)連禁手。 長(zhǎng)連:相同顏色的連續(xù)六子或六子以上。 .4 五子棋攻防五子棋攻防 五子棋是一項(xiàng)對(duì)抗性很強(qiáng)的運(yùn)動(dòng) ,在開(kāi)局進(jìn)入五手兩打后 ,就開(kāi)始進(jìn)入了 白刃戰(zhàn),相互爭(zhēng)奪先手,任何一方都不能掉以輕心 ,要盡可能少犯錯(cuò)誤,甚至不 犯錯(cuò)誤,否則將會(huì)導(dǎo)致速敗。 眾所周知,連珠五子,連五為勝。

22、有四才能有五 ,有三才有四,以此類(lèi)推。 所以,在五子棋的對(duì)局眾進(jìn)攻和防守都是從 “二”和“三”的爭(zhēng)奪開(kāi)始的。 “好的開(kāi)始是成功的一半 ”,這條格言用在五子棋里再合適不過(guò)了。 五子棋的點(diǎn)的選擇十分關(guān)鍵。五子棋實(shí)際上是通過(guò)選擇最佳的落點(diǎn) ,加 上正確的落子次序,一步一步地占領(lǐng)各個(gè)要點(diǎn) ,最終獲得勝利。 對(duì)局的早期,選點(diǎn)的著眼點(diǎn)主要是使本方的棋子保持聯(lián)系 ,為以后創(chuàng)造盡 可能多的成三、成四的機(jī)會(huì),同時(shí)盡量限制對(duì)方成為好形。由于在五子棋對(duì) 弈過(guò)程中,通過(guò)行棋落點(diǎn)來(lái)控制對(duì)方的落點(diǎn)是可能的 ,比如活三 沖四的應(yīng)點(diǎn) 是可以預(yù)知的,完全有可能通過(guò)不斷走出這樣的先手來(lái)控制對(duì)方的著點(diǎn)直至勝 利。所以,在對(duì)局的后期

23、,就要在精確計(jì)算的前提下 ,盡早發(fā)動(dòng)攻勢(shì),以取得棋 局的控制權(quán),否則一旦貽誤戰(zhàn)機(jī),被對(duì)方搶先發(fā)動(dòng)攻勢(shì) ,就會(huì)成為被控制的一 方。 當(dāng)有多個(gè)攻擊點(diǎn)可供選擇時(shí) ,要選擇后續(xù)手段多,又不會(huì)被對(duì)方反先的著 點(diǎn)。如果是黑方,還特別要注意進(jìn)攻終被對(duì)方反擊時(shí)出現(xiàn)的各種禁手點(diǎn)的可能 性。 進(jìn)攻分為單攻棋和雙攻棋,單攻棋指單線(xiàn)即單行或單向的攻棋子,包括三子 攻棋(活三、填四)和四子攻棋(沖四、填五)。而雙攻棋指雙向或雙行的攻棋。 第 8 頁(yè) 共 23 頁(yè) 包括三、三攻棋(雙活三、雙填四、填四活三);四、三攻棋(沖四活三、沖四填 四、填五活三、填五填四);四四攻棋(雙沖四、雙填五、填五沖四)。 五子棋的取勝思路是

24、由一個(gè)子開(kāi)始,目標(biāo)是運(yùn)用各種方法在棋盤(pán)上發(fā)展出五 連乃至長(zhǎng)連而取勝。在這個(gè)發(fā)展過(guò)程中必然要經(jīng)過(guò)由一子到兩子 兩子到三子 三子到四子的過(guò)程。因此說(shuō),把各種形狀和各個(gè)方面上的二 三 四等子力結(jié)構(gòu)爛 熟于胸,做到舉一反三,是學(xué)習(xí)五子棋的基本功,更是能靈活運(yùn)用五種取勝技巧的 基礎(chǔ)。 3 3JavaJava 3.13.1 JavaJava 簡(jiǎn)介簡(jiǎn)介 Java 是美國(guó) Sun 公司開(kāi)發(fā)的語(yǔ)言,它使用解釋器執(zhí)行代碼,因此,無(wú)需對(duì)源 代碼進(jìn)行任何更改即可在不同計(jì)算機(jī)上運(yùn)行,是真正跨平臺(tái)的編程開(kāi)發(fā)語(yǔ)言。 Java 有以下主要特點(diǎn): 1:簡(jiǎn)單(Simple) 制定 Java 的原則之一,是要建立一種結(jié)構(gòu)簡(jiǎn)單而且使

25、用容易的系統(tǒng),可以讓 用戶(hù)不必接受很深的訓(xùn)練就可以開(kāi)始設(shè)計(jì)程序,所以 Java 的語(yǔ)法盡可能與在當(dāng) 前許多程序設(shè)計(jì)師都采用的 C 及 C語(yǔ)言相似。并且,Java 刪除了 C 及 C+許 多極少使用、不易理解或常被混淆的功能,多多重繼承、指針等。 2:面向?qū)ο?Object-Oriented) 面向?qū)ο笫墙陙?lái)信息界廣為使用的概念和技術(shù)。它有許多良好的特性。 對(duì)象的封裝性可以使對(duì)象的接口定義明確;繼承性可以增加軟件的可重用性,有 助于分類(lèi)及模版設(shè)計(jì)等。實(shí)現(xiàn)面向?qū)ο蟮母拍罴捌涓鞣N良好的特性是 Java 的設(shè) 計(jì)理念之一。 3:分布式(Distributed) 計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展使得信息應(yīng)用朝著分布式

26、的環(huán)境發(fā)展,所以現(xiàn)代的信息開(kāi) 發(fā)語(yǔ)言及環(huán)境要有配合分布式的特性及功能。Java 具有一個(gè)網(wǎng)絡(luò)功能的程序庫(kù),其 中包含與如 HTTP 和 FTP 等 TCP/IP 網(wǎng)絡(luò)通信協(xié)議整合的能力。 4:強(qiáng)壯性(Robust) 由 Java 所編寫(xiě)的程序要能在各種情況下運(yùn)行,而且必須具有高的穩(wěn)定性。 Java 在制定時(shí)即加入了能防止存儲(chǔ)器被覆寫(xiě)和數(shù)據(jù)損壞的相關(guān)處理機(jī)制。 5:安全性(Secure) Java 是被設(shè)計(jì)用于網(wǎng)絡(luò)及分布式環(huán)境中的,所以安全性是一個(gè)很重要的考 慮。Java 擁有數(shù)個(gè)從簡(jiǎn)單到復(fù)雜的安全保護(hù)措施,能有效地防止病毒的侵入和 破壞行為的發(fā)生。 6:結(jié)構(gòu)中立性(Architecture N

27、eutral) 第 9 頁(yè) 共 23 頁(yè) 在網(wǎng)絡(luò)上存在許多不同類(lèi)型的計(jì)算機(jī),從中央處理器到操作系統(tǒng)的機(jī)構(gòu)均有 很高的差異性。因此要使應(yīng)用程序在每一種機(jī)器上均能運(yùn)行是相當(dāng)困難的。針 對(duì)這個(gè)目的,Java 的編譯器可以產(chǎn)生一種結(jié)構(gòu)中立的目標(biāo)碼文件格式字節(jié) 碼(Byte Code)。這種字節(jié)碼可以在許多種不同的計(jì)算機(jī)上運(yùn)行。 7:多線(xiàn)程(Multithreaded) 多線(xiàn)程是開(kāi)發(fā)復(fù)雜和功能強(qiáng)大的程序所必須的手段之一,Java 同樣支持這 個(gè)重要功能。 一個(gè) Java 程序的開(kāi)發(fā)過(guò)程如圖 10 所示。 源文件:文件名.java 由Java解釋器執(zhí)行由瀏覽器執(zhí)行 字節(jié)碼文件 Java編譯器:javac

28、編譯生成 Java應(yīng)用程序 Java小應(yīng)用程序 圖 10 Java 程序的開(kāi)發(fā)過(guò)程 源文件:使用一個(gè)文本編輯器,如 Edit 或記事本來(lái)編寫(xiě)源文件。不可使用 Word 編輯器,因?yàn)樗胁豢梢?jiàn)字符。將編好的源文件保存起來(lái),源文件的擴(kuò)展 名必須是 Java。 編譯器:源文件要經(jīng)過(guò)編譯器(Javac.exe)的編譯生成可擴(kuò)展名為.Class 的 字節(jié)碼文件。字節(jié)碼文件是由與平臺(tái)無(wú)關(guān)的二進(jìn)制碼組成的,執(zhí)行時(shí)由解釋器解 釋成本地機(jī)器碼。 運(yùn)行 Java 程序:Java 程序分為兩大類(lèi)Java 應(yīng)用程序(Application)和 Java 小應(yīng)用程序(Applet)。Java 應(yīng)用程序必須通過(guò) Jav

29、a 解釋器(java.exe)來(lái) 解釋執(zhí)行其字節(jié)碼文件;Java 小應(yīng)用程序可通過(guò)支持 Java 標(biāo)準(zhǔn)的瀏覽器來(lái)解 釋執(zhí)行。 3.23.2 JavaJava 開(kāi)發(fā)環(huán)境開(kāi)發(fā)環(huán)境 使用 Jcreator 開(kāi)發(fā)環(huán)境必須安裝 JDK,我安裝的版本是 1.5.0,在環(huán)境變 量里新建名為 Path 的變量名,變量值為 D:軟件JAVAbin(根據(jù) JDK 的安裝 第 10 頁(yè) 共 23 頁(yè) 目錄而定)。在命令提示窗口輸入 Java -version 如果能正確顯示版本號(hào) ,則 表示環(huán)境配置成功。如圖 11 所示。 圖 11 環(huán)境變量 Jcreator 的安裝很簡(jiǎn)單,這里不在詳細(xì)敘述,把路徑配置好就可以了。

30、如圖 12。 圖 12 Jcreator IDE 4 4課題詳細(xì)研究方法課題詳細(xì)研究方法 4.14.1 程序結(jié)構(gòu)說(shuō)明程序結(jié)構(gòu)說(shuō)明 既然是 Java Application,要實(shí)現(xiàn)網(wǎng)絡(luò)對(duì)戰(zhàn),故采用 C/S 模式編寫(xiě),程序包 含 7 個(gè)獨(dú)立的類(lèi)文件 ChessWZQ.java、Group.java、Message.java、Player.java、ServerOneClie 第 11 頁(yè) 共 23 頁(yè) nt.java、Server.java、BoardPanel.java。 其中 BoardPanel.java 主要負(fù)責(zé)棋盤(pán)的初始化,鼠標(biāo)事件的處理,以及判斷 勝負(fù)條件。ChessWZQ.java

31、定義了面板上的其他元素,包括玩家列表,標(biāo)題欄等。 也包括了事件處理和人工智能。ServerOneClient.java 則負(fù)責(zé)網(wǎng)絡(luò)對(duì)戰(zhàn)的處理。 其他的類(lèi)都是又這 3 個(gè)主類(lèi)延伸出去的。在具體實(shí)現(xiàn)的時(shí)候再介紹其作用。見(jiàn) 圖 13。 初始化 主循環(huán)控制模塊 盤(pán)面分析填寫(xiě)棋 型表 輪到電腦 電腦下子 玩家下子 輪到玩家 勝負(fù)判斷 否則 開(kāi)始 勝利 4.24.2 棋盤(pán)及棋子的類(lèi)棋盤(pán)及棋子的類(lèi) .1 棋盤(pán)棋盤(pán) 棋盤(pán)如圖 1,具體代碼如下: String line = a b c d e f g h i j k l m n o; char rowNum1 = 1,2,3,4,5,6,7,8

32、,9; char rowNum2=1,0,1,1,1,2,1,3,1,4,1,5; 圖 13 五子棋程序流程圖 第 12 頁(yè) 共 23 頁(yè) 這部分為棋盤(pán)的邊界標(biāo)識(shí)符,是必須要有的。用字符數(shù)組存儲(chǔ),最后確定位 置放上去即可。 棋盤(pán)的繪制: private static int xp; / 棋子 X 坐標(biāo) private static int yp; / 棋子 Y 坐標(biāo) public void paint(Graphics gc) super.paint(gc); /this.setBackground(Color.gray); /this.invalidate(); gc.setColor(Co

33、lor.blue); /gc.setColor(new Color(255, 255, 240); /畫(huà)橫向標(biāo)識(shí)符 gc.drawString(line,25,15); / 畫(huà)豎向標(biāo)識(shí)符 for(int i=0;i9;i+) gc.drawChars(rowNum1,i,1,10,35+i*30); for(int i=9,j=0;i15;i+,j+=2) gc.drawChars(rowNum2,j,2,10,35+i*30); / 畫(huà)棋盤(pán) for (int i = 0; i 15; i+) gc.drawLine(30, 30 + i * 30, 450, 30 + i * 30); /行

34、 gc.drawLine(30 + i * 30, 30, 30 + i * 30, 450); /列 gc.drawLine(25, 25, 455, 25); gc.drawLine(25, 25, 25, 455); gc.drawLine(25, 455, 455, 455); gc.drawLine(455, 25, 455, 455); /面板初始化 for(int i=0;i15;i+) for (int j = 0; j =0i+) if (clr=boardx-iy) count+; else break; / System.out.println( +x+ , +y+ )+

35、count = +count); if(count=5) return true; for(i=1;x+i15i+) if(clr=boardx+iy) count+; else break; 第 15 頁(yè) 共 23 頁(yè) if(count=5) return true; return false; 為保證公平,先下子的就有禁手。但是我們一般沒(méi)有這個(gè)規(guī)則限制,都是輪 流先下子。理論上是這樣的。但很多專(zhuān)家表明,先下子有很大的幾率獲勝,即使 有禁手,先下子的一方還是有很大的優(yōu)勢(shì),我覺(jué)得對(duì)于我們一般玩家而言,這些規(guī) 定可以不考慮。 判斷勝負(fù)的不管是單機(jī)還是玩家相互游戲,都必須開(kāi)服務(wù)端,因?yàn)榕袛鄤儇?fù) 是

36、放在里面的。如果有一方獲勝,彈出提示框,如果確認(rèn)則清空棋盤(pán)繼續(xù)新游戲。 public void getVictory(Message msg) JOptionPane.showMessageDialog(null, You Win The Game, Congratulations, JOptionPane.INFORMATION_MESSAGE); /繼續(xù)新游戲 label3.setText(Player2); newGame(); 需要注意的一點(diǎn)是落下的棋子如果離任何一方的邊界小于 4,則以邊界為限 制判斷是否有一方獲勝,這樣的話(huà)也要考慮多種方向,但原理還是和基本情況是 一樣的。 4.44

37、.4 網(wǎng)絡(luò)對(duì)戰(zhàn)網(wǎng)絡(luò)對(duì)戰(zhàn) 這部分也屬于網(wǎng)絡(luò)套接字編程的經(jīng)典應(yīng)用,根據(jù)服務(wù)器 Adress 連接特定端 口。 網(wǎng)絡(luò)部分很簡(jiǎn)單,但是我也做出了自己的特色,就是事件處理,做工可根據(jù)具 體情況修改,雖然沒(méi)有多少實(shí)用價(jià)值,但是也盡量使程序留有擴(kuò)展性。下面給出 了 Message 的代碼。 /* * 消息列表 * type = 1 / 請(qǐng)求連接, msg = 連接者名字 第 16 頁(yè) 共 23 頁(yè) * type = 2 / 放棋子 * type = 3 / 請(qǐng)求和其他人游戲 * type = 4 / 拒絕游戲請(qǐng)求 * type = 5 / 同意請(qǐng)求 * type = 6 / 發(fā)送勝利消息 * type =

38、7 / 斷開(kāi)連接請(qǐng)求 * type = 8 / 保存游戲,但是不放在磁盤(pán)上,在下一局開(kāi)始時(shí)將會(huì)丟失 * type = 9 / 添加新的玩家到所有客戶(hù)端的玩家列表 * 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)閉 *

39、 type = 19/ 玩家結(jié)束游戲及更新 * tyep = 20XX 電腦獲勝/ 玩家獲勝 */ SOCKET 監(jiān)聽(tīng)端口,如果有玩家則更新玩家列表,如果雙擊除自己以外的玩 家,則可以開(kāi)始游戲,發(fā)送游戲請(qǐng)求,如果同意則返回棋子顏色并開(kāi)始游戲,同時(shí) 清空玩家列表。每一下子,把坐標(biāo)傳給服務(wù)端,并在 2 端顯示出來(lái),并且判斷勝負(fù)。 如果,有一方獲勝,則提示消息通知雙方,確定則繼續(xù)開(kāi)始新游戲。 服務(wù)端開(kāi)啟服務(wù)監(jiān)聽(tīng)線(xiàn)程和客戶(hù)端,如圖 15,如果有玩家知道服務(wù)器 IPAdress,即可選擇在線(xiàn)玩家進(jìn)行聯(lián)網(wǎng)游戲,如圖 16。 圖 23 服務(wù)端監(jiān)聽(tīng) 第 17 頁(yè) 共 23 頁(yè) 雙擊除自己以外的一個(gè)玩家,發(fā)出游

40、戲請(qǐng)求,同時(shí)要確定自己棋子的顏色, 用 MSG 發(fā)回服務(wù)端。如果被拒絕,則返回原來(lái)的狀態(tài)。 if(msg.color=1) ss = new String(white); bpanel.setColor(2); else ss = new String(black); bpanel.setColor(1); 圖 16 邀請(qǐng)游戲 4.54.5 電腦電腦 AIAI 廣義上來(lái)講,博弈是指在一定的環(huán)境條件和一定的規(guī)則約束下,依靠自己所 能夠掌握的信息,從各自選擇的行為或是策略進(jìn)行選擇并加以實(shí)施,并從各自取 得相應(yīng)結(jié)果或收益的過(guò)程。馮諾伊曼(John von Neumann,1903-1957)和摩根斯

41、 坦恩(Oskar Margenstern, 1902-1977)在 1944 年出版了博弈論與經(jīng)濟(jì)行為 (Theory of Games and Economic Behavior)一書(shū)中,最早地提出了關(guān)于博弈論的概 念。但是,對(duì)于非合作、純競(jìng)爭(zhēng)型博弈,諾伊曼所解決的只有二人零和博弈。在 這里所抽象化后的博弈問(wèn)題是,已知參與者集合(兩方),策略集合(所有棋著),和 盈利集合(贏子輸子),最終是想去找到一個(gè)理論上的解或平衡,也就是對(duì)參與雙 圖 15 服務(wù)端監(jiān)聽(tīng) 第 18 頁(yè) 共 23 頁(yè) 方來(lái)說(shuō)都最合理、最優(yōu)的具體策略。 而在這里狹義的講,博弈論主要是研究棋手們落子中理性化、邏輯化的部分,并

42、將其系統(tǒng)化為一門(mén)科學(xué)。換言之,博弈就是研究個(gè)體如何在錯(cuò)綜復(fù)雜的相互影響 中得出最合理的策略,博弈論正是衍生于古老的游戲或曰博弈如象棋、撲克等。 數(shù)學(xué)家們將具體的問(wèn)題抽象化,通過(guò)建立自完備的邏輯框架、體系研究其規(guī)律及 變化。 參考了很多五子棋算法,大部分思想差不多,就是搜索估值確定重要性,然后 選取最大的一個(gè)點(diǎn)下子。具體做法如下:為電腦和玩家各建立一張表,用來(lái)存放 棋型數(shù)據(jù),比如“20XX 表“沖四”的點(diǎn),用“15”代表“活三”的點(diǎn),那么在計(jì) 算重要性時(shí),就可以根據(jù) 20XX5 得出前者比后者重要,下子時(shí)電腦便會(huì)自動(dòng)選擇 “沖四”的點(diǎn),這里還要說(shuō)明一點(diǎn)的事,還要考慮四個(gè)方向。因?yàn)橛锌赡苡袕?fù)合 棋

43、型,比如“四三”.從第一步起,不管是哪一方下子,電腦都有以這點(diǎn)為中心搜 索 9X9 的矩陣內(nèi)的所有空白點(diǎn)上棋子的重要性,一顆棋子對(duì)棋型影響的大小有 9X9。重要看來(lái)雖然說(shuō)進(jìn)攻和防守的重要性一樣的,但是我認(rèn)為防守更重要。 在估值的時(shí)候,必須要考慮棋子的合法落子情況。不同的棋類(lèi)博弈,其估值 必定有極大的差別,各種因?yàn)橐?guī)則而造成的不同因素影響估值的設(shè)計(jì)。不同的棋 類(lèi)游戲各有所謂的規(guī)則,規(guī)則中就有博弈雙方都可以走哪些著法。某些博弈游戲 很容易就找到合理著法,我所實(shí)現(xiàn)的五子棋,它就具有很簡(jiǎn)單的落子規(guī)則,即棋盤(pán) 上所有的空位都可以落子,它們都是合理的著法。但是有些棋類(lèi)游戲,比如在中 國(guó)象棋和國(guó)際象棋中,情

44、況就有些復(fù)雜了,每個(gè)棋子都有它特定的著法, 電腦下子要考慮自己和玩家的棋型,優(yōu)先防守,如果沒(méi)有要防的棋型,則搜索 自己的棋型下子。 設(shè)置重要性,即估值模塊,下面只給出橫向的代碼 private void setWeight(int x,int y,int tcolor) int i=RectX1,j=RectY1,value=0,k=0,n=0,flag=0; / - 方向 for(i=RectX1,j=y;i=RectX1 k+) if(BoardPanel.boardi-kj=tcolor) value+; 第 19 頁(yè) 共 23 頁(yè) continue; if(BoardPanel.boa

45、rdi-kj=0)/black space flag+; break; for(k=1;i+kRectX2 k+) if(BoardPanel.boardi+kj=tcolor) value+; if(BoardPanel.boardi+kj=0) flag+; break; n=weight(value,flag); if(weightBoardijn) weightBoardij=n; 設(shè)定相應(yīng)空位的重要值以后,選取最大的值下子,代碼如下: private void getBiggest(int arr,int x,int y) int temp=new int2; int swt=arr

46、00,tmp=0; for(int i=0;i15;i+) for(int j=0;jswt) temp0=i;temp1=j; swt=arrij; 第 20 頁(yè) 共 23 頁(yè) x=temp0; y=temp1; arrxy=0; 對(duì)于特定的棋型,都有一個(gè)不同的估值,以此來(lái)區(qū)別不同棋型的優(yōu)劣,也以此 來(lái)決定最終的落子位置。毫無(wú)疑問(wèn),像已有四子連成一線(xiàn)且還可以繼續(xù)落子的情 況,明顯要比只有三個(gè)子連成一線(xiàn)的情況要好,或者說(shuō)優(yōu)先級(jí)要更高,對(duì)弈雙方對(duì) 此種棋局,肯定都是把第一種情況放為首要分析的位置上。因此,要使棋手做出 這種判斷,就要把第一種情況的估值設(shè)置得高。 對(duì)不同的棋型設(shè)置重要值,比如:活四

47、、死四、活三、死三、活二、死二。 同理,和判斷勝負(fù)一樣下子也要考慮邊界特殊情況,矩形設(shè)置如下: private void setRect(int x,int y) if(x-40) RectX1=x-4; else RectX1=0; if(x+414) RectX2=14; else RectX2=x+4; if(y-40) RectY1=y-4; else RectY1=0; if(y+414) RectY2=14; else RectY2=y+4; if(RectX1RectY1) RectX1 = x-(y-RectY1); else RectY1 = y-(x-RectX1); if

48、(RectX2RectY2) RectY2 = y+(RectX2-x); else RectX2 = x+(RectY2-y); 努力提高電腦 AI 一直是五子棋游戲關(guān)鍵,第一步的人工智能只是估值和搜 索算法的集合,要真正的提高電腦 AI 還有很多步,例如,我的電腦 AI 只是片面的 分析了雙方的器型,沒(méi)有前瞻性。如果玩家多想幾步,電腦就發(fā)現(xiàn)不了。不過(guò)即 使沒(méi)采用遞歸算法,要是讓電腦先下子的話(huà),你的大部分時(shí)間也是花在防守上,可 能是我的棋力太菜了,我自己還沒(méi)有下贏過(guò)電腦。 目前有 2 種方法提高電腦棋力:一是遞歸算法,二是增加細(xì)致的特定棋形的 判斷,鑒于自己對(duì)算法方面欠缺甚多,沒(méi)有辦法完成這個(gè)功能,實(shí)在是遺憾。我大 體說(shuō)一下這 2 種算法的思路:遞歸算法的意思可以說(shuō)成“今后幾步預(yù)測(cè)法”,首 先讓電腦分析一個(gè)可能的點(diǎn),如果在這兒下子將會(huì)形成對(duì)手不得不防守的棋型 第 21 頁(yè) 共 23 頁(yè) (例如:“沖四”、“活三”);那么下一步對(duì)手就會(huì)照你的思路來(lái)防守你,如此 一來(lái)便完成了第一步的預(yù)測(cè)。這時(shí)候在調(diào)用盤(pán)面分析模塊對(duì)預(yù)測(cè)后的棋型進(jìn)行 分析,如果出現(xiàn)了“四三”、“雙三”或“雙四”等制勝點(diǎn),那么己方就可以獲 勝了。否則照同樣的方法向下分析,就可以預(yù)測(cè)出多步。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論