564501075畢業(yè)設(shè)計(jì)(論文)基于JAVA的“五子棋”網(wǎng)絡(luò)游戲開(kāi)發(fā)
《564501075畢業(yè)設(shè)計(jì)(論文)基于JAVA的“五子棋”網(wǎng)絡(luò)游戲開(kāi)發(fā)》由會(huì)員分享,可在線閱讀,更多相關(guān)《564501075畢業(yè)設(shè)計(jì)(論文)基于JAVA的“五子棋”網(wǎng)絡(luò)游戲開(kāi)發(fā)(76頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第一章 系統(tǒng)概述 1.1 課題意義 本程序旨在用JAVA實(shí)現(xiàn)一個(gè)基本于C/S模式的五子棋網(wǎng)絡(luò)對(duì)戰(zhàn)游戲。玩家作為客戶端通過(guò)服務(wù)器端與其它玩家進(jìn)行對(duì)戰(zhàn),聊天等功能。通過(guò)實(shí)現(xiàn)本程序加深對(duì)計(jì)算機(jī)網(wǎng)絡(luò)編程的了解。 1.2 國(guó)內(nèi)外有關(guān)研究動(dòng)態(tài) 電腦游戲行業(yè)經(jīng)過(guò)二十年的發(fā)展,已經(jīng)成為與影視、音樂(lè)等并駕齊驅(qū)的全球最重要的娛樂(lè)產(chǎn)業(yè)之一,其年銷售額超過(guò)好萊塢的全年收入?;ヂ?lián)網(wǎng)的出現(xiàn)為電腦游戲行業(yè)發(fā)展注入了新的活力,憑借信息雙向交流、速度快、不受空間限制等優(yōu)勢(shì),讓真人參與游戲,提高了游戲的互動(dòng)性、仿真性和競(jìng)技性,使玩家在虛擬世界里可以發(fā)揮現(xiàn)實(shí)世界無(wú)法展現(xiàn)的潛能,改變了單機(jī)版游戲固定、呆板、與機(jī)器對(duì)話的狀況。
2、網(wǎng)絡(luò)游戲的這些優(yōu)勢(shì)不僅使其在電腦游戲行業(yè)中異軍突起并在某種程度上取代了單機(jī)版游戲,而且成為網(wǎng)絡(luò)業(yè)三大(網(wǎng)上金融、網(wǎng)上教育和網(wǎng)絡(luò)游戲)贏利且利潤(rùn)優(yōu)厚的領(lǐng)域之一[1]。 網(wǎng)絡(luò)作為一種新興的傳播方式,主要包括三大內(nèi)容:娛樂(lè)、資訊、通訊。提到網(wǎng)絡(luò)娛樂(lè),過(guò)去主要指的是單機(jī)版游戲,沒(méi)有引入網(wǎng)絡(luò)的概念[2]但隨著科技的發(fā)展,游戲娛樂(lè)產(chǎn)業(yè)也在成長(zhǎng)[3]目前,國(guó)內(nèi)的游戲娛樂(lè)產(chǎn)業(yè)正處于起步階段,特點(diǎn)表現(xiàn)為:第一,它是一種文化的傳播。娛樂(lè)產(chǎn)業(yè)可以潛移默化地改變?nèi)说挠^念,當(dāng)前,很多多媒體的播放已被電腦網(wǎng)絡(luò)所取代[4]。第二,網(wǎng)絡(luò)游戲加強(qiáng)了人與人的溝通。第三,網(wǎng)絡(luò)游戲具有一定的教育意義[5]。網(wǎng)絡(luò)游戲所具有的角色
3、扮演的功能,使得玩家能通過(guò)互助更好地完成游戲中的各項(xiàng)任務(wù)。網(wǎng)絡(luò)無(wú)國(guó)界,游戲在網(wǎng)絡(luò)文化產(chǎn)業(yè)世界的發(fā)展中地位會(huì)越來(lái)越高[6]。 目前在國(guó)外,休閑游戲如棋類等,玩家的年齡跨度非常大,這和我國(guó)目前網(wǎng)游市場(chǎng)以青少年為主要消費(fèi)人群的狀況截然不同[7]。其實(shí),網(wǎng)絡(luò)可以解決空間的問(wèn)題,網(wǎng)絡(luò)和生活越來(lái)越息息相關(guān),因此,開(kāi)辟適合各個(gè)年齡層的游戲產(chǎn)品迫在眉睫。同時(shí),這也涉及到一個(gè)企業(yè)開(kāi)發(fā)的能力。娛樂(lè)產(chǎn)業(yè)發(fā)展到一定程度,通過(guò)不斷鍛煉和經(jīng)驗(yàn)的積累,完全可以通過(guò)融入娛樂(lè)的成分把教條的東西深入淺出地展現(xiàn)給消費(fèi)者[8] 。 就國(guó)內(nèi)的發(fā)展來(lái)看,最近這兩三年內(nèi)國(guó)內(nèi)的游戲公司如雨后春筍般的成立,所開(kāi)發(fā)或代理的網(wǎng)絡(luò)游戲更是不勝枚
4、舉。以全球游戲業(yè)界的發(fā)展來(lái)看,這幾年韓國(guó)的表現(xiàn)最為突出,特別是在網(wǎng)絡(luò)游戲的技術(shù)研發(fā)興游戲制作,其所發(fā)行的網(wǎng)絡(luò)游戲更成為全球游戲產(chǎn)業(yè)重要的指標(biāo)之一。去年在美國(guó)洛杉磯所舉行的 E3(Electronic Entertainment Exposition)展中,已經(jīng)有幾家的韓國(guó)廠商擠入世界第一線的游戲開(kāi)發(fā)廠商之列[9]。 近幾年來(lái),由于 3D 硬體繪圖技術(shù)的突破,使得即時(shí)描繪的書(shū)面越來(lái)越精致,而且3D遊戲性更多元化更逼近真實(shí)世界,因此在遊戲產(chǎn)業(yè)中,3D 游戲已經(jīng)逐漸取代2D游戲?yàn)橛螒蚴袌?chǎng)的主流,即使是網(wǎng)絡(luò)游戲,也慢慢趨向3D化。然而游戲3D化將會(huì)帶來(lái)的游戲開(kāi)發(fā)上的困難等問(wèn)題,這些問(wèn)題以后都需要逐
5、步解決[10]。 1.3 課題主要內(nèi)容及創(chuàng)新之處 五子棋是一種受大眾廣泛喜愛(ài)的游戲,其規(guī)則簡(jiǎn)單,變化多端,非常富有趣味性和消遣性。本程序是用JAVA實(shí)現(xiàn)的一個(gè)基本于C/S模式的五子棋網(wǎng)絡(luò)對(duì)戰(zhàn)游戲。JAVA是一種簡(jiǎn)單的,面向?qū)ο蟮?,分布式的,解釋的,健壯?安全的,結(jié)構(gòu)中立的,可移植的,性能很優(yōu)異的多線程的,動(dòng)態(tài)的語(yǔ)言。因此用Java開(kāi)發(fā)的網(wǎng)絡(luò)應(yīng)用系統(tǒng)可以在各種平臺(tái)上運(yùn)行,實(shí)現(xiàn)了設(shè)備無(wú)關(guān)性,一次開(kāi)發(fā)處處運(yùn)行,大大增加了開(kāi)發(fā)效率,減少了重復(fù)勞動(dòng)。玩家作為客戶端通過(guò)服務(wù)器端與其它玩家進(jìn)行對(duì)戰(zhàn),聊天等功能[11]。本程序作為一種網(wǎng)絡(luò)游戲,其樂(lè)趣是人與人之間的對(duì)抗,而不僅僅是人與事先設(shè)置的各種程序
6、的對(duì)抗,所以比普通的人機(jī)對(duì)戰(zhàn)游戲更具有生命力,更具有趣味性[12]。而且通過(guò)實(shí)現(xiàn)本程序可以加深對(duì)計(jì)算機(jī)網(wǎng)絡(luò)編程的了解。 第二章 五子棋簡(jiǎn)介 2.1 五子棋起源、歷史、簡(jiǎn)介 五子棋起源于中國(guó)古代的傳統(tǒng)黑白棋[13]?,F(xiàn)代五子棋日文稱之為"連珠",英譯為"Renju",英文稱之為"Gobang"或"FIR"(Five in a Row的縮寫(xiě)),亦有"連五子"、"五子連"、"串珠"、"五目"、"五目碰"、"五格"等多種稱謂。 五子棋不僅能增強(qiáng)思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征"短、平、快",又有古典哲學(xué)的高深學(xué)問(wèn)"陰
7、陽(yáng)易理";它既有簡(jiǎn)單易學(xué)的特性,為人民群眾所喜聞樂(lè)見(jiàn),又有深?yuàn)W的技巧和高水平的國(guó)際性比賽;它的棋文化源淵流長(zhǎng),具有東方的神秘和西方的直觀;既有"場(chǎng)"的概念,亦有"點(diǎn)"的連接。它是中西文化的交流點(diǎn),是古今哲理的結(jié)晶。 2.2 五子棋規(guī)則說(shuō)明 2.2.1 棋盤(pán) 棋盤(pán)正中一點(diǎn)為"天元"。棋盤(pán)兩端的橫線稱端線。棋盤(pán)左右最外邊的兩條縱線稱邊線。從兩條端線和兩條邊線向正中發(fā)展而縱橫交叉在第四條線形成的四個(gè)點(diǎn)稱為"星"。天元和星應(yīng)在棋盤(pán)上用直徑約為0.5厘米的實(shí)心小圓點(diǎn)標(biāo)出。 以持黑方為準(zhǔn),棋盤(pán)上的縱軸線從左到右用英文字母A~O標(biāo)記。橫行線從近到遠(yuǎn)用阿拉伯?dāng)?shù)字1~15標(biāo)記??v橫軸上的橫縱線交叉點(diǎn)
8、分別用橫縱線標(biāo)記的名稱合寫(xiě)成。如"天元"H8,四個(gè)"星"分別為D4、D12、L12、L4等。見(jiàn)圖2.1 圖 2.1 棋盤(pán) 2.2.2 基本規(guī)則 黑白雙方依次落子,任一方先在棋盤(pán)上形成橫向、豎向、斜向的連續(xù)的相同顏色的五個(gè)(含五個(gè)以上)棋子的一方為勝。 2.2.3 陽(yáng)線和陰線 陽(yáng)線:棋盤(pán)上可見(jiàn)的橫縱直線。 陰線:棋盤(pán)上無(wú)實(shí)線連接的隱形斜線。 2.2.4 連 在棋盤(pán)某一陽(yáng)線或陰線上形成5個(gè)以上的同色棋子不間隔地相連。 五連:在棋盤(pán)上形成的5個(gè)同色棋子的"連"。 長(zhǎng)連:在棋盤(pán)上形成的6個(gè)或6個(gè)以上同色棋子的"連"。 2.2.5 "四"包括"活四"和"沖四" 圖
9、2.2 活四說(shuō)明 活四:在棋盤(pán)某一條陽(yáng)線或陰線上有同色4子不間隔地緊緊相連,且在此4子兩端延長(zhǎng)線上各有一個(gè)無(wú)子的交叉點(diǎn)與此4子緊密相連。見(jiàn)圖2.2 沖四:除"活四"外的,再下一著棋便可形成五連,并且存在五連的可能性的局面。見(jiàn)圖2.3 圖 2.3 沖四說(shuō)明 白棋再下一著可形成長(zhǎng)連的局面也視為"四"。見(jiàn)圖2.4 圖 2.4 白棋長(zhǎng)連形成的四 2.2.6 "三"指活三,包括"連三"和"跳三" 活三:在棋盤(pán)某一條陽(yáng)線或陰線上有同色3子不間隔地緊緊相連,且在此3子兩端延長(zhǎng)線上各有一個(gè)無(wú)子的交叉點(diǎn)與此3子緊密相連。 連三:在棋盤(pán)某一條陽(yáng)線或陰線上有同色三子相連
10、,且在此三子兩端延長(zhǎng)線上有一端至少有一個(gè),另一端至少有兩個(gè)無(wú)子的交叉點(diǎn)與此三子緊密相連。 跳三:中間僅間隔一個(gè)無(wú)子交叉點(diǎn)的連三,但兩端延長(zhǎng)線均至少有一個(gè)無(wú)子的交叉點(diǎn)與此三子相連。 2.2.7 三手可交換 是指黑棋下盤(pán)面第3著棋后,白方在應(yīng)白4著棋之前,如感覺(jué)黑方棋形不利于己方,可提出交換,即執(zhí)白棋一方變?yōu)閳?zhí)黑棋一方,而黑方不可以不換。 2.2.8 五手兩打 是指黑棋在下盤(pán)面上關(guān)鍵的第5手棋時(shí),必須下兩步棋,讓白棋在這兩步棋中任選一步,然后再繼續(xù)對(duì)弈。一般說(shuō)來(lái),白棋肯定拿掉對(duì)白方不利的一點(diǎn),而保留對(duì)黑方較為不利的那點(diǎn)讓黑方行棋。 2.2.9 禁手規(guī)則 無(wú)禁手: 是指采用最簡(jiǎn)單古老
11、的規(guī)則。黑白雙方依次落子,任一方先在棋盤(pán)上形成橫向、豎向、斜向的連續(xù)的相同顏色的五個(gè)(含五個(gè)以上)棋子的一方為勝。這種規(guī)則非常簡(jiǎn)單容易理解。適合初學(xué)的業(yè)余五子棋愛(ài)好者。但是在這種規(guī)則下黑棋勝算較大。甚至已經(jīng)有人證明在黑白雙方都不出現(xiàn)錯(cuò)誤的情況下,黑棋可以必勝。所以一般要求連續(xù)玩兩盤(pán)以上,既任一方執(zhí)黑,執(zhí)白各一次。 有禁手:鑒于無(wú)禁手規(guī)則黑棋必勝,人們不斷采用一些方法限制黑棋先行的優(yōu)勢(shì),以平衡黑白雙方的形式。于是針對(duì)黑棋的各種禁手逐漸形成。禁手最簡(jiǎn)單地說(shuō)就是一手棋形成長(zhǎng)連(連成五個(gè)以上連續(xù)相同的棋子),或兩個(gè)以上的活三,或者兩個(gè)以上的四,并且這些四、活三和長(zhǎng)連都要包括這一手棋。 并且規(guī)定,當(dāng)
12、禁與連五同時(shí)出現(xiàn)時(shí)為黑方取勝禁手不成立,禁手是針對(duì)黑棋而言的,白棋沒(méi)有任何禁手。例如:黑棋長(zhǎng)連是禁手,白棋長(zhǎng)連算贏棋。 國(guó)際比賽規(guī)則規(guī)定:對(duì)局中如黑方出現(xiàn)禁手,白方應(yīng)立即指出禁手點(diǎn),黑方即負(fù)。如白方在黑方出現(xiàn)禁手后,又落一步白子,黑棋禁手則不成立了。 所以 在"有禁手"的房間里,如果黑方出現(xiàn)禁手,白方應(yīng)立即按下"禁手"按鈕 。程序會(huì)判黑方負(fù)。如果這時(shí)白方又在棋盤(pán)上落一子,黑棋禁手則不成立了。 第三章 方案設(shè)計(jì)及開(kāi)發(fā)工具的選取 3.1 選用Java進(jìn)行開(kāi)發(fā)的原因 Java是一種簡(jiǎn)單的,面向?qū)ο蟮模植际降?,解釋的,健?/p>
13、的安全的,結(jié)構(gòu)的中立的,可移植的,性能很優(yōu)異的多線程的,動(dòng)態(tài)的語(yǔ)言[14] 。因此用Java開(kāi)發(fā)的網(wǎng)絡(luò)應(yīng)用系統(tǒng)可以在各種平臺(tái)上運(yùn)行,大大增加了開(kāi)發(fā)效率,減少重復(fù)勞動(dòng)。而且,Java集成的網(wǎng)絡(luò)功能分有利于開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用系統(tǒng)[15] 。 Java具有許多的優(yōu)點(diǎn): 3.1.1 簡(jiǎn)單 Java最初是為對(duì)家用電器進(jìn)行集成控制而設(shè)計(jì)的一種語(yǔ)言,因此它必須簡(jiǎn)單明了。Java語(yǔ)言的簡(jiǎn)單性主要體現(xiàn)在以下三個(gè)方面:1.Java的風(fēng)格類似于C++,因而C++程序員是非常熟悉的。從某種意義上講,Java語(yǔ)言是C及C++語(yǔ)言的一個(gè)變種,因此,C++程序員可以很快就掌握J(rèn)ava編程技術(shù)。2.Java摒棄了C++中容易
14、引發(fā)程序錯(cuò)誤的地方,如指針和內(nèi)存管理。3.Java提供了豐富的類庫(kù)。 3.1.2 面向?qū)ο? 面向?qū)ο罂梢哉f(shuō)是Java最重要的特性。Java語(yǔ)言的設(shè)計(jì)完全是面向?qū)ο蟮模恢С诸愃艭語(yǔ)言那樣的面向過(guò)程的程序設(shè)計(jì)技術(shù)。Java支持靜態(tài)和動(dòng)態(tài)風(fēng)格的代碼繼承及重用。單從面向?qū)ο蟮奶匦詠?lái)看,Java類似于SmallTalk,但其它特性、尤其是適用于分布式計(jì)算環(huán)境的特性遠(yuǎn)遠(yuǎn)超越了SmallTalk。 3.1.3 分布式 Java包括一個(gè)支持HTTP和FTP等基于TCP/IP協(xié)議的子庫(kù)。因此,Java應(yīng)用程序可憑借URL打開(kāi)并訪問(wèn)網(wǎng)絡(luò)上的對(duì)象,其訪問(wèn)方式與訪問(wèn)本地文件系統(tǒng)幾乎完全相同。為分布環(huán)境尤其
15、是Internet提供動(dòng)態(tài)內(nèi)容無(wú)疑是一項(xiàng)非常宏偉的任務(wù),但Java的語(yǔ)法特性卻使我們很容易地實(shí)現(xiàn)這項(xiàng)目標(biāo)。 3.1.4 健壯 Java致力于檢查程序在編譯和運(yùn)行時(shí)的錯(cuò)誤。類型檢查幫助檢查出許多開(kāi)發(fā)早期出現(xiàn)的錯(cuò)誤。Java自己操縱內(nèi)存減少了內(nèi)存出錯(cuò)的可能性。Java還實(shí)現(xiàn)了真數(shù)組,避免了覆蓋數(shù)據(jù)的可能。這項(xiàng)功能特征大大縮短了開(kāi)發(fā)Java應(yīng)用程序的周期。Java提供Null指針檢測(cè)數(shù)組邊界檢測(cè)異常出口字節(jié)代碼校驗(yàn) 3.1.5 結(jié)構(gòu)中立 另外,為了建立Java作為網(wǎng)絡(luò)的一個(gè)整體,Java將它的程序編譯成一種結(jié)構(gòu)中立的中間文件格式。只要有Java運(yùn)行系統(tǒng)的機(jī)器都能執(zhí)行這種中間代碼?,F(xiàn)在,J
16、ava運(yùn)行系統(tǒng)有Solaris2.4(SPARC),Win32系統(tǒng)(Windows95和WindowsNT)等.Java源程序被編譯成一種高層次的與機(jī)器無(wú)關(guān)的byte-code格式語(yǔ)言,這種語(yǔ)言被設(shè)計(jì)在虛擬機(jī)上運(yùn)行,由機(jī)器相關(guān)的運(yùn)行調(diào)試器實(shí)現(xiàn)執(zhí)行。 3.1.6 安全 Java的安全性可從兩個(gè)方面得到保證。一方面,在Java語(yǔ)言里,像指針和釋放內(nèi)存等C++功能被刪除,避免了非法內(nèi)存操作。另一方面,當(dāng)Java用來(lái)創(chuàng)建瀏覽器時(shí),語(yǔ)言功能和一些瀏覽器本身提供的功能結(jié)合起來(lái),使它更安全。Java語(yǔ)言在你的機(jī)器上執(zhí)行前,要經(jīng)過(guò)很多次的測(cè)試。它經(jīng)過(guò)代碼校驗(yàn),檢查代碼段的格式,檢測(cè)指針操作,對(duì)象操作是否過(guò)
17、分以及試圖改變一個(gè)對(duì)象的類型。 3.1.7 可移植的 同體系結(jié)構(gòu)無(wú)關(guān)的特性使得Java應(yīng)用程序可以在配備了Java解釋器和運(yùn)行環(huán)境的任何計(jì)算機(jī)系統(tǒng)上運(yùn)行,這成為Java應(yīng)用軟件便于移植的良好基礎(chǔ)。但僅僅如此還不夠。如果基本數(shù)據(jù)類型設(shè)計(jì)依賴于具體實(shí)現(xiàn),也將為程序的移植帶來(lái)很大不便。例如在Windows3.1中整數(shù)(Integer)為16bits,在Windows95中整數(shù)為32bits,在DECAlpha中整數(shù)為64bits,在Intel486中為32bits。通過(guò)定義獨(dú)立于平臺(tái)的基本數(shù)據(jù)類型及其運(yùn)算,Java數(shù)據(jù)得以在任何硬件平臺(tái)上保持一致。Java語(yǔ)言的基本數(shù)據(jù)類型及其表示方式如下:by
18、te8-bit二進(jìn)制補(bǔ)碼short16-bit二進(jìn)制補(bǔ)碼int32-bit二進(jìn)制補(bǔ)碼long64-bit二進(jìn)制補(bǔ)碼float32-bitIEEE754浮點(diǎn)數(shù)double32-bitIEEE754浮點(diǎn)數(shù)char16-bitUnicode字符。在任何Java解釋器中,數(shù)據(jù)類型都是依據(jù)以上標(biāo)準(zhǔn)具體實(shí)現(xiàn)的。因?yàn)閹缀跄壳笆褂玫乃蠧PU都能支持以上數(shù)據(jù)類型、8~64位整數(shù)格式的補(bǔ)碼運(yùn)算和單/雙精度浮點(diǎn)運(yùn)算。Java編譯器本身就是用Java語(yǔ)言編寫(xiě)的。Java運(yùn)算系統(tǒng)的編制依據(jù)POSIX方便移植的限制,用ANSIC語(yǔ)言寫(xiě)成。Java語(yǔ)言規(guī)范中也沒(méi)有任何同具體實(shí)現(xiàn)相關(guān)的內(nèi)容。 3.1.8 多線程 Jav
19、a的多線程功能使得在一個(gè)程序里可同時(shí)執(zhí)行多個(gè)小任務(wù)。線程有時(shí)也稱小進(jìn)程,是一個(gè)大進(jìn)程里分出來(lái)的小的獨(dú)立的進(jìn)程。因?yàn)镴ava實(shí)現(xiàn)的多線程技術(shù),所以比C和C++更健壯。多線程帶來(lái)的更大的好處是更好的交互性能和實(shí)時(shí)控制性能。當(dāng)然實(shí)時(shí)控制性能還取決于系統(tǒng)本身(UNIX,Windows,Macintosh等),在開(kāi)發(fā)難易程度和性能上都比單線程要好。任何用過(guò)當(dāng)前瀏覽器的人,都感覺(jué)為調(diào)一副圖片而等待是一件很煩惱的事情。在Java里,你可用一個(gè)單線程來(lái)調(diào)一幅圖片,而你可以訪問(wèn)HTML里的其它信息而不必等它。 3.1.9 與C和C++語(yǔ)言的異同 Java提供了一個(gè)功能強(qiáng)大語(yǔ)言的所有功能,但幾乎沒(méi)有一點(diǎn)含混特
20、征。C++安全性不好,但C和C++還是被大家所接受,所以Java設(shè)計(jì)成C++形式,讓大家很容易學(xué)習(xí)。Java去掉了C++語(yǔ)言的許多功能,讓Java的語(yǔ)言功能很精煉,并增加了一些很有用的功能,Java去掉了以下幾個(gè)C和C++功能和特征:指針運(yùn)算結(jié)構(gòu)typedefs#define需要釋放內(nèi)存全局變量的定義這個(gè)功能都是很容易引起錯(cuò)誤的地方。 3.2 客戶端服務(wù)器模式 3.2.1 C/S模式簡(jiǎn)介 客戶 機(jī) /服務(wù)器(Client/Server)模式是指兩個(gè)邏輯(往往是物理的)系統(tǒng)(客戶機(jī)/服務(wù)器)及其應(yīng)用程序邏輯組件之間復(fù)雜關(guān)系的協(xié)同[16]。一般而言,C/S應(yīng)用系統(tǒng)從物理上都可劃分為客
21、戶機(jī)與服務(wù)器兩大部分,而邏輯上又可分解為三部分:表達(dá)邏輯、業(yè)務(wù)處理邏輯和數(shù)據(jù)管理邏輯。C/S應(yīng)用系統(tǒng)的格局和性能主要取決于這些邏輯成份在客戶機(jī)上或在服務(wù)器上的組織與分配。C/S模式將一個(gè)應(yīng)用分為兩個(gè)部分:前端(客戶端)、后端(服務(wù)器)。客戶機(jī)指提供客戶機(jī)服務(wù)的邏輯系統(tǒng),服務(wù)器指向服務(wù)器請(qǐng)求提供服務(wù)的邏輯系統(tǒng)。一般來(lái)說(shuō),客戶機(jī)向服務(wù)器發(fā)出請(qǐng)求為其完成一部分工作服務(wù)器則處理客戶機(jī)的請(qǐng)求并返回結(jié)果。 C/S 兩層模式主要有以下特點(diǎn):分布的處理與集中的數(shù)據(jù)操作管理有機(jī)地結(jié)合;開(kāi)放式的系統(tǒng);用與操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議無(wú)關(guān)的方式存取數(shù)據(jù),支持多平臺(tái)和跨平臺(tái);服務(wù)器對(duì)用戶是透明的;交互性強(qiáng);相對(duì)B/S模式,C
22、/S模式速度快,更利于處理大量數(shù)據(jù)。 C/S兩層模式中,客戶機(jī)并不是毫無(wú)運(yùn)算能力的輸入、輸出設(shè)備,而是具有了一定的數(shù)據(jù)處理和數(shù)據(jù)存儲(chǔ)能力,通過(guò)把應(yīng)用軟件的計(jì)算和數(shù)據(jù)合理地分配在客戶機(jī)和服務(wù)器兩端,可以有效地降低網(wǎng)絡(luò)通信量和服務(wù)器運(yùn)算量。由于服務(wù)器連接個(gè)數(shù)和數(shù)據(jù)通信量的限制,這種結(jié)構(gòu)的軟件適于在用戶數(shù)目不多的局域網(wǎng)內(nèi)使用。國(guó)內(nèi)目前的大部分ERP(財(cái)務(wù))軟件產(chǎn)品即屬于此類結(jié)構(gòu)。C/S模式(Client-Server Architecture)可能是應(yīng)用軟件開(kāi)發(fā)所使用的最成功的一種模式。它首先是出現(xiàn)在主機(jī)系統(tǒng)中,在局域網(wǎng)環(huán)境下,其性能顯的格外的突出。而現(xiàn)在,C/S模式已經(jīng)成為一種基本的開(kāi)發(fā)設(shè)計(jì)模式
23、。雖然C/S應(yīng)用軟件包含了Client和Server部件并且在網(wǎng)絡(luò)中相互交互。但這并不代表說(shuō)所有的C/S應(yīng)用軟件均需要按照這樣來(lái)設(shè)計(jì)(即網(wǎng)絡(luò)不是必須的),它是允許在單機(jī)上運(yùn)行的。 雖然 兩 層 系統(tǒng)有以上的優(yōu)點(diǎn),但在多用戶、多數(shù)據(jù)庫(kù)、且非安全的網(wǎng)絡(luò)環(huán)境下(例如Internet),兩層的應(yīng)用就有明顯的局限性。服務(wù)器端的數(shù)據(jù)庫(kù)必須同每一個(gè)活動(dòng)的客戶保持連接,這些連接消耗了大量的運(yùn)算資源,其結(jié)果是隨著客戶數(shù)目的增加,性能不斷下降.由于應(yīng)用邏輯全部駐留在客戶端,當(dāng)應(yīng)用環(huán)境發(fā)生變化需要改變事務(wù)邏輯時(shí),每個(gè)客戶機(jī)上的程序都需要更新,給系統(tǒng)的維護(hù)和管理造成了一定的困難。隨著應(yīng)用系統(tǒng)越來(lái)越復(fù)雜,客戶端應(yīng)用程
24、序變得越來(lái)越龐大,對(duì)客戶機(jī)的處理能力要求越來(lái)越高,成為所謂的“胖客戶機(jī)” 在C/S模式中,工作原理可以簡(jiǎn)單的理解為:Client向Server提交一個(gè)請(qǐng)求,Server則使用一些方法處理這個(gè)請(qǐng)求,并將效果返回給Client. 見(jiàn)圖3.1 圖 3.1 C/S模式原理圖 在處理Client的請(qǐng)求時(shí),Server本身可以成為另一個(gè)C/S模式中的Client. 見(jiàn)圖3.2 圖 3.2 server與client關(guān)系圖 大部份的人認(rèn)為在Client-Server應(yīng)用軟件中,Server做了幾乎所有的工作。但實(shí)際上并不是這樣
25、。在實(shí)際應(yīng)用中,Client執(zhí)行了大部份的軟件邏輯并完成了大部份的工作。Server當(dāng)然也做了些工作。但它主要的工作是接受client的請(qǐng)求并返回結(jié)果。 有許多人說(shuō)C/S結(jié)構(gòu)是分布式結(jié)構(gòu)中最常用的一個(gè)例子。的確,它確實(shí)是一個(gè)常用的架構(gòu)模式,而且它也確是通過(guò)網(wǎng)絡(luò)進(jìn)行Client和Server之間的交互,但是,嚴(yán)格來(lái)說(shuō),C/S模式有可能不是真正意義上的分布式結(jié)構(gòu)。為什么這么說(shuō)呢?我們首先應(yīng)該從分布式結(jié)構(gòu)的定義及特性去考慮。分布式系統(tǒng)簡(jiǎn)單來(lái)說(shuō)是指通過(guò)網(wǎng)絡(luò),進(jìn)行多于一臺(tái)電腦之間的數(shù)據(jù)交互。而它最大的特性在于二點(diǎn),性能(performance)和可量測(cè)性(Scalability). 而C/S模式由于含
26、有一系列的限制,以至于很難達(dá)到這二點(diǎn)分布式系統(tǒng)的特性。另一方面,一個(gè)單獨(dú)的應(yīng)用軟件的透明度通常也是一個(gè)分布式結(jié)構(gòu)的特性,但C/S模式并沒(méi)有提供這方向的特性。舉個(gè)例子,一個(gè)網(wǎng)頁(yè)瀏覽器,可以看成是一個(gè)Client.而用戶必須輸入網(wǎng)站的網(wǎng)址去連接包含所要求網(wǎng)頁(yè)的Server,在這里,它就缺乏了透明性。因此我也可以將這個(gè)網(wǎng)頁(yè)瀏覽器和服務(wù)器看成是在這個(gè)系統(tǒng)中的二個(gè)獨(dú)立的組件。在C/S模式下,應(yīng)用程序直接存取數(shù)據(jù)庫(kù)服務(wù)器上的數(shù)據(jù),數(shù)據(jù)庫(kù)服務(wù)器掛在網(wǎng)絡(luò)服務(wù)器上,客戶機(jī)通過(guò)協(xié)議(如TCP/IP)和服務(wù)器連接。網(wǎng)絡(luò)服務(wù)器一般運(yùn)行Unix或Windows NT等操作系統(tǒng),客戶機(jī)一般運(yùn)行Windows95/98。在
27、C/S模式下,大量的開(kāi)發(fā)任務(wù)在客戶機(jī)端。目前各種流行的開(kāi)發(fā)環(huán)境一般都有開(kāi)發(fā)數(shù)據(jù)庫(kù)的工具,并且支持C/S模式開(kāi)發(fā)。如Visual C++/Basic、Delphi/C++ Builder、Power Builder等。 3.2.2 C/S模式的限制與應(yīng)用 C/S模式也含有一系列的限制。那這些限制都是什么呢?其實(shí)C/S模式最基本的問(wèn)題在于其缺乏可量測(cè)性,主要原因是由于Server逐漸的變成了性能的瓶頸。在前面介紹了可量測(cè)性和性能是分布式結(jié)構(gòu)的二大特點(diǎn)。二者相輔相成,缺乏了可量測(cè)性也成為了C/S模式不是一種完全的分布式結(jié)構(gòu)的一個(gè)原因。在C/S模式中,服務(wù)端通常需要通過(guò)獲取和使用一些資源來(lái)處理Cl
28、ient的請(qǐng)求,比如說(shuō),連接數(shù)據(jù)庫(kù),獲取數(shù)據(jù)信息等。對(duì)于一個(gè)軟件的開(kāi)發(fā)設(shè)計(jì),任何一個(gè)需要訪問(wèn)共享資源的設(shè)計(jì)系統(tǒng)均應(yīng)該在最短的時(shí)間內(nèi)獲取到所需資源,這樣其它的用戶就可以有機(jī)會(huì)去訪問(wèn)資源。試想一下,如果同一時(shí)間,大量的Client同時(shí)對(duì)Server發(fā)出請(qǐng)求,會(huì)出現(xiàn)什么的樣的情況?可能會(huì)是Server的崩潰,也可能會(huì)是網(wǎng)絡(luò)的停滯,但不管是什么,這一點(diǎn)將會(huì)讓Server變成一個(gè)性能的瓶頸,這也是為什么我說(shuō)C/S模式對(duì)于一個(gè)應(yīng)用軟件的可量測(cè)性來(lái)說(shuō)含有一定的限制。(有關(guān)可量測(cè)性,在下面討論)。C/S模式不適合大型的網(wǎng)絡(luò)系統(tǒng),但對(duì)于局域網(wǎng)系統(tǒng)來(lái)說(shuō)是個(gè)很好的選擇,換句話說(shuō),C/S模式適合10到100用戶的局域
29、網(wǎng)的系統(tǒng)開(kāi)發(fā),而對(duì)于Internet用戶的系統(tǒng)來(lái)說(shuō),這種模式就不適合了。如果說(shuō)C/S模式不是一種完全的分布式系統(tǒng),那么它與傳統(tǒng)的分布式系統(tǒng)又有什么差別呢?C/S模式的大部處理是在Client 中執(zhí)行,而傳統(tǒng)的分布式系統(tǒng)是在另一遠(yuǎn)程機(jī)器中進(jìn)行處理。二者的邊界有點(diǎn)模糊,針對(duì)不同的系統(tǒng)要進(jìn)行正確的選擇,這樣才能設(shè)計(jì)出高性能的系統(tǒng)。 3.2.3 可量測(cè)性(Scalability)的討論 什么是可量測(cè)性呢?對(duì)于一個(gè)含有可量測(cè)性的系統(tǒng)來(lái)說(shuō),當(dāng)其在物理資源(小陸所說(shuō)的硬件資源)的數(shù)量或者用戶的數(shù)量增加的前提下,仍應(yīng)盡可能的保持著效率。當(dāng)然,在實(shí)際的操作中,這是不可能的,多多少少性能都會(huì)受到影響。拿本程序
30、來(lái)當(dāng)例子,當(dāng)玩家多的時(shí)候,大家都需要排隊(duì),才能進(jìn)入到游戲,而當(dāng)玩家少的時(shí)候,大家就可以直接連接,進(jìn)入到游戲中[17]。 3.3 界面開(kāi)發(fā)工具的選擇 對(duì)一個(gè)優(yōu)秀的應(yīng)用程序來(lái)說(shuō),良好的圖形用戶接口是必不可少的。缺少良好的圖形用戶接口,將會(huì)給用戶理解和使用應(yīng)用程序帶來(lái)很多不便。很難想象用戶為了學(xué)會(huì)使用一個(gè)應(yīng)用程序,去記一大堆命令。Java提Awt和swing包了生成一個(gè)良好的圖形用戶接口所需要的;基本元件:面板(Panelcopy;、按鈕(Buttoncopy;、標(biāo)copy;(Labelcopy;、畫(huà)板(Canvasescopy;、滾動(dòng)條(Scrollbarcopy;、列表框(Listcopy;
31、、文本域(TextFieldcopy;、文本區(qū)(TextAreacopy)。由于本系統(tǒng)是一個(gè)休閑娛樂(lè)游戲,本身的界面元素也不是很復(fù)雜,所以用Java AWT來(lái)做界出處理已經(jīng)足夠了。用JAVA AWT做界面也有利于和JAVA內(nèi)部程序的銜接。 3.4 JAVA Socket編程 Java是一種可用于進(jìn)行網(wǎng)絡(luò)編程的語(yǔ)言,它提供了兩種功能強(qiáng)大的網(wǎng)絡(luò)支持機(jī)制:URL訪問(wèn)網(wǎng)絡(luò)資源的類和用Socket通訊的類,來(lái)滿足不同的要求[18]。一是URL用于訪問(wèn)Internet網(wǎng)上資源的應(yīng)用;另一種是針對(duì)client/server(客戶端/服務(wù)器)模式的應(yīng)用以及實(shí)現(xiàn)某些特殊的協(xié)議的應(yīng)用,它的通訊過(guò)程是基
32、于TCP/IP協(xié)議中傳輸層接口socket實(shí)現(xiàn)的。 客戶基于服務(wù)器之間使用的大部分通訊組件都是基于socket接口來(lái)實(shí)現(xiàn)的[19]。Socket是兩個(gè)程序之間進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通訊端點(diǎn),有一個(gè)地址和一個(gè)端口號(hào)來(lái)標(biāo)識(shí)。每個(gè)服務(wù)程序在提供服務(wù)時(shí)都要在一個(gè)端口進(jìn)行,而想使用該服務(wù)的客戶機(jī)也必須連接該端口。Socket因?yàn)槭腔趥鬏攲?,所以它是比較原始的通訊協(xié)議機(jī)制。通過(guò)Socket的數(shù)據(jù)表現(xiàn)形式為字節(jié)流信息,因此通訊雙方要想完成某項(xiàng)具體的應(yīng)用則必須按雙方約定的方式進(jìn)行數(shù)據(jù)的格式化和解釋,它具有更強(qiáng)的靈活性和更廣泛的使用領(lǐng)域。 客戶機(jī)/服務(wù)器Socket通訊工作模式見(jiàn)圖3.3 圖
33、3.3 客戶機(jī)/服務(wù)器Socket通訊工作模式 第四章 五子棋詳細(xì)設(shè)計(jì) 根據(jù)上一章介紹的系統(tǒng)實(shí)現(xiàn)方案,可以將系統(tǒng)簡(jiǎn)要的看為分為三個(gè)大的功能模塊,即界面元素的設(shè)計(jì),客戶端程序設(shè)計(jì)和服務(wù)器端程序設(shè)計(jì)。下面就這三個(gè)部分的主要功能實(shí)現(xiàn)依次進(jìn)行介紹: 4.1需求規(guī)定 l 棋盤(pán)采用 1515 棋盤(pán)。 l 游戲采用人與人對(duì)弈模式,可以選擇玩家進(jìn)行游戲。 l 游戲中設(shè)有禁守規(guī)則和其他走子限制。 l 只有當(dāng)五個(gè)相同顏色的棋子成線以后才判為獲勝,長(zhǎng)連也算獲勝。 l 棋盤(pán)顏色與棋子顏色要對(duì)比分明,便于其他程序識(shí)別。 l 游戲中可以顯示游戲狀態(tài)的信息,但是不能有彈出對(duì)話框之類的窗口擋住棋盤(pán)。 4
34、.2 運(yùn)行環(huán)境 硬件配置(推薦): CPU:P4—1GHZ或更高 內(nèi)存:128M或更多 顯示器分辨率:800x600或更高 軟件配置: Jbuilder 9或安裝了JDK 1.4,windowsXP操作系統(tǒng) 運(yùn)行本軟件的系統(tǒng)平臺(tái): 由于本程序是采用JAVA開(kāi)發(fā)的,實(shí)現(xiàn)了與平臺(tái)的無(wú)關(guān)性,具有很強(qiáng)的可移性,一次開(kāi)發(fā)處處運(yùn)行,所以可以在所有平臺(tái)運(yùn)行。 開(kāi)發(fā)工具: Jbuilder 9 4.3 五子棋客戶端設(shè)計(jì) 4.3.1 建立15X15棋盤(pán) 圖 4.1 五子棋棋盤(pán) 4.3.2 界面元素的設(shè)計(jì) 游
35、戲菜單,玩家列表,聊天窗口以及其它一些狀態(tài)信息。整個(gè)程序界面見(jiàn)圖4.2 圖 4.2 系統(tǒng)界面 游戲菜單:可以單擊和人對(duì)戰(zhàn),設(shè)定禁手規(guī)則,退出,以及作者信息。 玩家列表:玩家可以雙擊列表中的一個(gè)玩家請(qǐng)求游戲,當(dāng)對(duì)方接受請(qǐng)求雙方即可以開(kāi)始游戲。 聊天窗口:一對(duì)正在游戲的玩家可以互相聊天。 4.3.3 建立與使用獲勝表 int board [10][10];//玩家的每一顆棋子是否在各個(gè)獲勝表中 圖 4.3 獲勝表 board [15][15]中的元素都初始化為0;board [15][15]中記錄了兩個(gè)玩家的所有落子信息,一方玩家為白子在數(shù)組中用0表示,一方為黑子在數(shù)組中用
36、1表示,所以在整個(gè)數(shù)組都是1,0的數(shù)據(jù),根據(jù)正向,反向,斜向上1,0形成的個(gè)數(shù)學(xué)來(lái)判斷白子和黑子的是獲勝的組合數(shù) 4.3.4 客戶端程序主要變量說(shuō)明 表1 客戶端程序主要變量列表 變量 類 型 功 能 board int[][] 用來(lái)記錄玩家各自的下子信息,由此表判斷勝負(fù)。 pColor Int 用來(lái)記錄玩家所選的棋的顏色。 socket Socket 定義一個(gè)套接字。 PORT Int 定義服務(wù)器端需要監(jiān)聽(tīng)的端口,客戶端一連接到此端口,服務(wù)器端就可以監(jiān)聽(tīng)到,從而和客戶端建立起通信。 in ObjectInputStrea
37、m 表示客戶端套接字的輸入流,用來(lái)接收其它客戶端和服務(wù)器端傳來(lái)的數(shù)據(jù)。 out ObjectOutputStream 表示客戶端套接字的輸出流,用來(lái)向其它客戶端和服務(wù)器端輸出數(shù)據(jù)。 serverAddress String 記錄主機(jī)即服務(wù)器端的IP地址信息,客戶端通過(guò)些IP地址連接到服務(wù)器的PORT端口。 name String 記錄了當(dāng)前玩家的名字。 send Char[] 當(dāng)玩家離開(kāi)時(shí)服務(wù)器時(shí)會(huì)向另一玩家發(fā)離開(kāi)消息,此變量記錄的便是這個(gè)消息字符串。 message Message beginFlag Boolean 記錄游戲開(kāi)始/結(jié)束的標(biāo)志,也是游
38、戲開(kāi)始的標(biāo)志 bpanel BoardPanel 記錄了棋盤(pán)信息。包括棋盤(pán)的創(chuàng)建以及棋盤(pán)響應(yīng)的事件。 xp Int 記錄了玩家按下的點(diǎn)的橫向的像素位置 yp Int 記錄了玩家按下的點(diǎn)的豎向的像素位置 setting Boolean 是否設(shè)置禁手。 coordinateX Int 客戶端向服務(wù)器發(fā)送消息時(shí)記發(fā)的當(dāng)前玩家下棋的橫向位置。 coordinateY Int 客戶端向服務(wù)器發(fā)送消息時(shí)記發(fā)的當(dāng)前玩家下棋的縱向位置。 msg char[] 記錄了玩家與玩家之間聊天信息。 4.3.5 客戶端主要方法說(shuō)明 表2 客戶
39、端程序主要方法列表 方 法 名 稱 類 型 功 能 acceptToPlay(Message msg) void 接受一個(gè)玩家的游戲請(qǐng)求 arrayToString(char [] arr) String 將字節(jié)流轉(zhuǎn)換為字符串 drawChess(int x,int y){ void 在指定位置畫(huà)一顆棋字 getDeny(Message msg) void 拒絕一個(gè)玩家的游戲請(qǐng)求 getDisconnection(Message msg) void 正在游戲時(shí),另一玩家退出,收到服務(wù)器發(fā)來(lái)的玩家離開(kāi)消息。 getFailed(Me
40、ssage msg) void 當(dāng)玩家輸?shù)粲螒驎r(shí)顯示失敗信息。 getVictory(Message msg) void 當(dāng)玩家輸?shù)粲螒驎r(shí)顯示勝利信息。 newGame() void 重新開(kāi)始新游戲,程序回到初始狀態(tài)。 paint(GraphiC/S g) void 重畫(huà)棋盤(pán)。 putChessman(Message msg) void 玩家下了一個(gè)棋子后,通過(guò)傳送消息提交到服務(wù)器。 requestAnother(Message msg) void 請(qǐng)求與另外的玩家進(jìn)行游戲。 sendDisconnect() void 向服務(wù)器發(fā)送斷開(kāi)連接請(qǐng)求,退出程序
41、,斷開(kāi)與服務(wù)的連接 clearBoard() void 將棋盤(pán)清零,回到初始狀態(tài)。 updateBoard(int x,int y){ void 更新棋盤(pán)。 judge(int x,int y,int clr) boolean 判斷棋盤(pán),是否有同顏色的棋子構(gòu)成五個(gè)以上,由些判斷勝負(fù)。 4.4 五子棋服務(wù)器端設(shè)計(jì) 服務(wù)器端的程序是整個(gè)程序的核心,用來(lái)處理來(lái)自客戶端的請(qǐng)求,傳送消息,服務(wù)器程序的設(shè)計(jì)主要包括:監(jiān)聽(tīng)端口接收來(lái)自客戶端的連接請(qǐng)求,將相互對(duì)戰(zhàn)的客戶端編組,向?qū)?zhàn)的客戶傳送聊天信息,處理來(lái)自客戶端的消息以及向客戶端發(fā)送消息,勝負(fù)的判斷,一些功能轉(zhuǎn)換函數(shù),處理來(lái)自
42、客戶端的連接及斷開(kāi)連接請(qǐng)求。 4.4.1 服務(wù)器端程序主要變量說(shuō)明 表3 服務(wù)器端主要變量說(shuō)明 變 量 名 類 型 功 能 player String 記錄了每個(gè)玩家的基本信息。 in ObjectInputStream 服務(wù)器端的輸入流,用來(lái)接收來(lái)自客戶端的消息。 out ObjectOutputStream 服務(wù)器端的輸出流,用來(lái)發(fā)送消息到客戶端。 socket Socket 定義一個(gè)套接字,用來(lái)與客戶端的連接。 gg Group 對(duì)戰(zhàn)玩家組的基本信息。 playerList ArrayList 玩家列表。
43、 groupList ArrayList 對(duì)戰(zhàn)的玩家列表。 PORT Int 定義服務(wù)器端需要監(jiān)聽(tīng)的端口,客戶端一連接到此端口,服務(wù)器端就可以監(jiān)聽(tīng)到,從而和客戶端建立起通信。 s ServerSocket 服務(wù)器端的套接字。 4.4.2 服務(wù)器端程序主要方法說(shuō)明 表4 服務(wù)器端主要方法說(shuō)明 方 法 名 稱 類 型 功 能 說(shuō) 明 addPlayer(Message player) void 添加一個(gè)玩家到玩家列表。 acceptRequest(Messagemsg) void A玩家接受另B玩家的游戲請(qǐng)求,服務(wù)器向B玩家發(fā)送接受游戲請(qǐng)求消息
44、。 denyRequest(Messagemsg) void A玩家拒絕B玩家的游戲請(qǐng)求,服務(wù)器向B玩家發(fā)送拒絕游戲請(qǐng)求消息。 doMessage(Message msg) int 處理來(lái)自客戶端的消息。 getdisconnect(Message msg) void 處理正在游戲的兩個(gè)玩家中的斷開(kāi)連接請(qǐng)求。 getSocket() Socket 獲得一個(gè)套接字。 playerRefresh(Messageplayer) void 刷新玩家列表。 putChessman(Message msg) void 處理玩家的下子信息。 requestAnother
45、(Message msg) void 處理一個(gè)玩家請(qǐng)求向另外的玩家游戲請(qǐng)求的消息。 updateClient() void 更新玩家列表。 setting(Message msg, boolean flag) void 向?qū)?zhàn)的兩家發(fā)送消息設(shè)置是否禁手。 chatmessage(Message msg) void 處理對(duì)戰(zhàn)的兩玩家的聊天信息。 judge(Group gg, int x, int y) boolean 判斷勝負(fù)。 4.4.3 服務(wù)器端主體流程圖(見(jiàn)圖4.4) 客戶端消息 doMessage(),處理來(lái)自客戶端的消息
46、,判斷消息類型 2 3==3=2 4 5 7 12 19 21 13 6 putChessman(msg) denyRequest(msg) acceptRequest(msg) checkVictory(msg) setting(msg, flag) playerRefresh(msg) chatmessage(msg) setting(msg, flag) checkVictory(msg) requestAnother(msg 輸出消息到各客戶端 圖 4.4 服務(wù)器端
47、主體流程圖 4.4.4 程序模塊功能說(shuō)明 表5程序模塊功能說(shuō)明 類 名 功 能 說(shuō) 明 BoardPanel 畫(huà)出棋盤(pán),處理棋盤(pán)事件 ChessWZQ 客戶端主程序,處理客戶端與服務(wù)器端的消息傳送 Group 定義一個(gè)對(duì)戰(zhàn)玩家組 Player 初始化一個(gè)玩家信息 Server 初始化服務(wù)器端的監(jiān)聽(tīng)程序 Message 客戶端與服務(wù)器端傳送的消息對(duì)象 ServerOneClient 服務(wù)器端的主體程序,處理與客戶端的交互,轉(zhuǎn)發(fā)請(qǐng)求 InetAddressTest 用于初始化服務(wù)器端的IP地址址信息。 4.4.5
48、 程序主體流程圖(見(jiàn)圖4.5) 圖 4.5程序主體流程圖 第五章 系統(tǒng)測(cè)試與性能分析 5.1 系統(tǒng)功能測(cè)試 設(shè)定JDK1.4的ClassPath和Path后進(jìn)入到程序所在的目錄,在Dos界面運(yùn)行server.bat啟動(dòng)服務(wù)器端程序,按照上面步聚再啟動(dòng)一個(gè)Dos 界面運(yùn)行client1.bat啟動(dòng)一個(gè)客戶端程序,按照上面步聚再啟動(dòng)一個(gè)Dos 界面運(yùn)行client2.bat啟動(dòng)一個(gè)客戶端程序,至此系統(tǒng)完整界面啟動(dòng),見(jiàn)圖5.1 圖 5.1 系統(tǒng)界面 1.由圖6.1可知各界面元素符合需求分析中規(guī)定的要求,游戲界面測(cè)試成功。 2.玩家選擇白色棋子,對(duì)方則自動(dòng)選擇黑色棋子,棋子選色測(cè)
49、試成功。 3.在玩家列表中雙擊一個(gè)玩家請(qǐng)求游戲,雙方建立了連接,游戲正常開(kāi)始,游戲連接測(cè)試成功。 4.在聊天窗口中輸入信息,對(duì)方玩家可以收到自己發(fā)的信息,自己也可以收到對(duì)方玩家輸入的信息,聊天窗口測(cè)試成功。 5.在棋盤(pán)上點(diǎn)擊鼠標(biāo),程序可以依照程序要求在上面下子,并且可以正常處理判斷勝負(fù),下子過(guò)程測(cè)試成功。 6.點(diǎn)擊Create中的play with people 則系統(tǒng)提示在玩家列表中選擇玩家進(jìn)行游戲,Create菜單測(cè)試成功。 7.點(diǎn)擊Quit按鈕,游戲可以正常退出并可以正確判斷勝負(fù),退出功能測(cè)試成功。 5.2 系統(tǒng)性能分析 1.測(cè)試服務(wù)器的響應(yīng)時(shí)間 運(yùn)行客戶端程序
50、client1.bat,玩家名字可以立即出現(xiàn)在服務(wù)器端的玩家列表中,由此可知客戶端與服務(wù)器的連接速度良好。 2.測(cè)試下子過(guò)程及勝負(fù)的處理響應(yīng)時(shí)間 在棋盤(pán)上下一個(gè)棋子,服務(wù)器端可以接收到下子信息并把信息發(fā)到另外的客戶端,如果此時(shí)有任一方的棋子可以五個(gè)成一線則可以正確判斷勝負(fù),由些可知系統(tǒng)對(duì)下子過(guò)程的處理響應(yīng)時(shí)間良好。 由些可以測(cè)定系統(tǒng)對(duì)各方面的性能響應(yīng)要求良好,符合需求分析的要求。 結(jié)束語(yǔ) 網(wǎng)絡(luò)游戲正在形成一個(gè)成熟而巨大的產(chǎn)業(yè)。在日本和韓國(guó),電子游戲已經(jīng)相繼超過(guò)以汽車制造為代表的傳統(tǒng)制造業(yè)而成為國(guó)民經(jīng)濟(jì)主導(dǎo)產(chǎn)業(yè)之一
51、。在美國(guó),游戲業(yè)已經(jīng)超越擁有百年歷史的好萊塢電影業(yè)而成為整個(gè)電子娛樂(lè)產(chǎn)業(yè)的龍頭。根據(jù)市場(chǎng)預(yù)測(cè),從2001年到2005年,美國(guó)的網(wǎng)絡(luò)游戲收入將會(huì)以每年50%的速度遞增,由2.3億美元增加到18億美元。2003年, 中國(guó)網(wǎng)絡(luò)游戲人數(shù)將超過(guò)1500萬(wàn)人。國(guó)內(nèi)網(wǎng)站方面,網(wǎng)易、新浪、搜狐、21CN、騰訊、TOM等紛紛進(jìn)軍網(wǎng)絡(luò)游戲。2002年,國(guó)內(nèi)網(wǎng)絡(luò)游戲從50多款迅速發(fā)展到了130多款。2003年將繼續(xù)成倍增加。可見(jiàn)網(wǎng)絡(luò)游戲的開(kāi)發(fā)還存在著巨大的潛力,如何開(kāi)發(fā)出更好的網(wǎng)絡(luò)游戲?qū)⑹俏覀兝^續(xù)努力的目標(biāo)。通過(guò)本程序的開(kāi)發(fā)我掌握了很多JAVA應(yīng)用方面的知識(shí),加深了對(duì)計(jì)算機(jī)網(wǎng)絡(luò)編程的了解。
52、 參考文獻(xiàn) [1] 王曉春.PC游戲編程(人機(jī)博弈)[M].北京:清華大學(xué)出版社,2001 [2] 黎德玲.中國(guó)象棋的機(jī)器下棋[M].北京:清華大學(xué)出版社,2001 [3] 李琳.JAVA核心技術(shù)[M].北京:清華大學(xué)出版社,2001 [4] 杜誠(chéng).JAVA基礎(chǔ)與提高[M].北京:人民郵電出版社,2001 [5] Nils J.Nilsson.人工智能[M].美:機(jī)械工業(yè)出版社,2000 [6] 林堯瑞.人工智能導(dǎo)論[M] .北京:清華大學(xué)出版社 ,2001 [7] 尼爾松.人工智能[M].北京:機(jī)械工業(yè)出版社, 20
53、01 [8] 那威,張照元.連珠五子棋提高捷徑入段升級(jí)必讀[M]. 北京:北京體育大學(xué)出版社,1998 [9] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].北京:機(jī)械工業(yè)出版社,2000 [10] Donald E. Knuth. The Art of Computer Programming[M]. Addison-Wesley,1998 [11] 雷超陽(yáng),徐正權(quán),張治元.基于C/S模式中影響數(shù)據(jù)庫(kù)系統(tǒng)性能的研究[J].電腦信息技術(shù).2005, 24(1):4~7 [12] 趙子
54、義,李明.Java Socket 編程詳解[J].計(jì)算機(jī)科學(xué).2003,20(2):11~12 [13] 曾亞純,彭遠(yuǎn)威.數(shù)據(jù)庫(kù)設(shè)計(jì)與編程實(shí)例詳解[J].信息與電腦.2001,15(5):15~17 [14] 楊世清.基于網(wǎng)絡(luò)環(huán)境的游戲開(kāi)發(fā)技術(shù)[J].武漢科技報(bào).2004,18(10):10~13 [15] 李達(dá).現(xiàn)代游戲開(kāi)發(fā)技術(shù)[J].計(jì)算機(jī)學(xué)報(bào).2003,14(3):33~40 [16] 薩師煊,王珊.計(jì)算機(jī)網(wǎng)絡(luò)概論[J].電腦信息報(bào).2001,19(1):30~39 [17] 蔡自興.人工智能技術(shù)[J].計(jì)算機(jī)學(xué)報(bào).2002,20(2):5~9 [18] Wiki Discu
55、ssiion,Cost of Design carry. of Design Carry,1999 [19] 許正熙,信息管理論文.論文急救中心.,2001 致謝 最后,我要感謝在這段時(shí)間內(nèi)對(duì)我的工作進(jìn)行指導(dǎo)的孫建平老師。在程序的實(shí)現(xiàn)過(guò)程中,她的指導(dǎo)使我對(duì)網(wǎng)絡(luò)游戲和計(jì)算機(jī)網(wǎng)絡(luò)編程的認(rèn)識(shí)更加深刻,對(duì)人工智能的講解對(duì)我來(lái)說(shuō)是全新的,非常有吸引力的。在程序的設(shè)計(jì)過(guò)程中遇到困難的時(shí)候,她及時(shí)的給了我建議與支持,使得畢業(yè)設(shè)計(jì)能夠順利進(jìn)行,并在規(guī)定的時(shí)間內(nèi)完成各項(xiàng)任務(wù)。 感謝系里領(lǐng)導(dǎo)為我們學(xué)生畢業(yè)設(shè)計(jì)過(guò)程中提供的各種方便、理解與支持。有了他們的支持我的畢業(yè)設(shè)計(jì)才能如期完成。 感謝JA
56、VA中文論壇中開(kāi)展的討論,我在那里學(xué)到了許多關(guān)于JAVA網(wǎng)絡(luò)編程方面的知識(shí),在寫(xiě)論文的過(guò)程中和程序?qū)崿F(xiàn)上遇到疑問(wèn)的時(shí)候,從那里也得到了很多啟發(fā)。 我還要感謝同組的同學(xué),在設(shè)計(jì)和調(diào)試遇到困難的時(shí)候,很多都是依賴與他們的交流。是他們的鼓勵(lì)和熱心幫助讓我順利的完成了設(shè)計(jì)任務(wù)。 附錄 Message類 //Message 類是客戶端與服務(wù)器端傳送的消息對(duì)象 import java.io.Serializable; /** * message list * type = 1 // request of connected,msg =
57、 connectors name * type = 2 // put chessman * type = 3 // request play with another * type = 4 // deny a request for play * type = 5 // agree with request * type = 6 // send victory message * type = 7 // send disconnection * type = 8 // save game but not to disk,it will be lost when ne
58、xt start * type = 9 // add new player to all clients player list * type = 10// response for message type ==1 * type = 11// play with a player,msg save players name ,game set by * // the one who create game * type = 12// setting information * type = 13// setting player color *
59、type = 14// msg for acceptor B to setting color and setings * type = 15// server update message * type = 16// send messages of control or errors * type = 17// failed in the game * type = 18// server socket close * type = 19// player end a game and refresh * tyep = 20// computer win / peo
60、ple win */ public class Message implements Serializable{ byte type; // message type ,eg.1=request of connection boolean setting; // 是否設(shè)置禁手 int color; // chessman color ,1 = black ,2 = white boolean forYourTurn; // judge whether it is for receivers tu
61、rn int coordinateX; // record the coordinate X from 0~14 ,save black or white int coordinateY; // record the coordinate Y from 0~14 ,save black or white char[] msg; public Message(){ setting=true; msg = new char[50]; } } Player類
62、 Player類用于初始化一個(gè)玩家信息 import .Socket; public class Player { String self=null; ServeOneClient selfSocket=null; boolean setting = false; int color = 1; public Player(){} } Group類 //Grout類用于定義一個(gè)對(duì)戰(zhàn)玩家組,每?jī)蓚€(gè)玩家接受對(duì)戰(zhàn)時(shí),系統(tǒng)會(huì)將他們編為一組并從玩家列 //表消失 public class Group { String se
63、lf=null; ServeOneClient selfSocket=null; String player = null; ServeOneClient playerSocket =null; int selfColor = 0; int playerColor = 0; boolean Setting = false; int board[][]; public Group(){ board = new int[15][15]; } } Server類 //Server
64、類用于初始化服務(wù)器端的監(jiān)聽(tīng)程序 import java.io.*; import .*; import java.util.ArrayList; public class Server { public static final int PORT = 8180; public static ArrayList playerList = new ArrayList(); public static ArrayList groupList = new ArrayList(); public static void main(String[] args
65、)throws IOException { ServerSocket s = new ServerSocket(PORT); System.out.println("Welcome using ChessWZQ1.0 server (alpha test)...\nAuthor:張良周\nCopyright:scitel \nMail:skywolf_2002@"); System.out.println("Server Started at port "+PORT+"..."); System.out.println("
66、This is on the server!"); try { while(true) { // Blocks until a connection occurs: Socket socket = s.accept(); try { System.out.println("create a socket frome server"); ServeOneClient server = new ServeOneClient(socket); Player client = new Player(); client.
- 溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識(shí)競(jìng)賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫(kù)試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫(kù)試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫(kù)試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識(shí)測(cè)試題庫(kù)及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測(cè)工種技術(shù)比武題庫(kù)含解析
- 1 礦山應(yīng)急救援安全知識(shí)競(jìng)賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案