五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)論文】_第1頁(yè)
已閱讀1頁(yè),還剩33頁(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>  本科畢業(yè)論文(設(shè)計(jì))</p><p> 題 目:五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)</p><p> 學(xué) 院:</p><p> 學(xué)生姓名:</p><p> 專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)</p><p> 班 級(jí):</p><p> 指導(dǎo)教師:</p>

2、<p> 起止日期:</p><p><b>  摘要</b></p><p>  五子棋作為一個(gè)棋類競(jìng)技運(yùn)動(dòng),在民間十分流行。為了將在學(xué)校里所學(xué)到的知識(shí)運(yùn)用到實(shí)踐當(dāng)中,并且在一定程度上做到融會(huì)貫通,因此選擇用Java設(shè)計(jì)并實(shí)現(xiàn)一個(gè)五子棋游戲。主要完成了人機(jī)對(duì)戰(zhàn)和玩家之間聯(lián)網(wǎng)對(duì)戰(zhàn)2個(gè)功能。網(wǎng)絡(luò)連接部分為Socket編程應(yīng)用,客戶端和服務(wù)器端的交互用Cla

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

4、有很大的參考作用。</p><p>  關(guān)鍵詞:深度搜索;估值;電腦AI;五子棋;算法</p><p><b>  Abstract</b></p><p>  As a sport, gobang is very popular in civil, In order to use the knowledge learned in school

5、 into practice and achieve mastery in a certain extent, I decide to use the Java to develope gobang games and complete the two functions including man-machine war and man-man war. Network Connection is Socket Programming

6、 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</p><p>  Keywords:

7、 Search depth; Valuation; Computer AI; Gobang ; Algorithm </p><p><b>  目 錄</b></p><p><b>  摘要0</b></p><p>  Abstract0</p><p><b>  1 引言1

8、</b></p><p>  1.1 選題背景1</p><p>  1.2 本課題研究的意義1</p><p>  1.3 本課題的研究方法2</p><p>  2 五子棋游戲軟件的系統(tǒng)分析4</p><p>  2.1 問(wèn)題定義4</p><p>  2.2 可行性研

9、究4</p><p>  2.2.1 技術(shù)可行性4</p><p>  2.3 操作可行性4</p><p>  2.4 系統(tǒng)需求分析4</p><p>  2.4.1 確定對(duì)系統(tǒng)的綜合要求4</p><p><b>  3 五子棋基礎(chǔ)5</b></p><p>

10、;<b>  3.1 五子棋5</b></p><p>  3.1.1 棋盤和棋子5</p><p>  3.1.2 規(guī)則及解釋5</p><p>  3.1.3 五子棋常用術(shù)語(yǔ)6</p><p>  3.1.4 五子棋攻防9</p><p>  4 開發(fā)環(huán)境及工具簡(jiǎn)介11</p

11、><p>  4.1 Java簡(jiǎn)介11</p><p>  4.2 Java開發(fā)環(huán)境12</p><p>  5 五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)14</p><p>  5.1 程序結(jié)構(gòu)說(shuō)明14</p><p>  5.2 棋盤及棋子的類15</p><p>  5.2.1 棋盤15</p&

12、gt;<p><b>  5.3 棋子16</b></p><p>  5.4 勝負(fù)判斷條件17</p><p>  5.5 網(wǎng)絡(luò)對(duì)戰(zhàn)20</p><p>  5.6 電腦AI23</p><p><b>  6 結(jié)論28</b></p><p>&l

13、t;b>  7 參考文獻(xiàn)29</b></p><p><b>  引言</b></p><p><b>  選題背景</b></p><p>  五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一?,F(xiàn)代五子棋日文稱之為連珠,亦有連五子、五子連、串珠、五目、五目碰、五格等多種稱謂。</p><p

14、>  五子棋起源于古代中國(guó),發(fā)展于日本,風(fēng)靡于歐洲。對(duì)于它與圍棋的關(guān)系有兩種說(shuō)法,一說(shuō)早于圍棋,早在 “ 堯造圍棋 ” 之前,民間就已有五子棋游戲;一說(shuō)源于圍棋,是圍棋發(fā)展的一個(gè)分支。在中國(guó)的文化里,倍受人們的青睞。本世紀(jì)初五子棋傳入歐洲并迅速風(fēng)靡全歐。通過(guò)一系列的變化,使五子棋這一簡(jiǎn)單的游戲復(fù)雜化、規(guī)范化,而最終成為與國(guó)際象棋等其他棋類競(jìng)技一樣的職業(yè)連珠五子棋,同時(shí)也成為一種國(guó)際比賽棋。</p><p>

15、  Java語(yǔ)言是當(dāng)今最為流行的程序設(shè)計(jì)語(yǔ)言之一,作為一門非常優(yōu)秀的,極為健壯的編程語(yǔ)言,它所具有的面向?qū)ο螅c平臺(tái)無(wú)關(guān),分布式應(yīng)用,安全,穩(wěn)定和多線程等優(yōu)良的特征,使用Java編程語(yǔ)言,可以開發(fā)出功能強(qiáng)大的大型應(yīng)用程序,同時(shí)Java語(yǔ)言本身突出的跨平臺(tái)的特性也使得它特別適合于Internet上的應(yīng)用程序開發(fā),可以這樣說(shuō),Java的出現(xiàn)使得所開發(fā)的應(yīng)用程序“一次編寫,處處可用”的實(shí)現(xiàn)成為了可能。

16、 &

17、lt;/p><p><b>  本課題研究的意義</b></p><p>  近來(lái)隨著計(jì)算機(jī)的快速發(fā)展,各種各樣的電腦游戲?qū)映霾桓F,使得人們能有更多的娛樂(lè)項(xiàng)目,棋類游戲不僅能鍛煉人的思維和修身養(yǎng)性,還有開發(fā)智力和娛樂(lè)大眾等作用,而且棋類游戲水平頗高,大有與人腦分庭抗禮之勢(shì)。其中戰(zhàn)勝過(guò)國(guó)際象棋世界冠軍-卡斯帕羅夫的“深藍(lán)”便是最具說(shuō)服力的代表;其它像圍棋的“手淡”、象棋的“

18、將族”等也以其優(yōu)秀的人工智能深受棋迷喜愛(ài)。</p><p>  越來(lái)越多的具有智能的機(jī)器進(jìn)入了人類的生活,人工智能的重要性如今顯而易見(jiàn)。自己本身對(duì)人工智能比較感興趣,而五子棋游戲程序的設(shè)計(jì)與實(shí)現(xiàn)這個(gè)課題,正好提供給自己這樣一個(gè)研究的機(jī)會(huì),通過(guò)對(duì)人工智能中博弈方面的研究,讓自己在簡(jiǎn)單的人機(jī)對(duì)弈全局設(shè)計(jì),以及具體到相關(guān)算法上有了深入的了解。人工智能屬于計(jì)算機(jī)科學(xué)的領(lǐng)域,它以計(jì)算機(jī)技術(shù)為基礎(chǔ),近幾十年來(lái),它的理論和技術(shù)

19、已經(jīng)日益成熟,應(yīng)用領(lǐng)域也正在不斷擴(kuò)大,顯示出強(qiáng)大的生命力。人工智能大致可以分成幾個(gè)學(xué)科,包括機(jī)器人,語(yǔ)言識(shí)別,圖像識(shí)別等,它們每一個(gè)都是獨(dú)特的,但是它們常常又互相結(jié)合起來(lái)完成設(shè)計(jì)任務(wù),這時(shí),這些學(xué)科之間的差別就變的很模糊。人工智能在專家系統(tǒng),自然語(yǔ)言理解,自動(dòng)定理證明,自動(dòng)程序設(shè)計(jì),人工智能在機(jī)器人學(xué)、模式識(shí)別、物景分析、數(shù)據(jù)庫(kù)的智能檢索、機(jī)器下棋和家用電器智能化等領(lǐng)域都有廣泛的應(yīng)用。而這個(gè)課題就是和人工智能中的博弈論領(lǐng)域緊密相關(guān)的。&

20、lt;/p><p>  這個(gè)題目核心是人工智能和Socekt編程,。并且人工智能中的博弈部分,由于采用了大量的搜索算法,其中很多被利用到各方面。它的概念、方法和技術(shù),正在各行各業(yè)廣泛滲透。智能已經(jīng)成為當(dāng)今各種新產(chǎn)品、新裝備的發(fā)展方向。所以,趁著這個(gè)機(jī)會(huì),對(duì)人工智能中比較容易實(shí)現(xiàn)的人機(jī)博弈進(jìn)行了解,研究和學(xué)習(xí),也是很實(shí)用且很有必要的。</p><p><b>  本課題的研究方法<

21、;/b></p><p>  1、開發(fā)工具:由于Jcreator,有高亮語(yǔ)法編輯、使用向?qū)б约巴耆ㄖ频挠脩艚缑妫钪饕氖悄軌蜃詣?dòng)查找文件于 Main 方法或 Html 文件以支持Java 小應(yīng)用程序,然后啟動(dòng)相應(yīng)的工具。因此,選擇這個(gè)開發(fā)工具可以使實(shí)際操作的過(guò)程變得不那么復(fù)雜。</p><p>  2、程序的結(jié)構(gòu)框架設(shè)計(jì):由于Applet運(yùn)行速度較慢,如果再加上算法搜索時(shí)間,顯然

22、不符合程序的設(shè)計(jì)要求,因此,本次設(shè)計(jì)使用Java應(yīng)用程序開發(fā)。</p><p>  整個(gè)程序的功能實(shí)現(xiàn)流程如下:</p><p><b>  數(shù)據(jù)結(jié)構(gòu)</b></p><p>  先來(lái)看看數(shù)據(jù)結(jié)構(gòu)所需要的變量。首先得為整個(gè)棋盤建立一張表格用以記錄棋子信息,本次設(shè)計(jì)使用一個(gè)15*15的二維數(shù)組Table[15][15](五子棋的棋盤大小為15*1

23、5),數(shù)組的每一個(gè)元素對(duì)應(yīng)棋盤上的一個(gè)交叉點(diǎn),用“0”表示空位、“1”代表己方的子、“2”代表對(duì)方的子,這張表也是今后分析的基礎(chǔ)。在此之后還要為電腦和玩家雙方各建立一張棋型表Computer[15][15][4]和Player[15][15][4],用來(lái)存放棋型、數(shù)據(jù),就是剛才所說(shuō)的重要程度,比如用“20”代表“沖四”的點(diǎn),用“15”代表“活三”的點(diǎn),那么在計(jì)算重要性時(shí),就可以根據(jù)20>15得出前者比后者重要,下子時(shí)電腦便會(huì)自動(dòng)選

24、擇“沖四”的點(diǎn)。棋型表使用三維數(shù)組是因?yàn)槠灞P上的每一個(gè)點(diǎn)都可以與橫、豎、左斜、右斜四個(gè)方向的棋子構(gòu)成不同的棋型,所以一個(gè)點(diǎn)總共有4個(gè)記錄;這樣做的另一個(gè)好處是可以輕易判定出復(fù)合棋型,例如:假如同一點(diǎn)上有2個(gè)“15”就是雙三、有一個(gè)“15”和一個(gè)“20”就是四三。3個(gè)數(shù)組構(gòu)成了程序的基本數(shù)據(jù)骨架,今后只要再加入一些輔助變量便可以應(yīng)付自如了。有了這么多有用的數(shù)據(jù),就可以深入到程序的流程中去了。</p><p>&l

25、t;b>  程序流程</b></p><p>  本文主要討論五子棋的核心算法,人工智能部分。本程序由六個(gè)基本功能模塊所構(gòu)成,各模塊的具體分析如下:</p><p>  初始化:首先,建立盤面數(shù)組Table[15][15]、對(duì)戰(zhàn)雙方的棋型表Computer[15][15][4]和Player[15][15][4]并將它們清零以備使用;然后初始化顯示器、鍵盤、鼠等輸入輸出

26、設(shè)備并在屏幕上畫出棋盤。</p><p>  主循環(huán)控制模塊:控制下棋順序,當(dāng)輪到某方下子時(shí),負(fù)責(zé)將程序轉(zhuǎn)到相應(yīng)的模塊中去,主要擔(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>  盤面分析填寫棋型表:本

27、程序核心模塊之一,人工智能算法的根本依據(jù)。其具體實(shí)現(xiàn)方法如下:在下五子棋時(shí),一定會(huì)先根據(jù)棋盤上的情況,找出當(dāng)前最重要的一些點(diǎn)位,如“活三”、“沖四”等;然后再在其中選擇落子點(diǎn)。但是,電腦不會(huì)像人一樣分析問(wèn)題,要讓其知道哪是“活三”、哪是“沖四”,就得在棋盤上逐點(diǎn)計(jì)算,一步一步的教它。先來(lái)分析己方的棋型,從棋盤左上角出發(fā),向右逐行搜索,當(dāng)碰到一個(gè)空白點(diǎn)時(shí),以它為中心向左查找,假如碰到己方的棋子則記錄然后繼續(xù),假如碰到對(duì)方的棋子、空白點(diǎn)或邊

28、界就停止查找。左邊完成后再向右進(jìn)行同樣的操作;最后把左右兩邊的記錄合并起來(lái),得到的數(shù)據(jù)就是該點(diǎn)橫向上的棋型,然后把棋型的編號(hào)填入到Computer[x][y][n]中就行了(x、y代表坐標(biāo),n=0、1、2、3分別代表橫、豎、左斜、右斜四個(gè)方向)。而其他三個(gè)方向的棋型也可用同樣的方法得到,當(dāng)搜索完整張棋盤后,己方棋型表也就填寫完畢了。然后再用同樣的方法填寫對(duì)方棋型表。所有棋型的編號(hào)都要事先定義好,越重要的號(hào)數(shù)越大。</p>

29、<p>  電腦下子:有了上面填寫的兩張棋型表,現(xiàn)在要作的就是讓電腦知道在哪一點(diǎn)下子了。其中最簡(jiǎn)單的計(jì)算方法,就是遍歷棋型表Computer[15][15][4]和Player[15][15][4]找出其中數(shù)值最大的一點(diǎn),在該點(diǎn)下子即可。但這種算法的弱點(diǎn)非常明顯,只顧眼前利益,不能顧全大局,這就和許多五子棋初學(xué)者一樣犯了“目光短淺”的毛病。要解決這個(gè)問(wèn)題,本文引入“今后幾步猜測(cè)法”,具體方法是這樣的:首先,讓電腦分析一個(gè)可能

30、的點(diǎn),假如在這兒下子將會(huì)形成對(duì)手不得不防守的棋型(例如:“沖四”、“活三”);那么下一步對(duì)手就會(huì)照自己的思路下子來(lái)進(jìn)行防守,如此一來(lái)便完成了第一步的猜測(cè)。這時(shí)再調(diào)用模塊4對(duì)猜測(cè)后的棋進(jìn)行盤面分析,假如出現(xiàn)了“四三”、“雙三”或“雙四”等制勝點(diǎn),那么己方就可以獲勝了;否則照同樣的方法向下分析,就可猜測(cè)出第二步、第三步……如果盤面上沒(méi)有對(duì)手必須防的棋型,那么進(jìn)攻不成的話就得考慮防守了,將自己和對(duì)手調(diào)換一下位置,然后用上面的方法來(lái)猜測(cè)對(duì)手的棋

31、。</p><p>  網(wǎng)絡(luò)對(duì)戰(zhàn)涉及算法較少,所以先實(shí)現(xiàn)網(wǎng)絡(luò)部分,實(shí)現(xiàn)基本的棋盤和棋子的類,添加判斷勝負(fù)條件,這部分是基礎(chǔ),也是很重要的,電腦AI也在這些基礎(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)的五

32、子棋算法,參考了一些游戲設(shè)計(jì)算法,詳細(xì)比較各種算法的優(yōu)缺點(diǎn),而且參考了現(xiàn)代五子棋比賽的各種規(guī)則和技巧,盡量聯(lián)系實(shí)際,取精去糟,努力提高電腦AI。</p><p>  五子棋游戲軟件的系統(tǒng)分析</p><p><b>  問(wèn)題定義</b></p><p>  問(wèn)題定義階段必須確定系統(tǒng)應(yīng)該做什么,一般應(yīng)通過(guò)對(duì)客戶的訪問(wèn)調(diào)查,讓系統(tǒng)分析員扼要地寫出關(guān)

33、于問(wèn)題性質(zhì)、工作目標(biāo)和工程規(guī)模的書面報(bào)告,經(jīng)過(guò)討論和必要的修改之后這份報(bào)告應(yīng)該得到客戶的確認(rèn)。由于此程序操作簡(jiǎn)單功能較少,只是實(shí)現(xiàn)了人機(jī)對(duì)弈和人人對(duì)弈的基本操作。</p><p><b>  可行性研究</b></p><p><b>  技術(shù)可行性</b></p><p>  Java語(yǔ)言的優(yōu)良特性使得Java應(yīng)用具有無(wú)

34、比的健壯性和可靠性,這也減少了應(yīng)用系統(tǒng)的維護(hù)費(fèi)用。Java對(duì)對(duì)象技術(shù)的全面支持和Java平臺(tái)內(nèi)嵌的API能縮短應(yīng)用系統(tǒng)的開發(fā)時(shí)間并降低成本。Java的編譯一次,到處可運(yùn)行的特性使得它能夠提供一個(gè)隨處可用的開放結(jié)構(gòu)和在多平臺(tái)之間傳遞信息的低成本方式。特別是Java企業(yè)應(yīng)用編程接口(Java Enterprise APIs)為企業(yè)計(jì)算及電子商務(wù)應(yīng)用系統(tǒng)提供了有關(guān)技術(shù)和豐富的類庫(kù)。</p><p><b> 

35、 操作可行性</b></p><p>  操作非常簡(jiǎn)單,本系統(tǒng)提供了直觀的游戲界面設(shè)置,只要點(diǎn)游戲按鈕里面的開局就可以開始游戲了,當(dāng)然你可以先選好是和電腦對(duì)弈還是和自己對(duì)弈。其他一些功能都可以自愿選擇,操作起來(lái)很方便。</p><p><b>  系統(tǒng)需求分析</b></p><p>  確定對(duì)系統(tǒng)的綜合要求</p>

36、<p>  功能需求。五子棋游戲軟件的必須完成的功能是:能進(jìn)行人機(jī)對(duì)弈和人人對(duì)弈的基本操作,輸贏后的相關(guān)提示。</p><p>  2、性能需求。為了保證系統(tǒng)能夠長(zhǎng)期、安全、穩(wěn)定、可靠、高效的運(yùn)行,系統(tǒng)應(yīng)該滿足以下的性能需求:系統(tǒng)處理的準(zhǔn)確性和及時(shí)性是系統(tǒng)的必要性能,五子棋游戲軟件在開發(fā)過(guò)程中,應(yīng)該充分考慮以后的可擴(kuò)充性,要求系統(tǒng)提供足夠的手段進(jìn)行功能的調(diào)整和擴(kuò)充。</p><p&g

37、t;<b>  五子棋基礎(chǔ)</b></p><p><b>  五子棋</b></p><p><b>  棋盤和棋子</b></p><p>  現(xiàn)代五子棋棋盤,經(jīng)過(guò)國(guó)際棋聯(lián)的多次修改,最終定為15 X 15路,即棋盤由橫豎各15條平行線交叉組成,共有225個(gè)交叉點(diǎn);棋盤上共有五個(gè)星位,中間的星位稱

38、為天元,周圍四點(diǎn)為小星,與圍棋盤略有不同。見(jiàn)圖3-1</p><p><b>  圖3-1 棋盤</b></p><p>  五子棋的棋子和圍棋相同,分黑白2種顏色,通常為散圓形,有一面凸起或二面凸起等形狀,一副棋子總數(shù)為225枚,其中黑子113枚,白子112枚。</p><p>  關(guān)于計(jì)時(shí),正規(guī)比賽按不同級(jí)別設(shè)置了不同的時(shí)間限制,一般的玩家

39、都沒(méi)有這個(gè)限制。比賽中,初賽每局30分鐘后開始讀秒,為60秒/步,決賽使用時(shí)鐘,每方各15分鐘,超時(shí)判負(fù)。</p><p><b>  規(guī)則及解釋</b></p><p>  黑棋先行,白棋隨后。從天元開始相互順序落子。</p><p>  最先在棋盤的橫向、豎向、斜向形成連續(xù)的相同色五個(gè)棋子的一方為勝利。</p><p&g

40、t;  黑棋禁手判負(fù)、白棋無(wú)禁手。黑棋禁手包括“三、三”;“四、四”;“長(zhǎng)連”。黑方只能用“四、三”去取勝。</p><p>  如分不出勝負(fù),則定位平局。</p><p>  對(duì)局中拔子、中途退場(chǎng)均判為負(fù)</p><p>  五連與禁手同時(shí)形成,先五為勝。</p><p>  黑方禁手形成時(shí),白方應(yīng)立即指出。若白方未發(fā)現(xiàn)或發(fā)現(xiàn)后不立即指正,

41、反而繼續(xù)落子,則不能判黑方負(fù)。 </p><p>  五子棋是由兩個(gè)人在一盤棋上進(jìn)行對(duì)抗的棋類競(jìng)技運(yùn)動(dòng)。在對(duì)局開始時(shí),先由執(zhí)黑棋的一方將一枚棋子的落在“天元”上,然后由執(zhí)白棋的一方在黑棋周圍的交叉點(diǎn)上落子。如此輪流落子直到某一方首先在棋盤的直線,橫線或斜線上形成連續(xù)的五子或五子以上,則該方就算獲勝。但是五子棋的特點(diǎn)是先行的一方優(yōu)勢(shì)很大。因此,在職業(yè)比賽種對(duì)黑方做了種種限制,以更好的做到公平競(jìng)爭(zhēng)。黑白雙方的勝負(fù)結(jié)果

42、必須按照職業(yè)五子棋的規(guī)則要求來(lái)決定。</p><p><b>  五子棋常用術(shù)語(yǔ)</b></p><p>  二:二是五子棋的一切進(jìn)攻的基礎(chǔ);又分為活二和死二。</p><p>  活二:即再下一子可形成活三的二,見(jiàn)圖3-2。</p><p>  死二:即再下一子可形成死三的二,見(jiàn)圖3-3。</p><

43、;p>  圖3-2 活二 圖3-3 死二</p><p>  三:三是五子棋最常見(jiàn)的攻擊手段。三分為活三、死三、眠三。</p><p>  活三:為再下一子即可變成活四的三(活四介紹見(jiàn)后)?;蛉譃檫B三、跳三。見(jiàn)圖3-4。</p><p>  通常所說(shuō)的“三”。就是指活三而言。如果是死三,將特別指

44、出。</p><p>  死三:即對(duì)方有棋子在同一條線相鄰交叉點(diǎn)防守的三;死三分為三種。見(jiàn)圖3-5。 </p><p>  眠三:是死三的一種特性,它看上去相鄰點(diǎn)沒(méi)有對(duì)方棋子防守,很像活三,但由于受空間限制,不論如何發(fā)展都不可能稱為活四,故稱為“眠三“。見(jiàn)圖3-5。</p><p>  圖3-4 活三 圖3-

45、5 死三</p><p>  反三:反三不是指一種“三”的形狀,而是指再阻止對(duì)方進(jìn)攻的同時(shí)使自己稱為一道活三的反攻,稱為反三。</p><p>  四:四的形狀有三種,它分為:活四,沖四、跳沖四。</p><p>  活四:在同一條線上相連的四個(gè)同色棋子成為“連五”,如圖3-6所示。</p><p>  沖四:在同一條線上相連的相同顏色的四個(gè)

46、棋子,它與活四不同的是,其中的一端有對(duì)方的棋子進(jìn)行阻擋,它只有再在另一端下一手棋才可形成“連五”。 </p><p>  跳沖四:它的形狀在“四”中是比較特殊的,一般分為兩種,它的特點(diǎn)是同一條線上的同色的四個(gè)棋子,有一個(gè)或兩個(gè)棋子與另外三個(gè)或兩個(gè)棋子之間有一個(gè)交叉點(diǎn)的間隔,它的下一手棋只有下在間隔的交叉點(diǎn)上才能形成“連五”,因此,對(duì)方的棋子防守時(shí),也只能阻擋在間隔的交叉點(diǎn)上,見(jiàn)圖3-7。</p>&

47、lt;p>  圖3-7 跳沖四 圖3-8 反沖四</p><p>  如圖3-8,黑棋在1點(diǎn)進(jìn)攻,形成一子雙殺,這時(shí)白棋的妙手是在a位活三,它同時(shí)阻擋了黑棋的兩種取勝方法。當(dāng)黑棋仍在c位跳沖四活三時(shí),白棋即在b位阻斷黑棋沖四并形成反沖四,是黑棋的進(jìn)攻功虧一簣。</p><p>  一子雙殺:指用同一手棋同時(shí)形成兩個(gè)勝點(diǎn)的著法

48、。 </p><p>  追下取勝:是指白棋逼迫黑棋形成禁手而取勝的方法。</p><p>  自由獲勝:除了追下取勝以外的獲勝方法,稱之為自由取勝。</p><p>  禁手(Forbidden):指黑方一子落下同時(shí)形成兩個(gè)或兩個(gè)以上的活三、沖四或形成長(zhǎng)連的棋形,是對(duì)局中對(duì)黑棋禁止使用的戰(zhàn)術(shù)或被判為負(fù)的行棋手段

49、,見(jiàn)圖3-9。白棋無(wú)禁手,如果黑子在落下的關(guān)鍵的第五子即形成五連的同時(shí),又形成禁手。此時(shí),因黑方已成連五,故禁手失效,黑方勝利。之所以這么規(guī)定也是為了規(guī)范比賽,其實(shí)通常業(yè)余的棋手,黑白棋子誰(shuí)先下都不限制,只是先落子會(huì)有比較大的優(yōu)勢(shì),另一方始終處于防守的被動(dòng)狀態(tài)。所以那一方先下子,他就有禁手,這是為了保持公平的一種手段。但是職業(yè)連珠五子棋雖然對(duì)黑棋采取了種限制,但是先行的一方優(yōu)勢(shì)依然很大。在高段位的比賽中還添加了一些規(guī)定,由于很少用到,就

50、不必詳細(xì)敘述了。</p><p>  A B C D</p><p>  E F </p><p><b>  圖3-9 禁手</b></p><p>  見(jiàn)圖3-9。A、B

51、、C 中的 x 點(diǎn)為三、三禁手。D、E 中的 X 點(diǎn)為四、四禁手。F中的 X 點(diǎn)為長(zhǎng)連禁手。</p><p>  長(zhǎng)連:相同顏色的連續(xù)六子或六子以上。 </p><p><b>  五子棋攻防</b></p><p>  五子棋是一項(xiàng)對(duì)抗性很強(qiáng)的運(yùn)動(dòng),在開局進(jìn)入五手兩打后,就開始進(jìn)入了白刃戰(zhàn),相互爭(zhēng)奪先手,任何一方都不能掉以輕心,要盡可能少失誤

52、,甚至不失誤,否則將會(huì)導(dǎo)致速敗。</p><p>  眾所周知,連珠五子,連五為勝。有四才能有五,有三才有四,以此類推。所以,在五子棋的對(duì)局中進(jìn)攻和防守通常都是從“二”或者“三”的爭(zhēng)奪開始的?!昂玫拈_始是成功的一半”,這條格言用在五子棋里再合適不過(guò)了。五子棋的點(diǎn)的選擇十分關(guān)鍵。五子棋實(shí)際上是通過(guò)選擇最佳的落點(diǎn),加上正確的落子次序,一步一步地占領(lǐng)各個(gè)要點(diǎn),最終獲得勝利。</p><p>  

53、對(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ì)局的后期,就要在精確計(jì)算的前提下,盡早發(fā)動(dòng)攻勢(shì),以取得棋局的控制權(quán),否則一旦貽誤戰(zhàn)機(jī),被對(duì)方搶先發(fā)動(dòng)攻勢(shì),就會(huì)成為被控制的一方。當(dāng)有多個(gè)攻擊點(diǎn)可供選擇時(shí),要選擇

54、后續(xù)手段多,又不會(huì)被對(duì)方反先的著點(diǎn)。如果是黑方,還特別要注意進(jìn)攻終被對(duì)方反擊時(shí)出現(xiàn)的各種禁手點(diǎn)的可能性。 </p><p>  進(jìn)攻分為單攻棋和雙攻棋,單攻棋指單線即單行或單向的攻棋子,包括三子攻棋(活三、填四)和四子攻棋(沖四、填五)。而雙攻棋指雙向或雙行的攻棋。包括三、三攻棋(雙活三、雙填四、填四活三);四、三攻棋(沖四活三、沖四填四、填五活三、填五填四);四四攻棋(

55、雙沖四、雙填五、填五沖四)。</p><p>  五子棋的取勝思路是由一個(gè)子開始,目標(biāo)是運(yùn)用各種方法在棋盤上發(fā)展出五連乃至長(zhǎng)連而取勝。在這個(gè)發(fā)展過(guò)程中必然要經(jīng)過(guò)由一子到兩子,兩子到三子,三子到四子的過(guò)程。因此說(shuō),把各種形狀和各個(gè)方面上的二、三、四等結(jié)構(gòu)爛熟于胸,做到舉一反三,是學(xué)習(xí)五子棋的基本功,更是能靈活運(yùn)用五種取勝技巧的基礎(chǔ)。</p><p><b>  開發(fā)環(huán)境及工具簡(jiǎn)介&

56、lt;/b></p><p><b>  Java簡(jiǎn)介</b></p><p>  Java是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語(yǔ)言(以下簡(jiǎn)稱Java語(yǔ)言)和Java平臺(tái)的總稱。用Java實(shí)現(xiàn)的Hot Java瀏覽器(支持Java applet)顯示了Java的魅力:跨平臺(tái)、動(dòng)態(tài)的Web、Internet計(jì)算。從此,Ja

57、va被廣泛接受并推動(dòng)了Web的迅速發(fā)展,常用的瀏覽器現(xiàn)在均支持Java applet。另一方面,Java技術(shù)也不斷更新。</p><p>  Java平臺(tái)由Java虛擬機(jī)(Java Virtual Machine)和Java 應(yīng)用編程接口(Application Programming Interface、簡(jiǎn)稱API)構(gòu)成。Java 應(yīng)用編程接口為Java應(yīng)用提供了一個(gè)獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)接口,可分為基本部分和擴(kuò)

58、展部分。在硬件或操作系統(tǒng)平臺(tái)上安裝一個(gè)Java平臺(tái)之后,Java應(yīng)用程序就可運(yùn)行?,F(xiàn)在Java平臺(tái)已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運(yùn)行。</p><p>  Java有以下主要特點(diǎn):</p><p>  1、簡(jiǎn)單(Simple)</p><p>  制定Java的原則之一,是要建立一種結(jié)構(gòu)簡(jiǎn)單而且使用容易的系統(tǒng),可以讓

59、用戶不必接受很深的訓(xùn)練就可以開始設(shè)計(jì)程序,所以Java的語(yǔ)法盡可能與在當(dāng)前許多程序設(shè)計(jì)師都采用的C及C++語(yǔ)言相似。并且,Java刪除了C及C++許多極少使用、不易理解或常被混淆的功能,多多重繼承、指針等。</p><p>  2、面向?qū)ο?Object-Oriented)</p><p>  面向?qū)ο笫墙陙?lái)信息界廣為使用的概念和技術(shù)。它有許多良好的特性。對(duì)象的封裝性可以使對(duì)象的接口定義

60、明確;繼承性可以增加軟件的可重用性,有助于分類及模版設(shè)計(jì)等。實(shí)現(xiàn)面向?qū)ο蟮母拍罴捌涓鞣N良好的特性是Java的設(shè)計(jì)理念之一。</p><p>  3、分布式(Distributed)</p><p>  計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展使得信息應(yīng)用朝著分布式的環(huán)境發(fā)展,所以現(xiàn)代的信息開發(fā)語(yǔ)言及環(huán)境要有配合分布式的特性及功能。Java具有一個(gè)網(wǎng)絡(luò)功能的程序庫(kù),其中包含與如HTTP和FTP等TCP/IP網(wǎng)絡(luò)通信

61、協(xié)議整合的能力。</p><p>  4、強(qiáng)壯性(Robust)</p><p>  由Java所編寫的程序要能在各種情況下運(yùn)行,而且必須具有高的穩(wěn)定性。Java在制定時(shí)即加入了能防止存儲(chǔ)器被覆寫和數(shù)據(jù)損壞的相關(guān)處理機(jī)制。</p><p>  5、安全性(Secure)</p><p>  Java是被設(shè)計(jì)用于網(wǎng)絡(luò)及分布式環(huán)境中的,所以安全性

62、是一個(gè)很重要的考慮。Java擁有數(shù)個(gè)從簡(jiǎn)單到復(fù)雜的安全保護(hù)措施,能有效地防止病毒的侵入和破壞行為的發(fā)生。</p><p>  6、結(jié)構(gòu)中立性(Architecture Neutral)</p><p>  在網(wǎng)絡(luò)上存在許多不同類型的計(jì)算機(jī),從中央處理器到操作系統(tǒng)的機(jī)構(gòu)均有很高的差異性。因此要使應(yīng)用程序在每一種機(jī)器上均能運(yùn)行是相當(dāng)困難的。針對(duì)這個(gè)目的,Java的編譯器可以產(chǎn)生一種結(jié)構(gòu)中立的目

63、標(biāo)碼文件格式――字節(jié)碼(Byte Code)。這種字節(jié)碼可以在許多種不同的計(jì)算機(jī)上運(yùn)行。</p><p>  7、多線程(Multithreaded)</p><p>  多線程是開發(fā)復(fù)雜和功能強(qiáng)大的程序所必須的手段之一,Java同樣支持這個(gè)重要功能。</p><p>  一個(gè)Java程序的開發(fā)過(guò)程。如圖4-1所示。</p><p>  圖4

64、-1 Java程序的開發(fā)過(guò)程</p><p>  源文件:使用一個(gè)文本編輯器,如Edit或記事本來(lái)編寫源文件。不可使用Word編輯器,因?yàn)樗胁豢梢?jiàn)字符。將編好的源文件保存起來(lái),源文件的擴(kuò)展名必須是Java。</p><p>  編譯器:源文件要經(jīng)過(guò)編譯器(Javac.exe)的編譯生成可擴(kuò)展名為.Class的字節(jié)碼文件。字節(jié)碼文件是由與平臺(tái)無(wú)關(guān)的二進(jìn)制碼組成的,執(zhí)行時(shí)由解釋器解釋成本

65、地機(jī)器碼。</p><p>  運(yùn)行Java程序:Java程序分為兩大類——Java應(yīng)用程序(Application)和Java小應(yīng)用程序(Applet)。Java應(yīng)用程序必須通過(guò)Java解釋器(java.exe)來(lái)解釋執(zhí)行其字節(jié)碼文件;Java小應(yīng)用程序可通過(guò)支持Java標(biāo)準(zhǔn)的瀏覽器來(lái)解釋執(zhí)行。</p><p><b>  Java開發(fā)環(huán)境</b></p>

66、;<p>  使用Jcreator開發(fā)環(huán)境必須安裝JDK,在環(huán)境變量里新建名為Path的變量名,變量值為D:\軟件\JAVA\bin(根據(jù)JDK的安裝目錄而定)。在命令提示窗口輸入Java -version如果能正確顯示版本號(hào),則表示環(huán)境配置成功。如圖4-2所示。</p><p><b>  圖4-2 環(huán)境變量</b></p><p>  Jcreato

67、r的安裝很簡(jiǎn)單,這里不在詳細(xì)敘述,把路徑配置好就可以了。如圖4-3。</p><p>  圖4-3 Jcreator IDE </p><p>  五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  程序結(jié)構(gòu)說(shuō)明</b></p><p>  既然是Java Application,要實(shí)現(xiàn)網(wǎng)絡(luò)對(duì)戰(zhàn),故采用C/S模式

68、編寫,程序包含7個(gè)獨(dú)立的類文件-ChessWZQ.java、Group.java、Message.java、Player.java、ServerOneClient.java、Server.java、BoardPanel.java。</p><p>  其中BoardPanel.java主要負(fù)責(zé)棋盤的初始化,鼠標(biāo)事件的處理,以及判斷勝負(fù)條件。ChessWZQ.java定義了面板上的其他元素,包括玩家列表,標(biāo)題欄等。

69、也包括了事件處理和人工智能。ServerOneClient.java則負(fù)責(zé)網(wǎng)絡(luò)對(duì)戰(zhàn)的處理。其他的類都是又這3個(gè)主類延伸出去的。在具體實(shí)現(xiàn)的時(shí)候再介紹其作用。見(jiàn)圖5-1。</p><p>  棋盤及棋子的類 </p><p><b>  棋盤</b></p><p>  棋盤如圖2-1,具體代碼如下: </

70、p><p>  String line = "a b c d e f g h i j k l m n o";</p><p>  char [] rowNum1 = {'1','2','3','4','5','6','7','8','9&#

71、39;};</p><p>  char [] rowNum2={'1','0','1','1','1','2','1','3','1','4','1','5'};</p><p>  這部分為棋盤的

72、邊界標(biāo)識(shí)符,是必須要有的。用字符數(shù)組存儲(chǔ),最后確定位置放上去即可。</p><p><b>  棋盤的繪制:</b></p><p>  private static int xp; // 棋子 X坐標(biāo)</p><p>  private static int yp; // 棋子Y坐標(biāo)</p>

73、<p>  public void paint(Graphics gc)</p><p><b>  {</b></p><p>  super.paint(gc);</p><p>  //this.setBackground(Color.gray);</p><p>  //this.invalidat

74、e();</p><p>  gc.setColor(Color.blue);</p><p>  //gc.setColor(new Color(255, 255, 240));</p><p><b>  //畫橫向標(biāo)識(shí)符</b></p><p>  gc.drawString(line,25,15);</p&

75、gt;<p><b>  // 畫豎向標(biāo)識(shí)符</b></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

76、(int i=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;

77、 i < 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></p>

78、<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><p&g

79、t;<b>  //面板初始化</b></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><p&

80、gt;  if (board[i][j] == 1){</p><p>  gc.setColor(Color.black);</p><p>  gc.fillOval(xp,yp,28,28);</p><p>  //gc.drawImage(black, 16 + i * 30, 16 + j * 30, this);</p><p>

81、;<b>  }</b></p><p>  if (board[i][j] == 2){</p><p>  gc.setColor(Color.white);</p><p>  gc.fillOval(xp,yp,28,28);</p><p>  //gc.drawImage(white, 16 + i * 30

82、, 16 + j * 30, this);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b&

83、gt;  棋子</b></p><p>  確定下子的坐標(biāo)(xp,yp)畫特定大小的橢圓,這里的坐標(biāo)指棋子相對(duì)棋盤的絕對(duì)坐標(biāo)。</p><p>  private static int xp; // 棋子 X坐標(biāo)</p><p>  private static int yp; // 棋子Y坐標(biāo)</p>

84、<p>  if(col==1) g.setColor(Color.black);</p><p>  else g.setColor(Color.white);</p><p>  g.fillOval(xp,yp,10,28,28);</p><p><b>  勝負(fù)判斷條件</b></p><p>

85、  要判斷四個(gè)方向,橫向、豎向、以及2個(gè)斜向。思想還是比較簡(jiǎn)單,相同顏色連成五子即勝利,網(wǎng)上有些網(wǎng)友評(píng)論說(shuō)完整的判斷勝負(fù)條件包括連五和活四,本文覺(jué)得完全沒(méi)必要,活四還要檢查兩邊的棋子,雖然運(yùn)算量不大,但五子棋的標(biāo)準(zhǔn)就是連五即勝,一步之差,棋手既要遵守規(guī)則,也要簡(jiǎn)化代碼實(shí)現(xiàn)盡完整的功能。</p><p>  編寫過(guò)程中要事先建立一個(gè)盤面數(shù)組board[ ][ ],即棋型表,數(shù)組的每一個(gè)元素對(duì)應(yīng)棋盤上的一個(gè)交叉點(diǎn),用

86、‘0’表示空位,‘1’表示黑棋,‘2’表示白棋。由于代碼太多,下面給出了一般狀況的判斷勝負(fù)函數(shù),及以坐標(biāo)(x,y)為中心的9X9矩形,只能在棋盤的內(nèi)部,如果超過(guò)棋盤,就要另外考慮。下面的代碼就是一般情況,整個(gè)矩形在棋盤內(nèi)部的時(shí)候的判斷勝負(fù)條件,如圖5-2。</p><p><b>  圖5-2 獲勝</b></p><p>  以下給出了部分判斷勝負(fù)的代碼:</

87、p><p><b>  /**</b></p><p>  * 判斷是否有人獲勝</p><p><b>  */</b></p><p>  private boolean judge(Group gg,int x,int y)</p><p><b>  {<

88、/b></p><p>  int i = 0, j = 0, count = 0;</p><p>  int color=gg.board[x][y];</p><p><b>  // x 方向</b></p><p>  for (i = 0, count = 0; x - i >= 0 &&

89、amp; i < 5; i++) </p><p><b>  {</b></p><p>  if (color == gg.board[x - i][y]) </p><p><b>  {</b></p><p><b>  count++;</b></p&g

90、t;<p><b>  }</b></p><p><b>  else {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  // System.out.

91、println("( "+x+" , "+y+" )"+"count = "+count);</p><p>  if (count == 5)</p><p>  return true;</p><p><b>  }</b></p><p&

92、gt;  for (i = 1; x + i < 15 && i < 5; i++) </p><p><b>  {</b></p><p>  if (color == gg.board[x + i][y]) </p><p><b>  {</b></p><p>

93、<b>  count++;</b></p><p><b>  }</b></p><p><b>  else {</b></p><p><b>  break;</b></p><p><b>  }</b></p>

94、;<p>  if (count == 5)</p><p>  return true;</p><p><b>  }</b></p><p><b>  // y 方向</b></p><p>  for (i = 0, count = 0; y - i >= 0 &

95、;& i < 5; i++) </p><p><b>  {</b></p><p>  if (color == gg.board[x][y - i])</p><p><b>  {</b></p><p><b>  count++;</b></p&

96、gt;<p><b>  }</b></p><p><b>  else {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  // System.o

97、ut.println("( "+x+" , "+y+" )"+"count = "+count);</p><p>  if (count == 5)</p><p>  return true;</p><p><b>  }</b></p><

98、;p>  for (i = 1; y + i < 15 && i < 5; i++) </p><p><b>  {</b></p><p>  if (color == gg.board[x][y + i]) </p><p><b>  {</b></p><p&

99、gt;<b>  count++;</b></p><p><b>  }</b></p><p><b>  else {</b></p><p><b>  break;</b></p><p><b>  }</b></p

100、><p>  // System.out.println("( "+x+" , "+y+" )"+"count = "+count);</p><p>  if (count == 5)</p><p>  return true;</p><p>&l

101、t;b>  }</b></p><p><b>  // '\' 方向</b></p><p>  for (i = 0, count = 0; x - i >= 0 && y - i >= 0 && i < 5; i++) </p><p><b>

102、  {</b></p><p>  if (color == gg.board[x - i][y - i])</p><p><b>  {</b></p><p><b>  count++;</b></p><p><b>  }</b></p>

103、<p><b>  else {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  // System.out.println("( "+x+" , "+y+&q

104、uot; )"+"count = "+count);</p><p>  if (count == 5)</p><p>  return true;</p><p><b>  }</b></p><p>  for (i = 1; x + i < 15 && y +

105、 i < 15 && i < 5; i++) </p><p><b>  {</b></p><p>  if (color == gg.board[x + i][y + i]) </p><p><b>  {</b></p><p><b>  count

106、++;</b></p><p><b>  }</b></p><p><b>  else {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  //

107、 System.out.println("( "+x+" , "+y+" )"+"count = "+count);</p><p>  if (count == 5) {</p><p>  return true;</p><p><b>  }</

108、b></p><p><b>  }</b></p><p><b>  // '/' 方向</b></p><p>  for (i = 0, count = 0; x + i < 15 && y - i >= 0 && i < 5; i++) &l

109、t;/p><p><b>  {</b></p><p>  if (color == gg.board[x + i][y - i]) </p><p><b>  {</b></p><p><b>  count++;</b></p><p><b

110、>  }</b></p><p><b>  else {</b></p><p>  count = 0;</p><p><b>  }</b></p><p>  // System.out.println("( "+x+" ,

111、 "+y+" )"+"count = "+count);</p><p>  if (count == 5)</p><p>  return true;</p><p><b>  }</b></p><p>  for (i = 1; x - i >= 0 &a

112、mp;& y + i < 15 && i < 5; i++) </p><p><b>  {</b></p><p>  if (color == gg.board[x - i][y + i]) </p><p><b>  {</b></p><p><

113、b>  count++;</b></p><p><b>  }</b></p><p><b>  else {</b></p><p><b>  break;</b></p><p><b>  }</b></p>&

114、lt;p>  // System.out.println("( "+x+" , "+y+" )"+"count = "+count);</p><p>  if (count == 5) </p><p><b>  {</b></p><p

115、>  return true;</p><p><b>  }</b></p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p><b>  }<

116、/b></p><p>  為保證公平,先下子的就有禁手。但是對(duì)于業(yè)余玩家來(lái)說(shuō)一般沒(méi)有這個(gè)規(guī)則限制,都是輪流先下子。理論上是這樣的。但很多專家表明,先下子有很大的幾率獲勝,即使有禁手,先下子的一方還是有很大的優(yōu)勢(shì),本文覺(jué)得對(duì)于一般玩家而言,這些規(guī)定可以不考慮。</p><p>  判斷勝負(fù)的不管是單機(jī)還是玩家相互游戲,都必須開服務(wù)端,因?yàn)榕袛鄤儇?fù)是放在里面的。如果有一方獲勝,彈出提示

117、框,如果確認(rèn)則清空棋盤繼續(xù)新游戲。</p><p>  public void getVictory(Message msg){</p><p>  JOptionPane.showMessageDialog(null,</p><p>  "You Win The Game",</p><p>  "Co

118、ngratulations",</p><p>  JOptionPane.INFORMATION_MESSAGE);</p><p><b>  //繼續(xù)新游戲</b></p><p>  label3.setText("Player2");</p><p>  newGame();<

119、;/p><p><b>  }</b></p><p>  需要注意的一點(diǎn)是落下的棋子如果離任何一方的邊界小于4,則以邊界為限制判斷是否有一方獲勝,這樣的話也要考慮多種方向,但原理還是和基本情況是一樣的。</p><p><b>  網(wǎng)絡(luò)對(duì)戰(zhàn)</b></p><p>  這部分也屬于網(wǎng)絡(luò)套接字編程的經(jīng)典

120、應(yīng)用,根據(jù)服務(wù)器地址連接特定端口。</p><p>  網(wǎng)絡(luò)部分很簡(jiǎn)單,但是此次設(shè)計(jì)也做出了自己的特色,雖然沒(méi)有多少實(shí)用價(jià)值,但是也盡量使程序留有擴(kuò)展性。下面給出了Message的代碼。</p><p><b>  /**</b></p><p><b>  * 處理消息</b></p><p>&

121、lt;b>  * msg</b></p><p>  * 1= 成功的請(qǐng)求 2=套接字關(guān)閉</p><p><b>  */</b></p><p>  public int doMessage(Message msg)</p><p><b>  {</b></p>

122、<p>  //System.out.println("doMessage begin...type="+msg.type);</p><p>  switch(msg.type)</p><p><b>  {</b></p><p>  case 1:{//新的連接到服務(wù)端</p><p&

123、gt;  sendNewPlayer(msg); //客戶端必須返回類型type==10</p><p>  addPlayer(msg); // msg.msg == 新玩家的名字</p><p><b>  break;</b></p><p><b>  }</b></p><p> 

124、 case 2:{// 下棋子</p><p>  putChessman(msg);</p><p><b>  break;</b></p><p><b>  }</b></p><p>  case 3:{//請(qǐng)求其他人游戲</p><p>  requestAnot

125、her(msg);</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case 4:{</b></p><p>  denyRequest(msg);</p><p><b>

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論