基于JAVA的五子棋游戲的設(shè)計-計算機畢業(yè)設(shè)計_第1頁
基于JAVA的五子棋游戲的設(shè)計-計算機畢業(yè)設(shè)計_第2頁
基于JAVA的五子棋游戲的設(shè)計-計算機畢業(yè)設(shè)計_第3頁
基于JAVA的五子棋游戲的設(shè)計-計算機畢業(yè)設(shè)計_第4頁
基于JAVA的五子棋游戲的設(shè)計-計算機畢業(yè)設(shè)計_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

畢業(yè)設(shè)計(論文)基于Java的五子棋游戲的設(shè)計論文作者姓名:申請學位類別:申請學位類別:論文提交日期:基于Java的五子棋游戲的設(shè)計摘要五子棋作為一個棋類競技運動,在民間十分流行,為了熟悉五子棋規(guī)則及技巧,以及研究簡單的人工智能,決定用Java開發(fā)五子棋游戲。主要完成了人機對戰(zhàn)和玩家之間聯(lián)網(wǎng)對戰(zhàn)2個功能。網(wǎng)絡(luò)連接部分為Socket編程應用,客戶端和服務(wù)器端的交互用ClassMessage定義,有很好的可擴展性,客戶端負責界面維護和收集用戶輸入的信息,及錯誤處理。服務(wù)器維護在線用戶的基本信息和任意兩個對戰(zhàn)用戶的棋盤信息,動態(tài)維護用戶列表。在人機對弈中通過深度搜索和估值模塊,來提高電腦棋手的智能。分析估值模塊中的影響精準性的幾個要素,以及提出若干提高精準性的辦法,以及對它們搜索的節(jié)點數(shù)進行比較,在這些算法的基礎(chǔ)上分析一些提高電腦AI方案,如遞歸算法、電腦學習等。算法的研究有助于理解程序結(jié)構(gòu),增強邏輯思維能力,在其他人工智能方面也有很大的參考作用。關(guān)鍵詞:深度搜索;估值;電腦AI;五子棋;算法GobangJava-basedgamesdesignAbstractAsasport,gobangisverypopularincivil,inordertobecomefamiliarwithgobangrulesandtechniques,andthestudyofsimpleartificialintelligence,IdecidetousetheJavatodevelopegobanggamesandcompletethetwofunctionsincludingman-machinewarandman-manwar.NetworkConnectionisSocketProgrammingforsomeapplications,clientandserverinteractionisdefinitedbyClassMessage,whichisaverygoodscalability,Clientinterfaceisresponsibleforthecollectionandmaintenanceofuserinputinformation,anderrorhandling.Serverusersmaintainonlinebasicinformationandarbitrarytwo-timeusersofthechessboardofinformation,dynamicmaintenanceuserlist.Duringtheman-machineplayers,itimprovesintelligenceofthecomputerplayersthroughdepthsearchandvaluationmodule.AnalyzesModulevaluationofthepreciseelements,aswellasanumberofincreasedprecision,andcomparestheirsearchfornodes,whichraisessomecomputerAIprogramsonthebasisofanalysis,suchasrecursivealgorithm,computerlearning.Algorithmofprocedurescontributetotheunderstandingofthestructure,logicalthinkingability,Inotherareasofartificialintelligencehasgreatreferences..Keywords:Searchdepth;Valuation;ComputerAI;Gobang;Algorithm目錄論文總頁數(shù):23頁1 引言 11.1 課題背景 11.2 本課題研究的意義 11.3 本課題的研究方法 22 課題相關(guān)基礎(chǔ) 22.1 五子棋 22.1.1 棋盤和棋子 22.1.2 規(guī)則及解釋 32.1.3 五子棋常用術(shù)語 42.1.4 五子棋攻防 73 Java 83.1 Java簡介 83.2 Java開發(fā)環(huán)境 94 課題詳細研究方法 104.1 程序結(jié)構(gòu)說明 104.2 棋盤及棋子的類 114.2.1 棋盤 114.2.2 棋子 134.3 勝負判斷條件 134.4 網(wǎng)絡(luò)對戰(zhàn) 154.5 電腦AI 17結(jié)論 21參考文獻 21致謝 22聲明 23引言課題背景五子棋是起源于中國古代的傳統(tǒng)黑白棋種之一?,F(xiàn)代五子棋日文稱之為連珠,英譯為Renju,英文稱之為Gobang或FIR(FiveinaRow的縮寫),亦有連五子、五子連、串珠、五目、五目碰、五格等多種稱謂。五子棋起源于古代中國,發(fā)展于日本,風靡于歐洲。對于它與圍棋的關(guān)系有兩種說法,一說早于圍棋,早在“堯造圍棋”之前,民間就已有五子棋游戲;一說源于圍棋,是圍棋發(fā)展的一個分支。在中國的文化里,倍受人們的青睞。本世紀初五子棋傳入歐洲并迅速風靡全歐。通過一系列的變化,使五子棋這一簡單的游戲復雜化、規(guī)范化,而最終成為今天的職業(yè)連珠五子棋,同時也成為一種國際比賽棋。Java語言是當今最為流行的程序設(shè)計語言之一作為一門非常優(yōu)秀和極為健壯的編程語言,它同時具有的面向?qū)ο?,與平臺無關(guān),分布式應用,安全,穩(wěn)定和多線程等優(yōu)良的特征,使用Java語言,不僅可以開發(fā)出功能強大的大型應用程序,而且Java語言本身突出的跨平臺的特性也使得它特別適合于Internet上的應用開發(fā),可以這樣說,Java的出現(xiàn)使得所開發(fā)的應用程序“一次編寫,處處可用”的實現(xiàn)成為了可能。本課題研究的意義近來隨著計算機的快速發(fā)展,各種各樣的電腦游戲?qū)映霾桓F,使得我們能有更多的娛樂項目,而棋類游戲能起到鍛煉人的思維和修身養(yǎng)性的作用,而且棋類游戲水平頗高,大有與人腦分庭抗禮之勢。其中戰(zhàn)勝過國際象棋世界冠軍-卡斯帕羅夫的“深藍”便是最具說服力的代表;其它像圍棋的“手淡”、象棋的“將族”等也以其優(yōu)秀的人工智能深受棋迷喜愛。越來越多的具有智能的機器進入了人類的生活,人工智能的重要性如今顯而易見。自己對人工智能比較感興趣,而五子棋游戲程序的開發(fā)實現(xiàn)這個課題,正好提供給我這樣一個研究的機會,通過對人工智能中博弈方面的研究(人機對弈),讓我在簡單的人機對弈全局設(shè)計,以及具體到相關(guān)算法上有了深入的了解。人工智能屬于計算機科學的領(lǐng)域,它以計算機技術(shù)為基礎(chǔ),近幾十年來,它的理論和技術(shù)已經(jīng)日益成熟,應用領(lǐng)域也正在不斷擴大,顯示出強大的生命力。人工智能大致可以分成幾個學科,它們每一個都是獨特的,但是它們常常又互相結(jié)合起來完成設(shè)計任務(wù),這時,這些學科之間的差別就變的很模糊。人工智能在專家系統(tǒng),自然語言理解,自動定理證明,自動程序設(shè)計,人工智能在機器人學、模式識別、物景分析、數(shù)據(jù)庫的智能檢索、機器下棋(實質(zhì)上是博弈論問題)和家用電器智能化等領(lǐng)域都有廣泛的應用。而這個課題就是和人工智能中的博弈論領(lǐng)域緊密相關(guān)的。這個題目核心是人工智能和Socekt編程,。并且人工智能中的博弈部分,由于采用了大量的搜索算法,其中很多被利用到各方面。它的概念、方法和技術(shù),正在各行各業(yè)廣泛滲透。智能已經(jīng)成為當今各種新產(chǎn)品、新裝備的發(fā)展方向。所以,趁著這個機會,對人工智能中比較容易實現(xiàn)的人機博弈進行了解研究學習,也是很實用且很有必要的。本課題的研究方法在進行游戲設(shè)計之前,首先決定的第一個問題就是,使用什么開發(fā)環(huán)境來編寫環(huán)境?自己雖然比較熟悉Java語言,但是實際開發(fā)項目經(jīng)驗很少,所以決定用Jcreator,其擁有高亮語法編輯、使用向?qū)б约巴耆ㄖ频挠脩艚缑?,最主要的是能夠自動查找文件于Main方法或Html文件以支持Java小應用程序,然后啟動相應的工具。其次確定整個程序的結(jié)構(gòu)框架。由于Applet運行速度較慢,如果在加上算法搜索時間,顯然不符合程序的設(shè)計要求,決定用Java應用程序開發(fā).整個程序的功能實現(xiàn)流程是這樣的:網(wǎng)絡(luò)對戰(zhàn)涉及算法較少,所以先實現(xiàn)網(wǎng)絡(luò)部分,實現(xiàn)基本的棋盤和棋子的類,添加判斷勝負條件,這部是基礎(chǔ),也是很重要的,電腦AI也在這些基礎(chǔ)上添加上來的。這個題目的2個功能包括2個重要算法,電腦AI和勝負條件,勝負條件運算量不大,有固定的模式。難點是人工智能,可以這樣說,人工智能的好壞決定了這個題目的完成深度。所以,大部份時間花在AI算法的研究和改進上,對于算法我掌握的不多,研究了一些國內(nèi)的五子棋算法,參考了一些游戲設(shè)計算法,詳細比較各種算法的優(yōu)缺點,而且參考了現(xiàn)代五子棋比賽的各種規(guī)則和技巧,盡量聯(lián)系實際,努力提高電腦AI。課題相關(guān)基礎(chǔ)五子棋棋盤和棋子現(xiàn)代五子棋棋盤,經(jīng)過國際棋聯(lián)的多次修改,最終定為15X15路,即棋盤由橫豎各15條平行線交叉組成,共有225個交叉點;棋盤上共有五個星位,中間的星位稱為天元,周圍四點為小星,與圍棋盤略有不同。見圖1。圖1棋盤五子棋的棋子和圍棋相同,分黑白2種顏色,通常為散圓形,有一面凸起或二面凸起等形狀,一副棋子總數(shù)為225枚,其中黑子113枚,白子112枚。關(guān)于計時,正規(guī)比賽按不同級別設(shè)置了不同的時間限制,一般的玩家都沒有這個限制。規(guī)則及解釋1:黑棋先行,白棋隨后。從天元開始相互順序落子。2:最先在棋盤的橫向、豎向、斜向形成連續(xù)的相同色五個棋子的一方為勝利。3:黑棋禁手判負、白棋無禁手。黑棋禁手包括“三、三”;“四、四”;“長連”。黑方只能用“四、三”去取勝。4:如分不出勝負,則定位平局。5:對局中拔子、中途退場均判為負6:五連與禁手同時形成,先五為勝。7:黑方禁手形成時,白方應立即指出。若白方未發(fā)現(xiàn)或發(fā)現(xiàn)后不立即指正,反而繼續(xù)落子,則不能判黑方負。五子棋是由兩個人在一盤棋上進行對抗的競技運動。在對局開始時,先由執(zhí)黑棋的一方將一枚棋子的落在“天元”上,然后由執(zhí)白棋的一方在黑棋周圍的交叉點上落子。如此輪流落子直到某一方首先在棋盤的直線橫線或斜線上形成連續(xù)的五子或五子以上,則該方就算獲勝。但是五子棋的特點是先行的一方優(yōu)勢很大。因此,在職業(yè)比賽種對黑方做了種種限制,以利公平競爭。黑白雙方的勝負結(jié)果必須按照職業(yè)五子棋的規(guī)則要求來決定。五子棋常用術(shù)語二:二是五子棋的一切進攻的基礎(chǔ);又分為活二和死二?;疃杭丛傧乱蛔涌尚纬苫钊亩妶D2。死二:即再下一子可形成死三的二,見圖3。圖2活二圖3死二三:三是五子棋最常見的攻擊手段。三分為活三、死三、眠三?;钊簽樵傧乱蛔蛹纯勺兂苫钏牡娜ɑ钏慕榻B見后)?;蛉譃檫B三、跳三。見圖4。我們通常所說的“三”。就是指活三而言。如果是死三,將特別指出。死三:即對方有棋子在同一條線相鄰交叉點防守的三;死三分為三種。見圖5。眠三:是死三的一種特性,它看上去相鄰點沒有對方棋子防守,很像活三,但由于受空間限制,不論如何發(fā)展都不可能稱為活四,故稱為“眠三“。見圖5。圖4活三圖5死三反三:反三不是指一種“三”的形狀,而是指再阻止對方進攻的同時使自己稱為一道活三的反攻,稱為反三。四:四的形狀有三種,它分為:活四,沖四、跳沖四?;钏模涸谕粭l線上相連的四個同色棋子成為“連五”,如圖6所示。圖6活四圖6活四沖四:在同一條線上相連的相同顏色的四個棋子,它與活四不同的是,其中的一端有對方的棋子進行阻擋,它只有再在另一端下一手棋才可形成“連五”。跳沖四:它的形狀在“四”中是比較特殊的,一般分為兩種,它的特點是同一條線上的同色的四個棋子,有一個或兩個棋子與另外三個或兩個棋子之間有一個交叉點的間隔,它的下一手棋只有下在間隔的交叉點上才能形成“連五”,因此,對方的棋子防守時,也只能阻擋在間隔的交叉點上,見圖7。圖7跳沖四圖8反沖四如圖8,黑棋在1點進攻,形成一子雙殺,這時白棋的妙手是在a位活三,它同時阻擋了黑棋的兩種取勝方法。當黑棋仍在c位跳沖四活三時,白棋即在b位阻斷黑棋沖四并形成反沖四,是黑棋的進攻功虧一簣。一子雙殺:指用同一手棋同時形成兩個勝點的著法。追下取勝:是指白棋逼迫黑棋形成禁手而取勝的方法。自由獲勝:除了追下取勝以外的獲勝方法,稱之為自由取勝。禁手(Forbidden):指黑方一子落下同時形成兩個或兩個以上的活三、沖四或形成長連的棋形,是對局中對黑棋禁止使用的戰(zhàn)術(shù)或被判為負的行棋手段,見圖15。白棋無禁手,如果黑子在落下的關(guān)鍵的第五子即形成五連的同時,又形成禁手。此時,因黑方已成連五,故禁手失效,黑方勝利。之所以這么規(guī)定也是為了規(guī)范比賽,其實我們業(yè)余的棋手,黑白棋子誰先下都不限制,只是先落子會有比較大的優(yōu)勢,另一方始終處于防守的被動狀態(tài)。所以那一方先下子,他就有禁手,這是為了保持公平的一種手段。但是職業(yè)連珠五子棋雖然對黑棋采取了種限制,但是先行的一方優(yōu)勢依然很大。在高段位的比賽中還添加了一些規(guī)定,由于很少用到,就不必詳細敘述了。ABCDEF圖9禁手見圖9。A、B、C中的x點為三、三禁手。D、E中的X點為四、四禁手。F中的X點為長連禁手。長連:相同顏色的連續(xù)六子或六子以上。五子棋攻防五子棋是一項對抗性很強的運動,在開局進入五手兩打后,就開始進入了白刃戰(zhàn),相互爭奪先手,任何一方都不能掉以輕心,要盡可能少犯錯誤,甚至不犯錯誤,否則將會導致速敗。眾所周知,連珠五子,連五為勝。有四才能有五,有三才有四,以此類推。所以,在五子棋的對局眾進攻和防守都是從“二”和“三”的爭奪開始的?!昂玫拈_始是成功的一半”,這條格言用在五子棋里再合適不過了。五子棋的點的選擇十分關(guān)鍵。五子棋實際上是通過選擇最佳的落點,加上正確的落子次序,一步一步地占領(lǐng)各個要點,最終獲得勝利。對局的早期,選點的著眼點主要是使本方的棋子保持聯(lián)系,為以后創(chuàng)造盡可能多的成三、成四的機會,同時盡量限制對方成為好形。由于在五子棋對弈過程中,通過行棋落點來控制對方的落點是可能的,比如活三沖四的應點是可以預知的,完全有可能通過不斷走出這樣的先手來控制對方的著點直至勝利。所以,在對局的后期,就要在精確計算的前提下,盡早發(fā)動攻勢,以取得棋局的控制權(quán),否則一旦貽誤戰(zhàn)機,被對方搶先發(fā)動攻勢,就會成為被控制的一方。當有多個攻擊點可供選擇時,要選擇后續(xù)手段多,又不會被對方反先的著點。如果是黑方,還特別要注意進攻終被對方反擊時出現(xiàn)的各種禁手點的可能性。進攻分為單攻棋和雙攻棋,單攻棋指單線即單行或單向的攻棋子,包括三子攻棋(活三、填四)和四子攻棋(沖四、填五)。而雙攻棋指雙向或雙行的攻棋。包括三、三攻棋(雙活三、雙填四、填四活三);四、三攻棋(沖四活三、沖四填四、填五活三、填五填四);四四攻棋(雙沖四、雙填五、填五沖四)。五子棋的取勝思路是由一個子開始,目標是運用各種方法在棋盤上發(fā)展出五連乃至長連而取勝。在這個發(fā)展過程中必然要經(jīng)過由一子到兩子兩子到三子三子到四子的過程。因此說,把各種形狀和各個方面上的二三四等子力結(jié)構(gòu)爛熟于胸,做到舉一反三,是學習五子棋的基本功,更是能靈活運用五種取勝技巧的基礎(chǔ)。JavaJava簡介Java是美國Sun公司開發(fā)的語言,它使用解釋器執(zhí)行代碼,因此,無需對源代碼進行任何更改即可在不同計算機上運行,是真正跨平臺的編程開發(fā)語言。Java有以下主要特點:1:簡單(Simple)制定Java的原則之一,是要建立一種結(jié)構(gòu)簡單而且使用容易的系統(tǒng),可以讓用戶不必接受很深的訓練就可以開始設(shè)計程序,所以Java的語法盡可能與在當前許多程序設(shè)計師都采用的C及C++語言相似。并且,Java刪除了C及C++許多極少使用、不易理解或常被混淆的功能,多多重繼承、指針等。2:面向?qū)ο?Object-Oriented)面向?qū)ο笫墙陙硇畔⒔鐝V為使用的概念和技術(shù)。它有許多良好的特性。對象的封裝性可以使對象的接口定義明確;繼承性可以增加軟件的可重用性,有助于分類及模版設(shè)計等。實現(xiàn)面向?qū)ο蟮母拍罴捌涓鞣N良好的特性是Java的設(shè)計理念之一。3:分布式(Distributed)計算機網(wǎng)絡(luò)的發(fā)展使得信息應用朝著分布式的環(huán)境發(fā)展,所以現(xiàn)代的信息開發(fā)語言及環(huán)境要有配合分布式的特性及功能。Java具有一個網(wǎng)絡(luò)功能的程序庫,其中包含與如HTTP和FTP等TCP/IP網(wǎng)絡(luò)通信協(xié)議整合的能力。4:強壯性(Robust)由Java所編寫的程序要能在各種情況下運行,而且必須具有高的穩(wěn)定性。Java在制定時即加入了能防止存儲器被覆寫和數(shù)據(jù)損壞的相關(guān)處理機制。5:安全性(Secure)Java是被設(shè)計用于網(wǎng)絡(luò)及分布式環(huán)境中的,所以安全性是一個很重要的考慮。Java擁有數(shù)個從簡單到復雜的安全保護措施,能有效地防止病毒的侵入和破壞行為的發(fā)生。6:結(jié)構(gòu)中立性(ArchitectureNeutral)在網(wǎng)絡(luò)上存在許多不同類型的計算機,從中央處理器到操作系統(tǒng)的機構(gòu)均有很高的差異性。因此要使應用程序在每一種機器上均能運行是相當困難的。針對這個目的,Java的編譯器可以產(chǎn)生一種結(jié)構(gòu)中立的目標碼文件格式――字節(jié)碼(ByteCode)。這種字節(jié)碼可以在許多種不同的計算機上運行。7:多線程(Multithreaded)多線程是開發(fā)復雜和功能強大的程序所必須的手段之一,Java同樣支持這個重要功能。一個Java程序的開發(fā)過程如圖10所示。圖10Java程序的開發(fā)過程源文件:使用一個文本編輯器,如Edit或記事本來編寫源文件。不可使用Word編輯器,因為它含有不可見字符。將編好的源文件保存起來,源文件的擴展名必須是Java。編譯器:源文件要經(jīng)過編譯器(Javac.exe)的編譯生成可擴展名為.Class的字節(jié)碼文件。字節(jié)碼文件是由與平臺無關(guān)的二進制碼組成的,執(zhí)行時由解釋器解釋成本地機器碼。運行Java程序:Java程序分為兩大類——Java應用程序(Application)和Java小應用程序(Applet)。Java應用程序必須通過Java解釋器(java.exe)來解釋執(zhí)行其字節(jié)碼文件;Java小應用程序可通過支持Java標準的瀏覽器來解釋執(zhí)行。Java開發(fā)環(huán)境使用Jcreator開發(fā)環(huán)境必須安裝JDK,我安裝的版本是1.5.0,在環(huán)境變量里新建名為Path的變量名,變量值為D:\軟件\JAVA\bin(根據(jù)JDK的安裝目錄而定)。在命令提示窗口輸入Java-version如果能正確顯示版本號,則表示環(huán)境配置成功。如圖11所示。圖11環(huán)境變量Jcreator的安裝很簡單,這里不在詳細敘述,把路徑配置好就可以了。如圖12。圖12JcreatorIDE課題詳細研究方法程序結(jié)構(gòu)說明既然是JavaApplication,要實現(xiàn)網(wǎng)絡(luò)對戰(zhàn),故采用C/S模式編寫,程序包含7個獨立的類文件-ChessWZQ.java、Group.java、Message.java、Player.java、ServerOneClient.java、Server.java、BoardPanel.java。其中BoardPanel.java主要負責棋盤的初始化,鼠標事件的處理,以及判斷勝負條件。ChessWZQ.java定義了面板上的其他元素,包括玩家列表,標題欄等。也包括了事件處理和人工智能。ServerOneClient.java則負責網(wǎng)絡(luò)對戰(zhàn)的處理。其他的類都是又這3個主類延伸出去的。在具體實現(xiàn)的時候再介紹其作用。見圖13。圖圖13五子棋程序流程圖棋盤及棋子的類棋盤棋盤如圖1,具體代碼如下:Stringline="abcdefghijklmno";char[]rowNum1={'1','2','3','4','5','6','7','8','9'};char[]rowNum2={'1','0','1','1','1','2','1','3','1','4','1','5'};這部分為棋盤的邊界標識符,是必須要有的。用字符數(shù)組存儲,最后確定位置放上去即可。棋盤的繪制:privatestaticintxp;//棋子X坐標privatestaticintyp;//棋子Y坐標publicvoidpaint(Graphicsgc){super.paint(gc);//this.setBackground(Color.gray);//this.invalidate();gc.setColor(Color.blue);//gc.setColor(newColor(255,255,240));//畫橫向標識符gc.drawString(line,25,15);//畫豎向標識符for(inti=0;i<9;i++){gc.drawChars(rowNum1,i,1,10,35+i*30);}for(inti=9,j=0;i<15;i++,j+=2){gc.drawChars(rowNum2,j,2,10,35+i*30);}//畫棋盤for(inti=0;i<15;i++){gc.drawLine(30,30+i*30,450,30+i*30);//行g(shù)c.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(inti=0;i<15;i++){for(intj=0;j<15;j++){xp=16+i*30;yp=16+j*30;if(board[i][j]==1){gc.setColor(Color.black);gc.fillOval(xp,yp,28,28);//gc.drawImage(black,16+i*30,16+j*30,this);}if(board[i][j]==2){gc.setColor(Color.white);gc.fillOval(xp,yp,28,28);//gc.drawImage(white,16+i*30,16+j*30,this);}}}}棋子確定下子的坐標(xp,yp)畫特定大小的橢圓,這里的坐標指棋子相對棋盤的絕對坐標。privatestaticintxp;//棋子X坐標privatestaticintyp;//棋子Y坐標if(col==1)g.setColor(Color.black);elseg.setColor(Color.white);g.fillOval(xp,yp,10,28,28);勝負判斷條件要判斷四個方向,橫向、豎向、以及2個斜向。思想還是比較簡單,相同顏色連成五子即勝利,網(wǎng)上有些網(wǎng)友評論說完整的判斷勝負條件包括連五和活四,我覺得完全沒必要,活四還要檢查兩邊的棋子,雖然運算量不大,但五子棋的標準就是連五即勝,一步之差,我們既要遵守規(guī)則,也要簡化代碼實現(xiàn)盡完整的功能。我們要事先建立一個盤面數(shù)組board[][],即棋型表,數(shù)組的每一個元素對應棋盤上的一個交叉點,用‘0’表示空位,‘1’表示黑棋,‘2’表示白棋。由于代碼太多,下面給出了一般狀況的判斷勝負函數(shù),及以坐標(x,y)為中心的9X9矩形,只能在棋盤的內(nèi)部,如果超過棋盤,就要另外考慮。下面的代碼就是一般情況,整個矩形在棋盤內(nèi)部的時候的判斷勝負條件,如圖14。圖14獲勝勝負判斷條件以下給出了X方向的代碼:protectedbooleanjudge(intx,inty,intclr){inti=0,j=0,count=0;//x方向for(i=0,count=0;x-i>=0&&i<5;i++){if(clr==board[x-i][y]){count++;} else{break;}//System.out.println("("+x+","+y+")"+"count="+count);if(count==5)returntrue;}for(i=1;x+i<15&&i<5;i++){if(clr==board[x+i][y]){count++;}else{break;}if(count==5)returntrue;}returnfalse;}為保證公平,先下子的就有禁手。但是我們一般沒有這個規(guī)則限制,都是輪流先下子。理論上是這樣的。但很多專家表明,先下子有很大的幾率獲勝,即使有禁手,先下子的一方還是有很大的優(yōu)勢,我覺得對于我們一般玩家而言,這些規(guī)定可以不考慮。判斷勝負的不管是單機還是玩家相互游戲,都必須開服務(wù)端,因為判斷勝負是放在里面的。如果有一方獲勝,彈出提示框,如果確認則清空棋盤繼續(xù)新游戲。publicvoidgetVictory(Messagemsg){JOptionPane.showMessageDialog(null,"YouWinTheGame","Congratulations",JOptionPane.INFORMATION_MESSAGE);//繼續(xù)新游戲label3.setText("Player2");newGame();}需要注意的一點是落下的棋子如果離任何一方的邊界小于4,則以邊界為限制判斷是否有一方獲勝,這樣的話也要考慮多種方向,但原理還是和基本情況是一樣的。網(wǎng)絡(luò)對戰(zhàn)這部分也屬于網(wǎng)絡(luò)套接字編程的經(jīng)典應用,根據(jù)服務(wù)器地址連接特定端口。網(wǎng)絡(luò)部分很簡單,但是我也做出了自己的特色,就是事件處理,做工可根據(jù)具體情況修改,雖然沒有多少實用價值,但是也盡量使程序留有擴展性。下面給出了Message的代碼。/***消息列表*type=1//請求連接,msg=連接者名字*type=2//放棋子*type=3//請求和其他人游戲*type=4//拒絕游戲請求*type=5//同意請求*type=6//發(fā)送勝利消息*type=7//斷開連接請求*type=8//保存游戲,但是不放在磁盤上,在下一局開始時將會丟失*type=9//添加新的玩家到所有客戶端的玩家列表*type=10//響應信息type==1*type=11//和玩家游戲,msg保存玩家的名字,創(chuàng)建游戲的玩家設(shè)置游戲*type=12//信息設(shè)置*type=13//設(shè)置玩家顏色*type=14//msg=接受請求的一方設(shè)置*type=15//服務(wù)端更新信息*type=16//發(fā)送控制或錯誤信息*type=17//游戲失敗*type=18//服務(wù)端套接字關(guān)閉*type=19//玩家結(jié)束游戲及更新*tyep=20//電腦獲勝/玩家獲勝*/SOCKET監(jiān)聽端口,如果有玩家則更新玩家列表,如果雙擊除自己以外的玩家,則可以開始游戲,發(fā)送游戲請求,如果同意則返回棋子顏色并開始游戲,同時清空玩家列表。每一下子,把坐標傳給服務(wù)端,并在2端顯示出來,并且判斷勝負。如果,有一方獲勝,則提示消息通知雙方,確定則繼續(xù)開始新游戲。服務(wù)端開啟服務(wù)監(jiān)聽線程和客戶端,如圖15,如果有玩家知道服務(wù)器IP地址,即可選擇在線玩家進行聯(lián)網(wǎng)游戲,如圖16。圖23服務(wù)端監(jiān)聽圖23服務(wù)端監(jiān)聽圖15服務(wù)端監(jiān)聽圖15服務(wù)端監(jiān)聽雙擊除自己以外的一個玩家,發(fā)出游戲請求,同時要確定自己棋子的顏色,用MSG發(fā)回服務(wù)端。如果被拒絕,則返回原來的狀態(tài)。if(msg.color==1){ss=newString("white");bpanel.setColor(2);}else{ss=newString("black");bpanel.setColor(1);}圖16邀請游戲電腦AI廣義上來講,博弈是指在一定的環(huán)境條件和一定的規(guī)則約束下,依靠自己所能夠掌握的信息,從各自選擇的行為或是策略進行選擇并加以實施,并從各自取得相應結(jié)果或收益的過程。馮·諾伊曼(JohnvonNeumann,1903-1957)和摩根斯坦恩(OskarMargenstern,1902-1977)在1944年出版了《博弈論與經(jīng)濟行為》(TheoryofGamesandEconomicBehavior)一書中,最早地提出了關(guān)于博弈論的概念。但是,對于非合作、純競爭型博弈,諾伊曼所解決的只有二人零和博弈。在這里所抽象化后的博弈問題是,已知參與者集合(兩方),策略集合(所有棋著),和盈利集合(贏子輸子),最終是想去找到一個理論上的解或平衡,也就是對參與雙方來說都最合理、最優(yōu)的具體策略。而在這里狹義的講,博弈論主要是研究棋手們落子中理性化、邏輯化的部分,并將其系統(tǒng)化為一門科學。換言之,博弈就是研究個體如何在錯綜復雜的相互影響中得出最合理的策略,博弈論正是衍生于古老的游戲或曰博弈如象棋、撲克等。數(shù)學家們將具體的問題抽象化,通過建立自完備的邏輯框架、體系研究其規(guī)律及變化。參考了很多五子棋算法,大部分思想差不多,就是搜索估值確定重要性,然后選取最大的一個點下子。具體做法如下:為電腦和玩家各建立一張表,用來存放棋型數(shù)據(jù),比如“20”代表“沖四”的點,用“15”代表“活三”的點,那么在計算重要性時,就可以根據(jù)20>15得出前者比后者重要,下子時電腦便會自動選擇“沖四”的點,這里還要說明一點的事,還要考慮四個方向。因為有可能有復合棋型,比如“四三”..從第一步起,不管是哪一方下子,電腦都有以這點為中心搜索9X9的矩陣內(nèi)的所有空白點上棋子的重要性,一顆棋子對棋型影響的大小有9X9。重要看來雖然說進攻和防守的重要性一樣的,但是我認為防守更重要。在估值的時候,必須要考慮棋子的合法落子情況。不同的棋類博弈,其估值必定有極大的差別,各種因為規(guī)則而造成的不同因素影響估值的設(shè)計。不同的棋類游戲各有所謂的規(guī)則,規(guī)則中就有博弈雙方都可以走哪些著法。某些博弈游戲很容易就找到合理著法,我所實現(xiàn)的五子棋,它就具有很簡單的落子規(guī)則,即棋盤上所有的空位都可以落子,它們都是合理的著法。但是有些棋類游戲,比如在中國象棋和國際象棋中,情況就有些復雜了,每個棋子都有它特定的著法,電腦下子要考慮自己和玩家的棋型,優(yōu)先防守,如果沒有要防的棋型,則搜索自己的棋型下子。設(shè)置重要性,即估值模塊,下面只給出橫向的代碼privatevoidsetWeight(intx,inty,inttcolor){inti=RectX1,j=RectY1,value=0,k=0,n=0,flag=0;//'--'方向for(i=RectX1,j=y;i<=RectX2;i++){if(BoardPanel.board[i][j]!=0){continue;}value=0;flag=0;for(k=1;i-k>=RectX1&&k<5;k++){if(BoardPanel.board[i-k][j]==tcolor){value++;continue;}if(BoardPanel.board[i-k][j]==0){//blackspaceflag++;break;}}for(k=1;i+k<RectX2&&k<5;k++){if(BoardPanel.board[i+k][j]==tcolor){value++;}if(BoardPanel.board[i+k][j]==0){flag++;break;}}n=weight(value,flag);if(weightBoard[i][j]<n){weightBoard[i][j]=n;}}}設(shè)定相應空位的重要值以后,選取最大的值下子,代碼如下:privatevoidgetBiggest(int[][]arr,intx,inty){int[]temp=newint[2];intswt=arr[0][0],tmp=0;for(inti=0;i<15;i++){for(intj=0;j<15;j++){if(arr[i][j]>swt){temp[0]=i;temp[1]=j;swt=arr[i][j];}}}x=temp[0];y=temp[1];arr[x][y]=0;}對于特定的棋型,都有一個不同的估值,以此來區(qū)別不同棋型的優(yōu)劣,也以此來決定最終的落子位置。毫無疑問,像已有四子連成一線且還可以繼續(xù)落子的情況,明顯要比只有三個子連成一線的情況要好,或者說優(yōu)先級要更高,對弈雙方對此種棋局,肯定都是把第一種情況放為首要分析的位置上。因此,要使棋手做出這種判斷,就要把第一種情況的估值設(shè)置得高。對不同的棋型設(shè)置重要值,比如:活四、死四、活三、死三、活二、死二。同理,和判斷勝負一樣下子也要考慮邊界特殊情況,矩形設(shè)置如下:privatevoidsetRect(intx,inty){if(x-4>0)RectX1=x-4;elseRectX1=0;if(x+4>14)RectX2=14;elseRectX2=x+4;if(y-4>0)RectY1=y-4;elseRectY1=0;if(y+4>14)RectY2=14;elseRectY2=y+4;if(RectX1>RectY1)RectX1=x-(y-RectY1);elseRectY1=y-(x-RectX1);if(RectX2>RectY2)RectY2=y+(RectX2-x);elseRectX2=x+(RectY2-y);}努力提高電腦AI一直是五子棋游戲關(guān)鍵,第一步的人工智能只是估值和搜索算法的集合,要真正的提高電腦AI還有很多步,例如,我的電腦AI只是片面的分析了雙方的器型,沒有前瞻性。如果玩家多想幾步,電腦就發(fā)現(xiàn)不了。不過即使沒采用遞歸算法,要是讓電腦先下子的話,你的大部分時間也是花在防守上,可能是我的棋力太菜了,我自己還沒有下贏過電腦。目前有2種方法提高電腦棋力:一是遞歸算法,二是增加細致的特定棋形的判斷,鑒于自己對算法方面欠缺甚多,沒有辦法完成這個功能,實在是遺憾。我大體說一下這2種算法的思路:遞歸算法的意思可以說成“今后幾步預測法”,首先讓電腦分析一個可能的點,如果在這兒下子將會形成對手不得不防守的棋型(例如:“沖四”、“活三”);那么下一步對手就會照你的思路來防守你,如此一來便完成了第一步的預測。這時候在調(diào)用盤面分析模塊對預測后的棋型進行分析,如果出現(xiàn)了“四三”、“雙三”或“雙四”等制勝點,那么己方就可以獲勝了。否則照同樣的方法向下分析,就可以預測出多步。如果盤面上沒有對手必須防的棋型,進攻不成的話就得考慮防守了,將自己和對手調(diào)換一下位置,然后用上面的方法來預測對手的棋重要防守和攻擊都可以平衡,不過缺點是預測的算法量比較大。關(guān)于增加細致的特定棋形的判斷,前面已經(jīng)說過,以為不同的棋型,例如“死四”就有不同的幾種情況,如果對每一種設(shè)置不同的重要值,也可以提高電腦AI,但是要設(shè)置合適的分數(shù)就要在實踐中檢驗了,因為這個不是大小的問題,而是相差多少。正如前面所說,增加對細致棋型的判斷也會提高電腦AI,雖然沒有遞歸算法明顯,但的確是一種途徑,不過考慮的因素較多。關(guān)于電腦學習,這聽起來似乎是算法無法實現(xiàn)的功能。但是在對弈中卻是非常有用的,但還只是些理論上的東西,比如棋局結(jié)束后,反向搜索,在自己的棋庫中設(shè)置相關(guān)記憶。但我并不以為這是很好的方法。因為用這種方法,很有可能它沒有找準原因,又或者進行學習的時候反而把劣等的學習進去;并且這種學習是很片面的,它只會認準一種極相似的情況(或者說一模一樣的棋局情況),而不會辨識出相似的棋局情況。結(jié)論通過本次課題的研究,用JAVA實現(xiàn)了五子棋人工智能和網(wǎng)絡(luò)游戲。知道了這個課題的關(guān)鍵是電腦AI算法,在研究和編程其間,有了很多新的想法,同時對JAVA套接字編程也有了更新的認識。對五子棋相關(guān)規(guī)則及技巧有了新的收獲,最重要的是自己動手解決問題的能力得到了提高。其中人工智能部分,由于采用了大量的搜索算法,其中很多被利用到各方面。它的概念、方法和技術(shù),正在各行各業(yè)廣泛滲透。智能已經(jīng)成為當今各種新產(chǎn)品、新裝備的發(fā)展方向。隨著新的算法和理論的研究,人工智能必定會在人們生活中扮演重要的角色。參考文獻[1]耿祥義,張躍平.Java2實用教程(第二版).北京:清華大學出版社,2004.2。[2]何橋,李肅義.Java2程序設(shè)計簡明教程.北京:中國水利水電出版社,2004。[3]榮欽科技.Java2游戲設(shè)計.北京:清華大學出版社,2004.11。[4]徐立,孫計安.Java應用與開發(fā)案例教程.北京:清華大學出版社,2005.7。[5]林飛.中國藝術(shù)經(jīng)典全書之五子棋.吉林:吉林攝影出版社.2003.12。[6]彭建國,那威.連珠五子棋入門.北京:金盾出版社.1997.6。致謝本文是在吳春旺老師的熱情關(guān)心和指導下完成的,他淵博的知識和嚴謹?shù)闹螌W作風使我受益匪淺,對順利完成本課題起到了極大的作用。在此向他表示我最衷心的感謝!感謝本班的黃澤角同學,他的構(gòu)思給了我很大的幫助,特別是搜索算法方面。在論文完成過程中,本人還得到了其他老師和許多同學的熱心幫助,本人向他們表示深深的謝意!最后向在百忙之中評審本文的各位專家、老師表示衷心的感謝!作者簡介姓名:趙小龍 性別:男出生年月:1984年11月06日 民族:羌E-mail:zhao4824593@163聲明本論文的工作是2007年2月至2007年6月在成都信息工程學院網(wǎng)絡(luò)工程系完成的。文中除了特別加以標注地方外,不包含他人已經(jīng)發(fā)表或撰寫過的研究成果,也不包含為獲得成都信息工程學院或其他教學機構(gòu)的學位或證書而使用過的材料。除非另有說明,本文的工作是原始性工作。關(guān)于學位論文使用權(quán)和研究成果知識產(chǎn)權(quán)的說明:本人完全了解成都信息工程學院有關(guān)保管使用學位論文的規(guī)定,其中包括:(1)學校有權(quán)保管并向有關(guān)部門遞交學位論文的原件與復印件。(2)學??梢圆捎糜坝 ⒖s印或其他復制方式保存學位論文。(3)學校可以學術(shù)交流為目的復制、贈送和交換學位論文。(4)學??稍试S學位論文被查閱或借閱。(5)學??梢怨紝W位論文的全部或部分內(nèi)容(保密學位論文在解密后遵守此規(guī)定)。除非另有科研合同和其他法律文書的制約,本論文的科研成果屬于成都信息工程學院。特此聲明!作者簽名:2007年06月日Chapter1ThenightIcalledattheManhattanGeneraltopickupthisladydoctorIwasdating,somethingquiteextraordinaryhappened.ForMiriamandme,itwasthefirstinachainofeventsthatweretochangeourlives-mineespecially-inawaythatneitherofuscouldpossiblyhaveimagined.Forwhatwestumbledacrossthatnightwasnotthebeginningofthestory.IfIamtobelievewhatIhavelearnedsofar,thebeginningwasbeforeandbeyondTimeasweknowit.Ourlife-streamsalongwiththoseofthehandfulofotherpeoplewhobecameinvolved-haveestablishedabriefinterfacewithacosmiceventwhosemagnitudedwarfstheimagination.Ifthisisstartingtosoundheavy,holdon.I'mnotkidding.Thisisgoingtochangeallourlivesbeforeit'sover.Orendthem.It'sthatbig-andthatsimple.Evenso,Idon'tguaranteetoexplaineverything.You'llhavetofiguresomeofthisoutforyourselves.That'sthe'wayitworks.Butit'sonehellofastory.I'vegotnotes,photographs,tape-recordings.AlltheevidenceislockedinasafetydepositboxregisteredinmynameattheForty-seventhandMadisonBranchoftheChaseManhattanBank.I'veputdowneverythingIsawandeverythingthatwassaidjustthewayithappened.ItcanallbecheckedagainstthisaccountIamwritingnow.It'salltrue.Everywordofit.SohelpmeGod.Beforewegoanyfurther,I'dbettertellyouwhoIam.MynameisLeoResnick.I'mthirty-fiveyearsoldand,atthetimethisthingstarted,IwasapartnerintheManhattanlawfirmofGutzman,SchonfeldandResnick.Thefirmspecialisesincorporatelegalworkbutoccasionallyhandlesdivorcesuitsforitsmorefavouredclients.Iwassupposedtobemakinggoodasaclaimsattorney.Howtruethat9is,isnotformetosay,buttheyputmynameonthedoorlastChristmassoIguessImusthavebeendoingsomethingright.Let'sjustsaythatitbroughtinenoughtoeatoutinrestaurantswheretheydon'tputthepricesonthemenus,runathree-litrePorscheCarrera,paythebillsonaniceapartmentupon75thStreetandaweekendplaceoverlookingtheHudson.Exceptthattoseetheriver,youhavetostandontheroof.Actually,thehouseatSleepyHollowwaslefttomebymyuncle.Still,itaddedtomynetworthandgavemeproblemslikereplacingshingles,cuttinggrass,buyingheatingoilandalarmsystems.Andsoon.Buttherewereafewbonusestoo.Ifyouhadtimetolook,yougottoseetheleaveschangecolour,cloudsmovingacrossaPanavisionpieceofsky,hearthewindinthetrees,andsplitkindlingforthelogfireintheliving-room.ThewholeBack-to-Naturebit.Tobehonest,Ididn'tgetupthereallthatoften.Idon'tknowaboutyou,butIalwaysgotalittletwitchysittingaroundjustlisteningtothegrassgrow.Ineededthebuzzfromthestreets,thebig-cityhypetogetmynerve-endstingling.Someofthattangy,rush-hourtrafficairinmylungs.Itsharpensaguyup.Makeshimfeelhuman.Intown,mostofmytimewasspentworking.Eitherattheofficeormyapartment.Boninguponcaselaw,layingthegroundworkforsuits.Lookingforangles.I'mnotmarried.I'dbeengoingsteadywiththisladydoctorforacoupleofyears.Iguessyoucouldsaywewereclosebutneitherofushadletitgettooserious.Inotherwords,I'mopentooffers.Miriam-that'stheladydoctor-knewtheycamemywaynowandthen.Shewasn'ttoowildaboutitbutwealwaysmanagedtoavoidanyheavyscenes.Somuchforromance.I'vegotasister,Bella,who'smarriedtoadentistupinBoston.SheusedtoplaycellowiththePhilharmonicbutnowshe'sintokidsandclambakes.MyparentsliveinFlorida.TheywerealwayswritingtotellmeIshouldvisitthemmoreoftenandthatIshouldholidayinI)isneyWorld.Ididn'tliketotellthemthatIpreferredFritztheCattoMickeyMouseandthatIhadn'tbeentosynagoguesinceBella'swedding.Endoflifestory.There'smore,ofcourse,butwedon'tneedtogetintothathere.Let'sgetbacktowhereIgotinvolvedinthisthing.TheManhattan~ieneral.IhadarrangedtopickupMiriambetweennine-fifteenandnine-thirty.theplanwastohavedinnerandcatchalatemoviebythatGermanguyFassbinder.IfindhimalittleheavybutMiriamiscompletelyhookedontheartmoviescene.IthadbeenraininghardandI'dhadsometroubleingettingacab.Asaresult,Ididn'tarriveattheManhattanGeneraluntilnine-fiftyish.Shewasn'twaitingatthedesk.Thedutynurse,whoknewwhoIwas,phonedaroundandlocatedMiriaminthemorgue.Itriedtofigureoutwhatshewasdoingthere.Normally,sheworksinEmergencyandIknowshehateslosingout.Miriamtoldthenursethatshe'dberightup.Iduckedouttolookforacab,buttherewasnothinginsight.AsIwalkedbackintothebuilding,Miriamsteppedoutoftheelevator.Ialwayslikedseeingherinherwhitecoatwithastethoscoperoundherneck.IguessitwasbecauseitmademefeellikearesponsiblecitizenandbecauseIknewthatmyparents.wouldapproveifthey'dknownabouther.Whichtheydidn't.Orthatwhenshegotthatwhitecoatandtherestofherthingsoff,shewasareallygreatpieceofass.Wegaveeachotherahello-typekiss,thenshetookmyarmandwalkedmeawayfromthedesk.'Wemaybestuckhereforalittlewhile.Didyoumakeareservation?''No,'Isaid.'Iwasn'tplanningongoinganywherefancy.Haveyougotsomekindofcrisis-orarewejustgoingtosneakoffandgetstiffonlabalcohol?''Neither,'repliedMiriam.'Listen,anambulanceonanNYPDcallbroughtinamanabouthalfanhourago.ItturnedoutthathewasaDOAwhoshouldhavegonetothecitymorguebut-'sheshrugged.'-maybetheythoughtwecouldgivehimthekissoflife.Anyway,therewassomethingabouthimthatreallythrewme.Iwantyoutotakealookandtellmewhatyouthink.'Shehittheelevatorbutton.Igrimaced.'Youmean-inthemorgue?''Yes.'Shesmiled.'Hey,that'ssomethingI'veneveraskedyou.Haveyouseendeadbodiesbefore?''I'veseei~acoupleofcarcrashes,'Isaid.'Buttheyweremainlybloodandfeetstickingoutfromtheblankets.'Theelevatorcame.Miriamusheredmein.'I)on'tworry.He'sstillinonepiece.'Ieyedherwarily.'Youpromise?Nomessyexitwounds?''No.Nothinglikethat.'Shetookholdofmyhandandleadmeoutoftheelevatorwhenitreachedthebasement."Ihisway,l)rResnick.I'llgetyouawhitecoat.'Smartmove.PuttingmeinawhitecoatmeantthatIcouldn'tpassIIoutwithoutlookingfoolish.Icomposedmyselfasweenteredthemorgueandwalkedovertowherethebodylayhalf-coveredbyas

溫馨提示

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

最新文檔

評論

0/150

提交評論