版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2010 屆畢業(yè)生 畢業(yè)論文 題題 目:目: 五子棋游戲五子棋游戲 院系名稱:院系名稱: 信息學(xué)院信息學(xué)院 專業(yè)班級(jí):專業(yè)班級(jí): 計(jì)算機(jī)科學(xué)與技術(shù)計(jì)算機(jī)科學(xué)與技術(shù) 0606 級(jí)級(jí) 6 6 班班 學(xué)生姓名:學(xué)生姓名: 學(xué)學(xué) 號(hào):號(hào): 指導(dǎo)教師:指導(dǎo)教師: 教師職稱:教師職稱: 助教助教 起止日期:起止日期: 2010-03-12010-06-042010-03-12010-06-04 地地 點(diǎn):點(diǎn): 河南工業(yè)大學(xué)蓮花街校區(qū)河南工業(yè)大學(xué)蓮花街校區(qū) 20102010 年年 6 6 月月 2 2 日日 摘 要 五子棋起源于古代中國(guó),發(fā)展于日本,風(fēng)靡于歐洲,不僅以其簡(jiǎn)單易學(xué)的特性,為 廣大群眾所喜聞樂見
2、,而且又有深?yuàn)W的技巧和高水平的國(guó)際性比賽。五子棋不僅能增強(qiáng) 思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。它的棋文化源淵流長(zhǎng),具有東 方的神秘和西方的直觀,既有“場(chǎng)”的概念,亦有“點(diǎn)”的連接,它是中西文化的交流 點(diǎn),是古今哲理的結(jié)晶。 這次設(shè)計(jì)以五子棋游戲?yàn)檩d體,綜合使用 J2SE 中的各項(xiàng)核心技術(shù),開發(fā)出界面友好、 初步具備博弈能力的、能夠模擬網(wǎng)絡(luò)對(duì)戰(zhàn)的應(yīng)用程序。根據(jù)游戲不同的運(yùn)行模式,將整 個(gè)系統(tǒng)分為兩種模式:人機(jī)對(duì)戰(zhàn)模式和模擬網(wǎng)絡(luò)對(duì)戰(zhàn)模式。這兩種不同的模式在設(shè)計(jì)和 實(shí)現(xiàn)過程中的側(cè)重點(diǎn)是不相同的,人機(jī)對(duì)戰(zhàn)模式的重點(diǎn)是人工智能算法的實(shí)現(xiàn),需要綜 合運(yùn)用所學(xué)的數(shù)據(jù)結(jié)構(gòu)課程的算法知識(shí),設(shè)計(jì)出
3、能夠智能選擇最優(yōu)的走法的算法。而網(wǎng) 絡(luò)對(duì)戰(zhàn)模式的重點(diǎn)是通過 Java 中的 Socket 網(wǎng)絡(luò)編程技術(shù)實(shí)現(xiàn)網(wǎng)絡(luò)中的點(diǎn)對(duì)點(diǎn)通信。 本系統(tǒng)編程語言選擇使用 Java。 基于 Java 的五子棋游戲的總體功能是要設(shè)計(jì)出具有友好界面的、具備人工智能的、 支持模擬網(wǎng)絡(luò)對(duì)戰(zhàn)的五子棋游戲。為了滿足這些功能要求,基于 Java 的五子棋游戲需要 達(dá)到以下目標(biāo): (1)制定合法的規(guī)則,能夠判斷出非法操作,以使游戲能公正地進(jìn)行并分出勝負(fù)。 (2)支持人機(jī)對(duì)戰(zhàn),能夠讓計(jì)算機(jī)按照游戲規(guī)則通過人工只能自行選擇最優(yōu)走法。 (3)模擬網(wǎng)絡(luò)對(duì)戰(zhàn),能夠支持兩個(gè)用戶通過網(wǎng)絡(luò)連接進(jìn)行對(duì)戰(zhàn)。 (4)具有精美的操作界面,方便用戶操作和
4、使用。 關(guān)鍵字: 五子棋游戲 人工智能 網(wǎng)絡(luò)編程 Title Gobang game Abstract Gobang originated in ancient China, developed in Japan, popular in Europe, not only easy to learn its characteristics, as loved by the masses, but there are profound skills and a high level of international competition. Gobang not only enhance the
5、thinking ability, but also improve intelligence, and rich in philosophy will help self-cultivation. Its source of the chess culture, elongated, with Eastern and Western mystical intuition, both field concept, there are points The connection, which is the exchange point of Chinese and Western culture
6、s, is the crystallization of ancient and modern philosophy. The gobang game is designed as a carrier in the integrated use of the J2SE core technology to develop attractive interface and powerful to simulate online play applications. According to the modes of the game, the whole system is divided in
7、to two modes: Versus mode and simulate machine online play mode. These two different models in the design and implementation process of the focus is not the same, the focus of Human Versus mode is artificial intelligence algorithm, which needs to use what they have learned data structure algorithm k
8、nowledge, designed to Intelligent optimal selection algorithm taking the law; and online play mode, which focuses on the Socket Network Programming Java technology peer to peer network communication between two computers. The system programming language is Java. Java-based gobang overall function is
9、 to design a beautiful interface, with artificial intelligence to support the analog network versus the gobang game. To meet these functional requirements, the gobang game based on Java needs to achieve the following objectives: (1)To develop legal rules to determine the illegal operation, so the ga
10、me can be conducted fairly and winner. (2)Support the man-machine gaming, can let the computer manually according to rules of the game can only choose the best moves. (3)Analog online play, can support two users over a network connection to play against. (4)Has a beautiful interface, user-friendly o
11、peration and use. Keywords: Gobang game Programming Artificial Intelligence Socket Network 目目 次次 1 緒論 .1 1.1 引言.1 1.2 項(xiàng)目開發(fā)的背景和意義.1 1.3 項(xiàng)目開發(fā)的相關(guān)技術(shù).2 1.3.1 Java 技術(shù)的發(fā)展 .2 1.3.2 Java 的優(yōu)越性 .2 1.3.3 用 Java 開發(fā)游戲所用到的技術(shù) .3 1.4 用 JAVA開發(fā)游戲所出現(xiàn)的問題 .6 1.4.1 速度 .6 1.4.2 平臺(tái)依賴性 .6 1.4.3 游戲開發(fā)資源 .6 2 項(xiàng)目需求分析 .7 2.1 人機(jī)對(duì)戰(zhàn)
12、基本功能分析.7 2.2 網(wǎng)絡(luò)對(duì)戰(zhàn)基本功能分析 .7 2.3 其它功能分析 .8 3 概要設(shè)計(jì) .9 3.1 項(xiàng)目總體規(guī)劃.9 3.2 項(xiàng)目模塊劃分.11 4 詳細(xì)設(shè)計(jì)與編碼實(shí)現(xiàn) .13 4.1 創(chuàng)建棋盤類 .13 4.1.1 Java 圖形編程 .13 4.1.2 棋盤類的算法實(shí)現(xiàn) .15 4.2 創(chuàng)建信息傳送類 .18 4.3 創(chuàng)建支持網(wǎng)絡(luò)對(duì)戰(zhàn)的服務(wù)器類 .19 4.4 創(chuàng)建支持網(wǎng)絡(luò)對(duì)戰(zhàn)的客戶端類.20 4.5 網(wǎng)絡(luò)對(duì)戰(zhàn)的實(shí)現(xiàn)原理 .22 5 項(xiàng)目測(cè)試 .24 結(jié) 論 .32 致 謝 .33 參考文獻(xiàn) .34 1 1 緒論緒論 1.11.1 引言引言 人工智能是近年來很活躍的研究領(lǐng)域之一。
13、計(jì)算機(jī)博弈是人工智能研究的一個(gè)重 要分支,它的研究為人工智能帶來了很多重要的方法和理論,產(chǎn)生了廣泛的社會(huì)影響 和學(xué)術(shù)影響。國(guó)內(nèi)外對(duì)博弈的研究已經(jīng)較為廣泛,特別是 IBM 的國(guó)際象棋程序“深藍(lán)” , 已經(jīng)達(dá)到了人類的世界冠軍水平。 “深藍(lán)”的研究成果,特別是基于剪枝的極大極小樹 搜索技術(shù)為設(shè)計(jì)其它的計(jì)算機(jī)棋類博奕系統(tǒng)提供了良好的參照。但是不同的棋類博奕, 其規(guī)則的千差萬別賦予了每一種棋類博奕特殊的專業(yè)知識(shí)。這就必然要求設(shè)計(jì)一個(gè)具 體的棋類博奕系統(tǒng)時(shí),應(yīng)該深入研究它的基本原理和內(nèi)在規(guī)律。在國(guó)際上,人工智能 也廣泛應(yīng)用于游戲產(chǎn)業(yè)。整個(gè)游戲業(yè)的收入已經(jīng)越過了電影業(yè),2001 年,全球的游戲 市場(chǎng)達(dá)到
14、165 億美元,而電影業(yè)則為 160 億美元。2003 年,為了推動(dòng)國(guó)內(nèi)游戲產(chǎn)業(yè)的 發(fā)展,我國(guó)已將網(wǎng)絡(luò)游戲關(guān)鍵技術(shù)納入國(guó)家 863 項(xiàng)目的研究課題。游戲行業(yè)發(fā)展日新 月異,在日美歐已經(jīng)成為主流娛樂業(yè)。本文以五子棋游戲做為設(shè)計(jì)題目,是在參考了 大量的相關(guān)文獻(xiàn)的基礎(chǔ)上,按照人工智能原理設(shè)計(jì)的一個(gè)五子棋游戲。 1.21.2 項(xiàng)目開發(fā)的背景和意義項(xiàng)目開發(fā)的背景和意義 人工智能是一門正在迅速發(fā)展的新興的綜合性很強(qiáng)的邊緣科學(xué)。它與生物工程、 空間技術(shù)一起被并列為二十一世紀(jì)三大尖端技術(shù)。它的中心任務(wù)是研究如何使計(jì)算機(jī) 去做那些過去只能靠人的智力才能做的工作。目前,各發(fā)達(dá)國(guó)家都把人工智能作為重 點(diǎn)列入本國(guó)的高
15、科技發(fā)展計(jì)劃當(dāng)中,投入巨大的人力和物力。作為一門邊緣學(xué)科,它 有諸多的研究領(lǐng)域:專家系統(tǒng)、決策支持系統(tǒng)、機(jī)器學(xué)習(xí)、機(jī)器視覺、自然語言理解 等等,計(jì)算機(jī)博奕也是其中之一,博奕就是對(duì)策,這是自然界中的普遍現(xiàn)象,它不僅 存在于游戲、下棋之中,而且存在于政治、經(jīng)濟(jì)、軍事和生物競(jìng)爭(zhēng)中,搏奕的參加者 可以是個(gè)人、集體、一類生物和機(jī)器,他們都力圖用自己的智力去擊敗對(duì)手。作為人 工智能研究的一個(gè)重要分支,計(jì)算機(jī)博奕是檢驗(yàn)人工智能發(fā)展水平的一個(gè)重要方面。 它的研究為人工智能帶來了很多重要的方法和理論,產(chǎn)生了廣泛的社會(huì)影響和學(xué)術(shù)影 響。在計(jì)算機(jī)日益普及和大眾化的現(xiàn)代社會(huì),高水平的博奕系統(tǒng)很容易獲得可觀的商 業(yè)價(jià)值
16、,目前,世界領(lǐng)先的計(jì)算機(jī)圍棋程序基本上都是商業(yè)產(chǎn)品。事實(shí)上,個(gè)人計(jì)算 機(jī)軟件市場(chǎng)的大約80銷售額是來自游戲軟件,其中有傳統(tǒng)的博奕游戲。 五子棋起源于古代中國(guó),發(fā)展于日本,風(fēng)靡于歐洲。對(duì)于它與圍棋的關(guān)系有兩種 說法,一說早于圍棋,早在“堯造圍棋”之前,民間就已有五子棋游戲;一說源于圍 棋,是圍棋發(fā)展的一個(gè)分支。在中國(guó)的文化里,倍受人們的青睞。古代的五子棋的棋 具與圍棋相同,縱橫各十七道。五子棋大約隨圍棋一起在我國(guó)南北朝時(shí)先后傳入朝鮮、 日本等地。據(jù)日本史料文獻(xiàn)介紹,中國(guó)古代的五子棋是經(jīng)由高麗(朝鮮),于1688年至 1704年的日本元祿時(shí)代傳到日本的。到日本明治32年(公元1899年),經(jīng)過公開
17、征名, “連珠”這一名稱才被正式確定下來,取意于“日月如合壁,五星如連珠” 。從此,連 珠活動(dòng)經(jīng)過了不斷的改良,主要是規(guī)則的變化(即對(duì)執(zhí)黑棋一方的限制),例如,1899 年規(guī)定,禁止黑白雙方走“雙三” ;1903年規(guī)定,只禁止黑方走“雙三” ;1912年規(guī)定, 黑方被迫走“雙三”亦算輸;1916年規(guī)定,黑方不許走“長(zhǎng)連” ;1918年規(guī)定,黑方不 許走“四、三、三” ;1931年規(guī)定,黑方不許走“雙四” ,并規(guī)定將1919的圍棋盤改 為1515的連珠專用棋盤。本世紀(jì)初五子棋傳入歐洲并迅速風(fēng)靡全歐。通過一系列的 變化,使五子棋這一簡(jiǎn)單的游戲復(fù)雜化、規(guī)范化,而最終成為今天的職業(yè)連珠五子棋, 同時(shí)也
18、成為一種國(guó)際比賽棋。直到今天,五子棋作為一種休閑娛樂游戲,集趣味性、 娛樂性、互動(dòng)性和益智性于一體,仍然深受人們喜愛。這次設(shè)計(jì)以就是五子棋游戲?yàn)?載體,利用人工智能的原理,綜合使用J2SE中的各項(xiàng)核心技術(shù),開發(fā)出具有友好界面 的、具備人工智能的、支持模擬網(wǎng)絡(luò)對(duì)戰(zhàn)的五子棋游戲。 1.31.3 項(xiàng)目開發(fā)的相關(guān)技術(shù)項(xiàng)目開發(fā)的相關(guān)技術(shù) 1.3.1 Java 技術(shù)的發(fā)展 自 1995 年 5 月正式推出以來,Java 已從編程語言發(fā)展成為全球第一大通用開發(fā)平 臺(tái)。Java 技術(shù)已為計(jì)算機(jī)行業(yè)主要公司所采納,同時(shí)也被越來越多的國(guó)際技術(shù)標(biāo)準(zhǔn)化 組織所接受。1999 年,Sun 推出了以 Java2 平臺(tái)為核
19、心的 J2EE、J2SE 和 J2ME 三大平 臺(tái)。隨著三大平臺(tái)的迅速推進(jìn),在世界上形成了一股巨大的 Java 應(yīng)用浪潮。 今天,全球有 25 億 Java 器件運(yùn)行著 Java,450 多萬 Java 開發(fā)者活躍在地球的每 個(gè)角落,數(shù)以千萬計(jì)的 Web 用戶每次上網(wǎng)都親歷 Java 的威力。Java 運(yùn)行在 7.08 億手 機(jī)、10 億智能卡和 7 億 PC 機(jī)上,并為 28 款可兼容的應(yīng)用服務(wù)器提供了功能強(qiáng)大的平 臺(tái)。這么多應(yīng)用,徹底改變了用戶的生活。越來越多的企業(yè),因?yàn)槭褂昧?Java 而提高 了生產(chǎn)效率。在中國(guó),越來越多的用戶,因?yàn)?Java 而降低了成本,享受到了 Java 帶 來的
20、便利。 1.3.2 Java 的優(yōu)越性 Java 技術(shù)已經(jīng)日漸成熟,利用 Java 開發(fā)五子棋游戲有著得天獨(dú)厚的優(yōu)越性。因 為 Java 是一門經(jīng)過充分發(fā)展,已經(jīng)十分成熟的語言,用 Java 開發(fā)游戲極大的方便了 游戲腳本的使用以及 Java 的網(wǎng)絡(luò)功能。這些都足以證明運(yùn)用 Java 開發(fā)本項(xiàng)目的正確 性。 (1)Java 是一門經(jīng)過充分發(fā)展,已經(jīng)十分成熟的語言 Java 語言稱霸企業(yè)級(jí)應(yīng)用這么多年,事實(shí)證明了它非常適合于開發(fā)大型軟件。當(dāng) Java 的運(yùn)行效率不再是問題的時(shí)候,Java 語言嚴(yán)謹(jǐn)、高抽象、可讀性強(qiáng)的優(yōu)勢(shì)就體現(xiàn) 出來了。這對(duì)于規(guī)模越來越龐大的游戲軟件來說,有著不小的誘惑。 (2)
21、用 Java 開發(fā)游戲,極大的方便了游戲腳本的使用 對(duì)于游戲開發(fā)來說,由于涉及到比較復(fù)雜的情況(有時(shí)候甚至是美學(xué)問題),開發(fā) 過程很多時(shí)候是一個(gè)不斷修改的過程,可以方便的修改游戲內(nèi)容是十分關(guān)鍵的,由于 其虛擬機(jī)特性,Java 本身就可以用來編寫游戲腳本,是一種完全的面向?qū)ο笳Z言,這 意味著,用戶可在游戲中很方便擴(kuò)展和繼承他其之前的代碼,而不像結(jié)構(gòu)化程序設(shè)計(jì) 語言那樣再重新開發(fā)新的類庫(kù)。比如說已經(jīng)開發(fā)了某一類游戲的引擎,以后再開發(fā)類 似的游戲時(shí)幾乎不要任何改動(dòng)就可重新使用這個(gè)引擎,所要做的只是替換掉游戲中的 圖形、聲音、動(dòng)畫等子系統(tǒng)。此外,目前也有例如 beanshell、groovy 等腳本語
22、言可 以方便的、無縫的和 Java 語言進(jìn)行交互,這些都極大的方便了 Java 游戲編程。 (3)網(wǎng)絡(luò)功能 Java 一向強(qiáng)于解決網(wǎng)絡(luò)方面的問題,在這方面 Java 主要有兩個(gè)優(yōu)勢(shì),第一是基 于 applet 和 Java web start 的游戲非常容易更新,不會(huì)像其他游戲那樣需要用戶手 動(dòng)下載全新版本;第二是 Java 在網(wǎng)絡(luò)交互的 api 相對(duì)比較友好,而對(duì)于大型網(wǎng)絡(luò)游戲 來說,分布式系統(tǒng)非常重要。Java 擁有強(qiáng)大的網(wǎng)絡(luò)功能,能很容易的和網(wǎng)頁結(jié)合在一 起發(fā)布到世界各地。游戲者只要通過瀏覽器就可體會(huì)到游戲所帶來的樂趣。這意味著, 游戲?qū)⒚媾R著擁有全世界的玩家這個(gè)巨大市場(chǎng)。 1.3.3
23、用 Java 開發(fā)游戲所用到的技術(shù) 這些年由于 Java 技術(shù)的不斷發(fā)展,Java 程序的運(yùn)行速度有了顯著提升,同時(shí)硬件 技術(shù)也在不斷進(jìn)步,從而使得 Java 處理比較復(fù)雜的 3d 圖形成為可能。Java 多線程模 型、主動(dòng)繪圖,雙緩沖技術(shù)、頁面交換技術(shù)、Lwjgl、Jogl、Java3D 等技術(shù)的出現(xiàn),使 Java 語言可以方便的利用現(xiàn)在的顯卡日益強(qiáng)大的硬件加速能力。實(shí)際上目前已經(jīng)有許 多基于 Java 的 2d 和 3d 游戲,其中不乏大型多人在線游戲。 (1)Java 多線程模型 要使用線程,可以擴(kuò)Thread類或?qū)崿F(xiàn)Runnable接口。線程啟動(dòng)后并沒有馬上運(yùn)行, 而是處于Runnab
24、le的狀態(tài)的線程才有機(jī)會(huì)被調(diào)度執(zhí)行,線程被調(diào)度執(zhí)行就處于Running 的狀態(tài)了,線程執(zhí)行完run方法,或者被調(diào)用interrupt方法中斷就會(huì)成為Dead狀態(tài), 線程執(zhí)行過程中執(zhí)行任何對(duì)象的wait方法,執(zhí)行sleep方法、或執(zhí)行同步IO操作時(shí)會(huì)分 別轉(zhuǎn)換為Waiting、Sleeping、Blocked的狀態(tài),這些都是Non-Runnable的狀態(tài),即使 CPU有空余時(shí)間,處于這些狀態(tài)的線程也不會(huì)被調(diào)度運(yùn)行,當(dāng)導(dǎo)致他們停止運(yùn)行的情況 解除時(shí),他們可以重新轉(zhuǎn)換為Runnable的狀態(tài),等待下次被調(diào)度運(yùn)行。相對(duì)于Dead狀 態(tài),Runnable、Running、Non-Runnable的狀態(tài)下
25、的線程都是Alive的。在進(jìn)行動(dòng)畫編 程時(shí),我們經(jīng)常接觸的是sleep方法,該方法容許線程暫停一段指定的時(shí)間,然后恢復(fù) 執(zhí)行。 (2)主動(dòng)繪圖 一般編寫Java的繪圖程序都是在Component類的paint(Graphics曲方法中進(jìn)行,在 動(dòng)畫線程中調(diào)用repaint()方法,repaint方法只是往組件的事件隊(duì)列中添加了UPDATE 的事件,當(dāng)Java的AWT線程處理到這個(gè)事件時(shí),會(huì)調(diào)用Component的update()方法,在 update()方法中才會(huì)調(diào)用paint(Graphics g)方法。由于我們采用了一個(gè)單獨(dú)的動(dòng)畫線 程,我們也可以主動(dòng)繪圖,主動(dòng)繪圖就是要通過Compone
26、nt類的getGrahics0取得 Graphics對(duì)象,然后將該對(duì)象傳入paint(Graphics g)方法中繪圖,利用主動(dòng)繪圖一般 可以提高繪圖的效率。 (3)雙緩沖技術(shù) 雙緩沖技術(shù)是經(jīng)典的消除屏幕閃爍的技術(shù),由于顯示屏上的一段屏幕區(qū)域?qū)?yīng)著 顯卡中的一段緩存,如果直接往緩存中寫入我們的圖像,而且寫入的操作比較耗時(shí), 屏幕上就會(huì)看到閃爍。用雙緩沖技術(shù),就是另外建立一個(gè)離屏(Offscreen)的緩存,繪 圖時(shí),先繪到離屏緩存中,然后將離屏緩存中的內(nèi)容一次性復(fù)制到顯卡的緩存中,這 樣就可以有效地消除閃爍。 在JavaAWT/Swing中,在沒有使用主動(dòng)繪圖的情況下,我們通過調(diào)用repain
27、t()函 數(shù)來間接調(diào)用paint(Graphics g)函數(shù),而paint(Graphics g)函數(shù)是由 update(Graphics g)函數(shù)來調(diào)用的。這樣update(Graphics g)函數(shù)就成為我們建立離 屏緩存的理想場(chǎng)所,而paint(Graphics g)函數(shù)可以保持不變。 (4)頁交換技術(shù)(page flipping) 雙緩沖技術(shù)有效地解決了屏幕閃爍的問題,但它存在一個(gè)缺點(diǎn),就是每次繪圖都 需要將離屏緩存中的內(nèi)容拷貝到屏幕緩存中,如果屏幕的分辨率是800*600,顏色使用 16位的話,一屏就需要800600+2=938KB,差不多1M的數(shù)據(jù),如果程序中每秒畫30幀 圖像的話
28、,每秒種就要復(fù)制大約30M的圖像數(shù)據(jù)!雖然這在大多數(shù)情況下都沒有問題, 但我們肯定希望有更好的解決方案,這就是頁交換技術(shù)。 使用頁交換技術(shù)同樣是有兩個(gè)緩存,但不是將離屏緩存的數(shù)據(jù)拷貝到屏幕緩存中, 而是將屏幕緩存直接指向離屏緩存,原來的屏幕緩存變成離屏緩存,這樣就循環(huán)往復(fù), 就不需要不斷地拷貝數(shù)據(jù)了。 使用頁交換又引出另外一個(gè)問題,如果在顯示器刷新的過程中我們交換了屏幕緩 存,那么就會(huì)導(dǎo)致用戶看到的屏幕內(nèi)容一部分來自于原來的屏幕緩存,一部分來自于 當(dāng)前的屏幕緩存,從而導(dǎo)致屏幕撕裂的情況,為了防止這種情況,我們必須在顯示器 更新的間隙交換緩存。幸運(yùn)的是,Java圖像庫(kù)中已經(jīng)提供了BufferSt
29、rategy類來解決 這個(gè)問題。 BufferStrategy類會(huì)根據(jù)系統(tǒng)環(huán)境自動(dòng)選擇最佳的方案來實(shí)現(xiàn)緩存,首先,會(huì)嘗 試頁交換,如果不行就使用雙緩沖,當(dāng)使用頁交換時(shí),它會(huì)等待顯示器刷新完畢才進(jìn) 行頁交換。Canvas和Window子類的實(shí)例都能有一個(gè)BufferStrategy對(duì)象,至少需要兩 個(gè)緩存,可以使用window.createBufferStrategy(2)來使用BufferStrategy,以下代 碼通過BufferStrategy取得Graphics對(duì)象來繪圖。 (5)Java3D技術(shù) 作為 sun 公司較早推出的一項(xiàng) 3d 技術(shù),是一種高度封裝的 api,構(gòu)建在 openg
30、l 和 direct3d 之上,可以說是最有名的 Java 的 3d 技術(shù)。由于種種原因(api 設(shè)計(jì),面向 用戶的不明確),Java3d 一直沒有辦法流行,不久前 Java3d 的團(tuán)隊(duì)宣布暫停對(duì) Java3d 新功能的開發(fā),轉(zhuǎn)而為 JavaFX 開發(fā) 3d 渲染引擎。同時(shí) sun 的另一個(gè)項(xiàng)目 project wonderland 宣布將其渲染引擎由 Java3d 轉(zhuǎn)為 JMonkeyEngine。令人遺憾的是 sun 的 Java3d 再次進(jìn)入塵封狀態(tài),大量基于 Java3d 的程序和教程都面臨一個(gè)非常尷尬的境 地,令人高興的是在這一領(lǐng)域終于有比 sun 做得更好的團(tuán)隊(duì)出現(xiàn)了。 (6)Lw
31、jgl 全名為 light weight Java game library。作為一個(gè)非官方的對(duì) Java 游戲的全面 解決方案,lwjgl 將游戲圖形(opengl)、音效(openal)、控制輸入集合為一,以成為 Java 界的 directx(不是 direct3d)而努力。其在圖形方面采用了 opengl 的 Java 綁定, 其函數(shù)與 c 語言版的完全相同,所以對(duì)于習(xí)慣 opengl 編程的程序員來說比較友好。目 前有大量的 Java 游戲和游戲引擎是基于 lwjgl 的,它可以說是 Java 游戲社區(qū)最廣為 被使用的函數(shù)庫(kù)之一。 (7)Jogl Jogl 是 Java 對(duì) open
32、gl 的一個(gè)綁定,或者說是 opengl 接口的 Java 實(shí)現(xiàn),它是由 sun 支持的。其語法與 opengl 完全相同,api 也緊跟隨著 opengl 的版本進(jìn)行更新,而 Nehe 的 opengl 范例程序大多數(shù)都有 Jogl 版本。去年 Jogl 正式通過 jcp 審核成為 jsr231,是 lwjgl 的主要競(jìng)爭(zhēng)者。值得一提的是,Jogl 項(xiàng)目的領(lǐng)導(dǎo)者 Ken Russell 曾 經(jīng)聲明并不希望 Jogl 成為 jre 的一部分,因?yàn)樗J(rèn)為這樣會(huì)使 Jogl 的更新周期與 jre 相同,從而變得過于緩慢。Ken Russell 目前全力工作在新的 Java plug-in 的開發(fā)上
33、, 而 opengl 的 api 也沒有進(jìn)行更改,所以現(xiàn)在的 jogl 版本將持續(xù)較長(zhǎng)的一段時(shí)間。 1.41.4 用用 JavaJava 開發(fā)游戲所出現(xiàn)的問題開發(fā)游戲所出現(xiàn)的問題 1.4.1 速度 Java 執(zhí)行代碼比 C+ 執(zhí)行代碼慢 10-20 秒,在游戲中這個(gè)看上去是個(gè)很大的缺 陷。但是在現(xiàn)在處理器速度不斷提高,Java 新的實(shí)時(shí)編譯器“Just-in-time”和快速 虛擬機(jī)的推出,兩者之間的速度差距已經(jīng)越來越小。 1.4.2 平臺(tái)依賴性 由于 Java 虛擬機(jī)消除了平臺(tái)的依賴性,所以使大家開發(fā)的依賴于某一平臺(tái)特性 的游戲便不能移植到別的平臺(tái)去。比如,某一個(gè) Java 游戲利用了 Wi
34、ndow 平臺(tái)的 DirectX 特性,而在 Linux 平臺(tái)下這一特性就不能使用了。 1.4.3 游戲開發(fā)資源 由于 Java 是個(gè)新生語言,游戲開發(fā)者大部分都還集中在 C、C+ 的陣營(yíng),Java 方面所能提供的游戲開發(fā)資源還是比較有限的,特別在國(guó)內(nèi)的主推 J2EE、J2ME 的環(huán) 境下。 2 2 項(xiàng)目需求分析項(xiàng)目需求分析 2.12.1 人機(jī)對(duì)戰(zhàn)基本功能分析人機(jī)對(duì)戰(zhàn)基本功能分析 人機(jī)對(duì)戰(zhàn)功能是整個(gè)項(xiàng)目的核心部分,用戶在選擇人機(jī)對(duì)戰(zhàn)功能后,電腦能夠根 據(jù)用戶的設(shè)置(先手) ,判斷電腦先走還是用戶先走,根據(jù)規(guī)定,先走的一方執(zhí)黑。在 人機(jī)對(duì)戰(zhàn)的過程中,電腦會(huì)根據(jù)人工智能算法,判斷下一步最優(yōu)落子位置
35、。最后,電 腦根據(jù)棋盤上棋子的狀態(tài),判斷是否存在有五子相連的棋型,如果有則判斷輸贏。 總的來說,人機(jī)對(duì)戰(zhàn)的精髓在于人工智能算法的實(shí)現(xiàn),就是要讓電腦知道該在哪 一點(diǎn)下子,這就需要根據(jù)盤面的形勢(shì),為每一可能落子的點(diǎn)計(jì)算其重要程度,也就是 就是當(dāng)這子落下后會(huì)形成什么棋型(例如“沖四” 、 “活三”等),然后通覽全盤選出最重 要的一點(diǎn),這便是最基本的算法思想。當(dāng)然,僅依靠當(dāng)前盤面進(jìn)行判斷是遠(yuǎn)遠(yuǎn)不夠的, 這樣下棋很容易掉進(jìn)對(duì)方預(yù)先設(shè)下的陷阱,因?yàn)闆]有考慮以后的變化。所以在此基礎(chǔ) 上可以加入遞歸調(diào)用,即在電腦中預(yù)測(cè)今后幾步的各種走法,以便作出最佳選擇。 對(duì)戰(zhàn)過程中,需要按照玩家或者電腦的意愿落子,這個(gè)是通
36、過函數(shù)判斷玩家鼠標(biāo) 點(diǎn)擊事件是否合法來實(shí)現(xiàn)的,而電腦根據(jù)人工智能算法,得出最佳的落子位置,直接 在這個(gè)坐標(biāo)上繪制棋子。具體玩家落子是這樣實(shí)現(xiàn)的,鼠標(biāo)放在棋盤上的交線的位置 附近時(shí),形狀會(huì)變成手形,這時(shí)玩家點(diǎn)擊鼠標(biāo),會(huì)通過函數(shù)獲取此交點(diǎn)的坐標(biāo),然后 在根據(jù)玩家的棋子顏色在這個(gè)坐標(biāo)處畫出棋子,這個(gè)過程的數(shù)據(jù)流圖如圖 2-1 所示。 審定合法的點(diǎn) 擊事件 點(diǎn)擊區(qū)域交線 處的坐標(biāo) 由坐標(biāo)和玩家棋 子顏色畫出棋子 鼠標(biāo)點(diǎn)擊區(qū)域合法區(qū)域 圖 2-1 落子數(shù)據(jù)流圖 2.22.2 網(wǎng)絡(luò)對(duì)戰(zhàn)基本功能分析網(wǎng)絡(luò)對(duì)戰(zhàn)基本功能分析 網(wǎng)絡(luò)對(duì)戰(zhàn)功能需要有服務(wù)器和客戶端兩個(gè)模塊。 服務(wù)器主要是通過命令得到服務(wù)器名稱,根據(jù)服務(wù)
37、器名稱和端口號(hào)建立 Socket 對(duì) 象,服務(wù)器在建立并啟動(dòng)以后,將執(zhí)行一個(gè)死循環(huán)的守護(hù)進(jìn)程,響應(yīng)隨時(shí)到來的客戶 端請(qǐng)求,并將建立起網(wǎng)絡(luò)連接的客戶端添加到一個(gè)用戶列表中,通過這樣的方法,所 有位于列表中的客戶端都可以通過服務(wù)器進(jìn)行通信了。服務(wù)器類負(fù)責(zé)在網(wǎng)絡(luò)對(duì)戰(zhàn)時(shí)維 護(hù)各在線用戶的基本信息和任意兩個(gè)對(duì)戰(zhàn)用戶所發(fā)出的信息,并動(dòng)態(tài)維護(hù)用戶列表。 客戶端在網(wǎng)絡(luò)對(duì)戰(zhàn)過程中代表玩家,可以同時(shí)開啟多個(gè)客戶端。負(fù)責(zé)游戲界面維 護(hù)和收集用戶輸入的信息,以及進(jìn)行錯(cuò)誤處理。其主要功能是與服務(wù)器進(jìn)行消息交互, 如一個(gè)玩家請(qǐng)求其他玩家進(jìn)行游戲,同時(shí)玩家能夠同意或者拒絕別人的游戲請(qǐng)求,在 同意進(jìn)行游戲后又要進(jìn)行落子的判斷
38、和雙方棋盤的更新,最后判斷游戲的輸贏。 客戶端是與客戶端之間是通過服務(wù)器進(jìn)行連接的。網(wǎng)絡(luò)對(duì)戰(zhàn)中,需要封裝游戲中 用戶的基本信息,包括用戶名稱、用戶棋子的顏色和本機(jī)是否連接上網(wǎng)絡(luò)等??偟膩?說,網(wǎng)絡(luò)對(duì)戰(zhàn)功能有實(shí)現(xiàn)網(wǎng)絡(luò)連接、客戶端與客戶端之間的連接,落子,請(qǐng)求游戲、 拒絕游戲、接受請(qǐng)求、勝負(fù)判斷。 2.32.3 其它功能分析其它功能分析 保存游戲功能能夠?qū)⑼婕覜]有進(jìn)行完的棋局保存起來,在關(guān)閉游戲之后,玩家可 以通過裝載游戲?qū)⑸洗伪4娴钠寰只謴?fù)到棋盤上。保存游戲和裝載游戲的功能實(shí)現(xiàn)起 來比較簡(jiǎn)單,因?yàn)槠灞P上的棋子是用 0、1、2 表示,棋盤是一個(gè) 15*15 的矩陣,那么 棋子可以用二維數(shù)組保存起來
39、,利用 Java 文件輸入輸出可以實(shí)現(xiàn)數(shù)據(jù)的保存和讀取。 3 3 概要設(shè)計(jì)概要設(shè)計(jì) 3.13.1 項(xiàng)目總體規(guī)劃項(xiàng)目總體規(guī)劃 基于 Java 的五子棋游戲的總體功能是要設(shè)計(jì)出具有界面有好的、具備人工智能的、 支持網(wǎng)絡(luò)對(duì)戰(zhàn)的五子棋游戲。本項(xiàng)目最終的目的是建立一個(gè)具體規(guī)則的五子棋平臺(tái), 使兩個(gè)不同的用戶通過一定的網(wǎng)絡(luò)連接,達(dá)到網(wǎng)絡(luò)對(duì)戰(zhàn)的目的,以及單機(jī)上的人機(jī)對(duì) 戰(zhàn)。為了滿足上面提出的功能要求,基于 Java 的五子棋游戲需要達(dá)到以下目標(biāo)。 (1)制定合法的規(guī)則,能夠判斷出非法操作,以使游戲能公正地進(jìn)行并分出勝負(fù)。 (2)支持人機(jī)對(duì)戰(zhàn),能夠讓計(jì)算機(jī)按照游戲規(guī)則通過人工智能自行選擇最優(yōu)走法。 (3)模擬
40、網(wǎng)絡(luò)對(duì)戰(zhàn),能夠支持兩個(gè)用戶通過網(wǎng)絡(luò)連接進(jìn)行對(duì)戰(zhàn)。 (4)具有精美的操作界面,方便用戶操作和使用。 以上功能總的來說可以分為兩大部分:人機(jī)對(duì)戰(zhàn)和網(wǎng)絡(luò)對(duì)戰(zhàn)。 人機(jī)對(duì)戰(zhàn)所要解決的重點(diǎn)和難點(diǎn)是電腦的智能性,即電腦能夠自己判斷最有的走 法,通過這樣的一個(gè)算法,既能防守玩家的進(jìn)攻又能對(duì)玩家進(jìn)行有效的進(jìn)攻。人工智 能算法是這樣實(shí)現(xiàn)的,電腦先分析自己的棋型,算法從棋盤的左上角出發(fā),向右逐行 搜索,當(dāng)遇到一個(gè)空白點(diǎn)時(shí),以他為中心向左挨個(gè)查找,如果遇到自己的棋子則記錄 后繼續(xù),如果遇到對(duì)方的棋子、空白點(diǎn)或邊界就停止查找。左邊完成后再向右進(jìn)行同 樣的操作;最后將左右兩邊的記錄合并起來,得到的數(shù)據(jù)就是該點(diǎn)橫向上的棋型
41、,然 后把棋型的編號(hào)填入保存起來,而其他三個(gè)方向上的棋型也可以用同樣的方法得到。 搜索完整張棋盤后自己的棋型表也就填寫完畢了,然后再用同樣的方法填寫對(duì)方棋型 表。這樣可以根據(jù)所統(tǒng)計(jì)出來的數(shù)據(jù)計(jì)算每個(gè)點(diǎn)的權(quán)重,根據(jù)權(quán)重找出最優(yōu)的落子位 置。 下面詳細(xì)的介紹五子棋游戲人工智能部分的核心算法。 首先介紹需要的數(shù)據(jù)結(jié)構(gòu):建立一張表格用以記錄棋子信息,這里使用一個(gè) 15*15 的二維數(shù)組 Table1515,數(shù)組的每一個(gè)元素對(duì)應(yīng)棋盤上的一個(gè)交叉點(diǎn),用 0 表示空 位、1 代表自己的棋子,2 代表對(duì)方的棋子。這張表也是盤面分析的基礎(chǔ)。 此外還要為電腦和玩家雙方各建立一張棋型表 Computer15154和
42、 Player1515 4,用來存放棋型數(shù)據(jù),代表點(diǎn)的重要程度,比如用 20 代表“沖四”的點(diǎn),用 15 代 表“活三”的點(diǎn)。那么在計(jì)算重要性時(shí),就可以根據(jù) 2015 得出前者比后者重要,落 子時(shí)電腦就會(huì)自動(dòng)選擇“沖四”的點(diǎn)。棋型表要使用三維數(shù)組是因?yàn)檫@是因?yàn)槠灞P上 的每一個(gè)點(diǎn)都可以與橫、豎、左斜、右斜四個(gè)方向的棋子構(gòu)成不同的棋型,例如:如 果同一點(diǎn)上有兩個(gè) 15 就是“雙三” 、有一個(gè) 15 和一個(gè) 20 就是“四三” 。 這些數(shù)組結(jié)構(gòu)構(gòu)成了程序的基本數(shù)據(jù)骨架,下面將討論深入到算法中。 人工智能算法的核心是進(jìn)行盤面的分析,填寫棋型表,其具體的實(shí)現(xiàn)方法如下: 先分析自己的棋型,算法從棋盤的左上
43、角出發(fā),向右逐行搜索,當(dāng)遇到一個(gè)空白 點(diǎn)時(shí),以他為中心向左挨個(gè)查找,如果遇到自己的棋子則記錄后繼續(xù),如果遇到對(duì)方 的棋子、空白點(diǎn)或邊界就停止查找。左邊完成后再向右進(jìn)行同樣的操作;最后將左右 兩邊的記錄合并起來,得到的數(shù)據(jù)就是該點(diǎn)橫向上的棋型,然后把棋型的編號(hào)填入到 Computerxyn中(x,y 代表坐標(biāo),n=0、1、2、3 分別代表橫、豎、左斜、右斜四個(gè) 方向)。而其他三個(gè)方向上的棋型也可以用同樣的方法得到。搜索完整張棋盤后自己的 棋型表也就填寫完畢了,然后再用同樣的方法填寫對(duì)方棋型表。 有了上面兩張棋型表,現(xiàn)在要做的就是讓電腦知道在哪一點(diǎn)下子。其中最簡(jiǎn)單的 計(jì)算方法就是遍歷棋型表 Com
44、puter15154和 Player15154,找出其中數(shù)值最大 的一點(diǎn),在該點(diǎn)下子即可。但這種算法的弱點(diǎn)非常明顯,只顧眼前利益,不能顧全大 局。 為了解決這個(gè)問題,這里引入了“今后幾步預(yù)測(cè)法” ,具體方法是這樣的。 (1)讓電腦分析一個(gè)可能的點(diǎn),如果在某個(gè)位置下子會(huì)形成對(duì)手不得不防守的棋 型(例如“沖四” 、 “活三”),那么下一步對(duì)手就必須按照電腦的思路下子來防守,如此 便完成了第一步的預(yù)測(cè)。 (2)重新調(diào)用棋型表填寫算法對(duì)預(yù)測(cè)后的棋進(jìn)行盤面的分析,如果出現(xiàn)了“四三” 、 “雙三”或“雙四”等制勝點(diǎn),那么自己就可以獲勝了;否則按照同樣的方法向下分 析,就可以預(yù)測(cè)出第二步、第三步等。 (3)
45、但是要是盤面上沒有對(duì)手必須防守的棋型,就得考慮防守,將自己和對(duì)手調(diào) 換位置,然后用上面的方法來預(yù)測(cè)對(duì)手的棋。這樣即可以防守住對(duì)手的巧妙攻擊,又 能待機(jī)發(fā)動(dòng)反擊。 網(wǎng)絡(luò)對(duì)戰(zhàn)所要解決的重點(diǎn)和難點(diǎn)是網(wǎng)絡(luò)編程。首先需要建立起一個(gè)服務(wù)器,通過 服務(wù)器客戶機(jī)與客戶機(jī)才可以進(jìn)行信息的傳遞。服務(wù)器和客戶端都需要?jiǎng)?chuàng)建 Socket 類 對(duì)象,這里服務(wù)器事先已經(jīng)指定好了公認(rèn)的 Sockeket 地址和端口號(hào),客戶端通過 Socket 對(duì)象向服務(wù)器發(fā)送連接請(qǐng)求,服務(wù)器能夠接收、解釋并處理這個(gè)連接請(qǐng)求,并 將處理的結(jié)果返回給客戶端,即客戶端已經(jīng)連接到服務(wù)器。網(wǎng)絡(luò)對(duì)戰(zhàn)期間,需要判斷 雙方鼠標(biāo)點(diǎn)擊棋盤的位置,進(jìn)而判斷落子
46、的位置,然后在這個(gè)位置畫出棋子。網(wǎng)絡(luò)對(duì) 戰(zhàn)時(shí)每次合法的鼠標(biāo)點(diǎn)擊,使得棋盤上的棋子增加,那么就需要隨時(shí)更新棋盤上的內(nèi) 容,保證對(duì)戰(zhàn)雙方棋子的一致性,最后還要能夠判斷對(duì)戰(zhàn)雙方的輸贏。 3.23.2 項(xiàng)目模塊劃分項(xiàng)目模塊劃分 根據(jù)上邊的需求分析,將系統(tǒng)分為以下幾個(gè)模塊。 (1)初始化模塊:建立棋盤數(shù)組 Table1515、對(duì)戰(zhàn)雙方的棋型表 Computer15 154,和 Player15154并將它們清零以備用,然后初始化鍵盤、鼠標(biāo)等輸入、 輸出設(shè)備并在屏幕上畫出棋盤。 (2)主循環(huán)控制模塊:負(fù)責(zé)控制下棋順序,當(dāng)輪到某方下子時(shí),負(fù)責(zé)將程序流程 轉(zhuǎn) 到相應(yīng)的模塊中,主要但當(dāng)一個(gè)調(diào)度者的角色。 (3)
47、玩家落子模塊:當(dāng)輪到玩家下子時(shí),通過鍵盤或鼠標(biāo)在棋盤上落子,程序會(huì) 根據(jù)落子的位置,在 Table1515數(shù)組的相應(yīng)地方記錄 2,以表明該子時(shí)玩家下的。 (4)分析盤面模塊:本程序的核心模塊之一,人工智能算法的根本依據(jù)。 (5)電腦落子模塊:根據(jù)填寫的棋型表,選擇最優(yōu)落子位置。 (6)勝負(fù)判斷模塊:根據(jù)預(yù)先設(shè)定的規(guī)則,判斷游戲勝負(fù)。 (7)網(wǎng)絡(luò)對(duì)戰(zhàn)模塊:在人機(jī)對(duì)戰(zhàn)的基礎(chǔ)上,添加網(wǎng)絡(luò)功能,是兩個(gè)不同的客戶端 通過網(wǎng)絡(luò)連接,實(shí)現(xiàn)網(wǎng)絡(luò)對(duì)戰(zhàn)功能。 模塊與模塊之間是這樣連接起來的,在主程序運(yùn)行之前要先運(yùn)行服務(wù)器程序,這 樣技能滿足玩家單機(jī)對(duì)戰(zhàn)又能滿足玩家網(wǎng)絡(luò)對(duì)戰(zhàn)。運(yùn)行主程序后,首先用到的是初始 化模塊。
48、玩家可以選擇單機(jī)對(duì)戰(zhàn),這時(shí)就要用到玩家落子模塊、電腦落子模塊、主循 環(huán)控制模塊、分析盤面模塊、勝負(fù)控制模塊。如果玩家選擇網(wǎng)絡(luò)對(duì)戰(zhàn),那么這時(shí)就要 用到玩家落子模塊、主循環(huán)控制模塊、勝負(fù)控制模塊。系統(tǒng)結(jié)構(gòu)圖如圖 3-1 所示。 初始化模塊 電 腦 落 子 模 塊 網(wǎng)絡(luò)對(duì)戰(zhàn)模塊 主 循 環(huán) 控 制 模 塊 玩 家 落 子 模 塊 勝 負(fù) 判 斷 模 塊 玩 家 落 子 模 塊 玩 家 落 子 模 塊 主 循 環(huán) 控 制 模 塊 勝 負(fù) 判 斷 模 塊 分 析 盤 面 模 塊 圖 3-1 五子棋游戲系統(tǒng)結(jié)構(gòu)圖 整個(gè)系統(tǒng)流程圖如圖 3-2 所示。 開始 初始化 游戲模式 主循環(huán)控制 玩家落子 電腦落子
49、分析棋盤填寫棋型 表 客戶端二客戶端一 判斷勝負(fù) 結(jié)束 主循環(huán)控制 判斷勝負(fù) 某方獲勝某方獲勝 人機(jī)對(duì)戰(zhàn)網(wǎng)絡(luò)對(duì)戰(zhàn) 否否 圖 3-2 五子棋游戲流程圖 4 4 詳細(xì)設(shè)計(jì)與編碼實(shí)現(xiàn)詳細(xì)設(shè)計(jì)與編碼實(shí)現(xiàn) 4.14.1 創(chuàng)建棋盤類創(chuàng)建棋盤類 4.1.1 Java 圖形編程 Java 中的 Graphics 類是用于繪圖和顯示格式化文本的工具類。在 Java 程序中繪 圖必須在一個(gè)窗口(容器)中進(jìn)行,繪圖窗口經(jīng)常被設(shè)計(jì)為一個(gè)組件容器。一般首先在 一個(gè)面板中進(jìn)行繪制,然后將這個(gè)面板添加到現(xiàn)實(shí)窗口中。 Graphics 類是在 java.awt 包中聲明,顯示格式化文本和繪圖時(shí)通過調(diào)用 Graphics 類的
50、各種 draw()方法實(shí)現(xiàn)的,例如 drawString(String),drawLine()等。繪 圖采用的坐標(biāo)原點(diǎn)是在左上角,縱軸向下以像素為單位的坐標(biāo)系。 下面是 Graphics 類中常用的各種圖形的繪制方法。 (1)drawLine(int,int,int,int) 畫直線,參數(shù)為起點(diǎn)的 x 和 y 坐標(biāo)、終點(diǎn)的 x 和 y 坐標(biāo)。 (2)drawRect(int,int,int,int) 畫矩形,參數(shù)為左上角的 x 和 y 坐標(biāo)、寬、高。 (3)drawRoundRect(int,int,int,int,int,int) 畫圓角矩形,參數(shù)為左上角的 x 和 y 坐標(biāo)、x 寬、y 高
51、、深度 x、深度 y。 (4)draw3DRect(int,int,int,int,boolean) 畫 3D 矩形,參數(shù)為左上角的 x 和 y 坐標(biāo)、寬 x、高 y、ture。 (5)drawOval(int,int,int,int) 畫卵形,參數(shù)為中心的 x 和 y 坐標(biāo)、長(zhǎng)軸、短 軸。 (6)drawArc(int,int,int,int,int,int) 畫圓弧,參數(shù)為左上角的 x 和 y 坐標(biāo)、 寬、高、起始角、終止角。 (7)drawPolyline(int,int,int) 畫折線,參數(shù)為各點(diǎn)的 x 坐標(biāo)、y 坐標(biāo)、 折線數(shù)。 (8)drawPolygon(int,int,int
52、) 畫折線,參數(shù)為各點(diǎn)的 x 坐標(biāo)、y 坐標(biāo)、折 線數(shù)。 (9)drawPolygon(Polygon) 畫多角形,參數(shù)為定義好的多角形對(duì)象。 畫填充圖形只要把以上九種方法中的 draw 改為 fill 即可,參數(shù)表是一樣的。 繪制這些圖形都是選用當(dāng)前的顏色來繪制和填充的,黑色是系統(tǒng)默認(rèn)的顏色,也 可以使用 Graphics 類中的 setColor()方法來設(shè)定繪圖的顏色。 在本項(xiàng)目的棋盤類中,棋盤和棋子的繪制都是通過 Graphics 類來完成的。代碼片 段如下。 public void paint(Graphics gc) super.paint(gc); gc.setColor(Col
53、or.blue); gc.drawString(line,25,15); 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); / 繪制棋盤 for (int i = 0; i 15; i+) gc.drawLine(30, 30 + i * 30, 450, 30 + i * 30); /繪制棋盤的行線 gc.drawLine(30 + i * 30, 30, 30 + i * 30, 450); /
54、繪制棋盤的列線 gc.drawLine(25, 25, 455, 25); gc.drawLine(25, 25, 25, 455); gc.drawLine(25, 455, 455, 455); gc.drawLine(455, 25, 455, 455); /當(dāng)窗體被重畫時(shí),將繪制出棋盤重畫之前的狀態(tài) for(int i=0;i15;i+) for (int j = 0; j 15; j+) xp=30+i*30-15; yp=30+j*30-15; if (boardij = 1)/在棋盤交叉線上畫出黑棋子 gc.setColor(Color.black); gc.fillOval(x
55、p,yp,30,30); if (boardij = 2)/在棋盤交叉線上畫出白棋子 gc.setColor(Color.white); gc.fillOval(xp,yp,30,30); 4.1.2 棋盤類的算法實(shí)現(xiàn) 棋盤類是項(xiàng)目的核心類。如果只是使用人機(jī)對(duì)戰(zhàn),那么幾乎所有的項(xiàng)目功能定義全 部都在此類中。除了繪制棋盤和棋子等游戲界面外,利用人工智能計(jì)算出最優(yōu)落子位 置是棋盤類中最重要的功能。在本類中我采用的是效率比較低的遍歷算法,通過掃描 棋盤表中記錄的所有位置,查找權(quán)重最大的點(diǎn)作為下一步的落子位置,只要能夠解決 這個(gè)問題,人機(jī)對(duì)戰(zhàn)就比較簡(jiǎn)單了,這樣電腦就能夠?qū)ν婕野l(fā)起有效的進(jìn)攻又能夠防 守
56、住玩家的進(jìn)攻。此外,判斷勝負(fù)的機(jī)制也是必不可少的。其實(shí)還有很多更加優(yōu)秀的 算法可以提高查找效率和精度,例如可以采用博弈樹的算法,應(yīng)用剪枝和最大最小樹 原理搜索最優(yōu)落子位置。其部分代碼如下所示: private long analyseUd(int x, int y, int side) int tt = new int1717; int i, j; int tempx, tempy; long mark = 0; int base = BASE; int uppersign = 0; int downsign = 0; int c_count = 1; for (i = 0; i 17; i+
57、) for (j = 0; j 17; j+) ttij = chessBoardij; ttyx = side; tempx = x; tempy = y; if (tttempy - 1tempx != side) if (tttempy - 1tempx = 0) uppersign = 1; if (tttempy - 1tempx != 0) uppersign = 0; else tempy -= 1; while (tttempytempx = side) c_count += 1; tempy-; if (tttempytempx = 0) uppersign = 1; if
58、(tttempytempx != 0) uppersign = 0; return mark; 計(jì)算其他的三個(gè)方向上的權(quán)重與上段代碼類似,不再贅述,然后調(diào)用4個(gè)分析方法, 返回最后的分析結(jié)果: private long analyse(int x, int y, int side) long mark = 0; mark += analyseUd(x, y, side); mark += analyseLr(x, y, side); mark += analyseLdru(x, y, side); mark += analyseRdlu(x, y, side); return mark; 根據(jù)
59、前邊計(jì)算出的權(quán)重,尋找最優(yōu)落子位置: private Queue searchPoint(int chess,int deepth) int cx, cy; char s = new char10; Queue pq = null, pq_temp = null, pq_final; int temp_chess = new int1717; long mark = 0; int duce; int i, j; int m, n, p, q; int media; int MAX; int k, b; /標(biāo)記出權(quán)重最大的點(diǎn) MAX=MAX1=(225-STEPCOUNTER)?MAX1:(22
60、5-STEPCOUNTER); if(MAX=(225-STEPCOUNTER) MINDEEPTH=1; pq = new QueueMAX + 1; for (m = 0; m MAX; m+) pqm = new Queue(); for (m = 0; m MAX; m+) pqm.mark = 0; pqm.position = 0; for (i = 1; i = 15; i+) for (j = 1; j = 15; j+) if (chessij != 0) mark = 0; else mark = analyse(j, i, 1) / 2 + analyse(j, i, 2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 三方信用貸款協(xié)議擔(dān)保實(shí)施細(xì)則版B版
- 2024有關(guān)汽車買賣合同集錦
- 2024年高端裝備制造技術(shù)許可與技術(shù)支持合同
- 2024擁有車輛夫妻財(cái)產(chǎn)分割與離婚協(xié)議書3篇
- 2024雕塑設(shè)計(jì)工作室與石材供應(yīng)商合同3篇帶眉腳
- 2024文藝盛典巡回演出獨(dú)家代理服務(wù)合同3篇
- 2024暑假工勞動(dòng)合同協(xié)議書模板
- 2024年高效打井建設(shè)協(xié)議版B版
- 2024租車服務(wù)合同
- 2024房地產(chǎn)最高額典當(dāng)借款合同
- 《濟(jì)南聯(lián)通公司成本管理問題及解決策略7000字論文》
- 給志愿者培訓(xùn)
- 191118-鋰離子電池專業(yè)術(shù)語英語對(duì)照大全
- 2024全新網(wǎng)絡(luò)與數(shù)據(jù)安全培訓(xùn)
- 2023年貴州黔東南州州直機(jī)關(guān)遴選公務(wù)員筆試真題
- 心腦血管疾病預(yù)防課件
- DB35T 1036-2023 10kV及以下電力用戶業(yè)擴(kuò)工程技術(shù)規(guī)范
- 中國(guó)移動(dòng)自智網(wǎng)絡(luò)白皮書(2024) 強(qiáng)化自智網(wǎng)絡(luò)價(jià)值引領(lǐng)加速邁進(jìn)L4級(jí)新階段
- 2024-2030年中國(guó)牛仔服裝行業(yè)市場(chǎng)深度調(diào)研及發(fā)展策略研究報(bào)告
- 數(shù)據(jù)中心災(zāi)難恢復(fù)預(yù)案
- 《電氣檢測(cè)技術(shù)》教學(xué)大綱
評(píng)論
0/150
提交評(píng)論