版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)論文】
- 畢業(yè)論文——五子棋游戲設(shè)計(jì)
- 畢業(yè)論文---網(wǎng)絡(luò)五子棋游戲設(shè)計(jì)
- java五子棋游戲畢業(yè)論文
- 基于vc的五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)【畢業(yè)論文】
- 五子棋畢業(yè)論文-html開發(fā)五子棋的原型設(shè)計(jì)
- 五子棋畢業(yè)論文
- 網(wǎng)絡(luò)五子棋的設(shè)計(jì)與實(shí)現(xiàn)-畢業(yè)論文
- 基于Android的五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文.doc
- 網(wǎng)絡(luò)五子棋五子棋設(shè)計(jì)與實(shí)現(xiàn).doc
- qt網(wǎng)絡(luò)五子棋五子棋設(shè)計(jì)與實(shí)現(xiàn)
- 五子棋小游戲的設(shè)計(jì)與實(shí)現(xiàn)
- 基于java的五子棋游戲的設(shè)計(jì)——畢業(yè)論文
- 基于android的五子棋游戲的設(shè)計(jì)畢業(yè)論文
- 五子棋游戲畢業(yè)設(shè)計(jì)
- 五子棋游戲設(shè)計(jì)報(bào)告
- 畢業(yè)設(shè)計(jì)---網(wǎng)絡(luò)五子棋游戲
- 畢業(yè)設(shè)計(jì)(論文)-基于android的五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)
- 基于android的五子棋游戲設(shè)計(jì)與實(shí)現(xiàn)
- 網(wǎng)絡(luò)五子棋游戲畢業(yè)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論