【正文】
的可能。Java提供Null指針檢測(cè)數(shù)組邊界檢測(cè)異常出口字節(jié)代碼校驗(yàn) 結(jié)構(gòu)中立另外,為了建立Java作為網(wǎng)絡(luò)的一個(gè)整體,Java將它的程序編譯成一種結(jié)構(gòu)中立的中間文件格式?,F(xiàn)在,(SPARC),Win32系統(tǒng)(Windows95和WindowsNT),這種語(yǔ)言被設(shè)計(jì)在虛擬機(jī)上運(yùn)行,由機(jī)器相關(guān)的運(yùn)行調(diào)試器實(shí)現(xiàn)執(zhí)行。一方面,在Java語(yǔ)言里,像指針和釋放內(nèi)存等C++功能被刪除,避免了非法內(nèi)存操作。Java語(yǔ)言在你的機(jī)器上執(zhí)行前,要經(jīng)過(guò)很多次的測(cè)試。 可移植的同體系結(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)很大不便。通過(guò)定義獨(dú)立于平臺(tái)的基本數(shù)據(jù)類型及其運(yùn)算,Java數(shù)據(jù)得以在任何硬件平臺(tái)上保持一致。在任何Java解釋器中,數(shù)據(jù)類型都是依據(jù)以上標(biāo)準(zhǔn)具體實(shí)現(xiàn)的。Java編譯器本身就是用Java語(yǔ)言編寫的。Java語(yǔ)言規(guī)范中也沒(méi)有任何同具體實(shí)現(xiàn)相關(guān)的內(nèi)容。線程有時(shí)也稱小進(jìn)程,是一個(gè)大進(jìn)程里分出來(lái)的小的獨(dú)立的進(jìn)程。多線程帶來(lái)的更大的好處是更好的交互性能和實(shí)時(shí)控制性能。任何用過(guò)當(dāng)前瀏覽器的人,都感覺(jué)為調(diào)一副圖片而等待是一件很煩惱的事情。 與C和C++語(yǔ)言的異同Java提供了一個(gè)功能強(qiáng)大語(yǔ)言的所有功能,但幾乎沒(méi)有一點(diǎn)含混特征。Java去掉了C++語(yǔ)言的許多功能,讓Java的語(yǔ)言功能很精煉,并增加了一些很有用的功能,Java去掉了以下幾個(gè)C和C++功能和特征:指針運(yùn)算結(jié)構(gòu)typedefsdefine需要釋放內(nèi)存全局變量的定義這個(gè)功能都是很容易引起錯(cuò)誤的地方。一般而言,C/S應(yīng)用系統(tǒng)從物理上都可劃分為客戶機(jī)與服務(wù)器兩大部分,而邏輯上又可分解為三部分:表達(dá)邏輯、業(yè)務(wù)處理邏輯和數(shù)據(jù)管理邏輯。C/S模式將一個(gè)應(yīng)用分為兩個(gè)部分:前端(客戶端)、后端(服務(wù)器)。一般來(lái)說(shuō),客戶機(jī)向服務(wù)器發(fā)出請(qǐng)求為其完成一部分工作服務(wù)器則處理客戶機(jī)的請(qǐng)求并返回結(jié)果。開放式的系統(tǒng)。服務(wù)器對(duì)用戶是透明的。相對(duì)B/S模式,C/S模式速度快,更利于處理大量數(shù)據(jù)。由于服務(wù)器連接個(gè)數(shù)和數(shù)據(jù)通信量的限制,這種結(jié)構(gòu)的軟件適于在用戶數(shù)目不多的局域網(wǎng)內(nèi)使用。C/S模式(ClientServer Architecture)可能是應(yīng)用軟件開發(fā)所使用的最成功的一種模式。而現(xiàn)在,C/S模式已經(jīng)成為一種基本的開發(fā)設(shè)計(jì)模式。但這并不代表說(shuō)所有的C/S應(yīng)用軟件均需要按照這樣來(lái)設(shè)計(jì)(即網(wǎng)絡(luò)不是必須的),它是允許在單機(jī)上運(yùn)行的。服務(wù)器端的數(shù)據(jù)庫(kù)必須同每一個(gè)活動(dòng)的客戶保持連接,這些連接消耗了大量的運(yùn)算資源,其結(jié)果是隨著客戶數(shù)目的增加,當(dāng)應(yīng)用環(huán)境發(fā)生變化需要改變事務(wù)邏輯時(shí),每個(gè)客戶機(jī)上的程序都需要更新,給系統(tǒng)的維護(hù)和管理造成了一定的困難。但實(shí)際上并不是這樣。Server當(dāng)然也做了些工作。有許多人說(shuō)C/S結(jié)構(gòu)是分布式結(jié)構(gòu)中最常用的一個(gè)例子。為什么這么說(shuō)呢?我們首先應(yīng)該從分布式結(jié)構(gòu)的定義及特性去考慮。而它最大的特性在于二點(diǎn),性能(performance)和可量測(cè)性(Scalability). 而C/S模式由于含有一系列的限制,以至于很難達(dá)到這二點(diǎn)分布式系統(tǒng)的特性。舉個(gè)例子,一個(gè)網(wǎng)頁(yè)瀏覽器,在這里,它就缺乏了透明性。在C/S模式下,應(yīng)用程序直接存取數(shù)據(jù)庫(kù)服務(wù)器上的數(shù)據(jù),數(shù)據(jù)庫(kù)服務(wù)器掛在網(wǎng)絡(luò)服務(wù)器上,客戶機(jī)通過(guò)協(xié)議(如TCP/IP)和服務(wù)器連接。在C/S模式下,大量的開發(fā)任務(wù)在客戶機(jī)端。如Visual C++/Basic、Delphi/C++ Builder、Power Builder等。那這些限制都是什么呢?其實(shí)C/S模式最基本的問(wèn)題在于其缺乏可量測(cè)性,主要原因是由于Server逐漸的變成了性能的瓶頸。二者相輔相成,缺乏了可量測(cè)性也成為了C/S模式不是一種完全的分布式結(jié)構(gòu)的一個(gè)原因。對(duì)于一個(gè)軟件的開發(fā)設(shè)計(jì),任何一個(gè)需要訪問(wèn)共享資源的設(shè)計(jì)系統(tǒng)均應(yīng)該在最短的時(shí)間內(nèi)獲取到所需資源,這樣其它的用戶就可以有機(jī)會(huì)去訪問(wèn)資源。(有關(guān)可量測(cè)性,在下面討論)。如果說(shuō)C/S模式不是一種完全的分布式系統(tǒng),那么它與傳統(tǒng)的分布式系統(tǒng)又有什么差別呢?C/S模式的大部處理是在Client 中執(zhí)行,而傳統(tǒng)的分布式系統(tǒng)是在另一遠(yuǎn)程機(jī)器中進(jìn)行處理。 可量測(cè)性(Scalability)的討論什么是可量測(cè)性呢?對(duì)于一個(gè)含有可量測(cè)性的系統(tǒng)來(lái)說(shuō),當(dāng)其在物理資源(小陸所說(shuō)的硬件資源)的數(shù)量或者用戶的數(shù)量增加的前提下,仍應(yīng)盡可能的保持著效率。拿本程序來(lái)當(dāng)例子,當(dāng)玩家多的時(shí)候,大家都需要排隊(duì),才能進(jìn)入到游戲,而當(dāng)玩家少的時(shí)候,大家就可以直接連接,進(jìn)入到游戲中[17]。缺少良好的圖形用戶接口,將會(huì)給用戶理解和使用應(yīng)用程序帶來(lái)很多不便。Java提Awt和swing包了生成一個(gè)良好的圖形用戶接口所需要的。、按鈕(Buttoncopy。(Labelcopy。、滾動(dòng)條(Scrollbarcopy。、文本域(TextFieldcopy。由于本系統(tǒng)是一個(gè)休閑娛樂(lè)游戲,本身的界面元素也不是很復(fù)雜,所以用Java AWT來(lái)做界出處理已經(jīng)足夠了。 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]。 客戶基于服務(wù)器之間使用的大部分通訊組件都是基于socket接口來(lái)實(shí)現(xiàn)的[19]。每個(gè)服務(wù)程序在提供服務(wù)時(shí)都要在一個(gè)端口進(jìn)行,而想使用該服務(wù)的客戶機(jī)也必須連接該端口。通過(guò)Socket的數(shù)據(jù)表現(xiàn)形式為字節(jié)流信息,因此通訊雙方要想完成某項(xiàng)具體的應(yīng)用則必須按雙方約定的方式進(jìn)行數(shù)據(jù)的格式化和解釋,它具有更強(qiáng)的靈活性和更廣泛的使用領(lǐng)域。圖 客戶機(jī)/服務(wù)器Socket通訊工作模式第四章 五子棋詳細(xì)設(shè)計(jì)根據(jù)上一章介紹的系統(tǒng)實(shí)現(xiàn)方案,可以將系統(tǒng)簡(jiǎn)要的看為分為三個(gè)大的功能模塊,即界面元素的設(shè)計(jì),客戶端程序設(shè)計(jì)和服務(wù)器端程序設(shè)計(jì)。l 游戲采用人與人對(duì)弈模式,可以選擇玩家進(jìn)行游戲。l 只有當(dāng)五個(gè)相同顏色的棋子成線以后才判為獲勝,長(zhǎng)連也算獲勝。l 游戲中可以顯示游戲狀態(tài)的信息,但是不能有彈出對(duì)話框之類的窗口擋住棋盤?!? 開發(fā)工具:Jbuilder 9 五子棋客戶端設(shè)計(jì) 建立15X15棋盤圖 五子棋棋盤 界面元素的設(shè)計(jì)游戲菜單,玩家列表,聊天窗口以及其它一些狀態(tài)信息。玩家列表:玩家可以雙擊列表中的一個(gè)玩家請(qǐng)求游戲,當(dāng)對(duì)方接受請(qǐng)求雙方即可以開始游戲。 建立與使用獲勝表int board [10][10];//玩家的每一顆棋子是否在各個(gè)獲勝表中圖 獲勝表board [15][15]中的元素都初始化為0;board [15][15]中記錄了兩個(gè)玩家的所有落子信息,一方玩家為白子在數(shù)組中用0表示,一方為黑子在數(shù)組中用1表示,所以在整個(gè)數(shù)組都是1,0的數(shù)據(jù),根據(jù)正向,反向,斜向上1,0形成的個(gè)數(shù)學(xué)來(lái)判斷白子和黑子的是獲勝的組合數(shù) 客戶端程序主要變量說(shuō)明表1 客戶端程序主要變量列表變量類 型功 能boardint[][]用來(lái)記錄玩家各自的下子信息,由此表判斷勝負(fù)。socketSocket定義一個(gè)套接字。inObjectInputStream表示客戶端套接字的輸入流,用來(lái)接收其它客戶端和服務(wù)器端傳來(lái)的數(shù)據(jù)。serverAddressString記錄主機(jī)即服務(wù)器端的IP地址信息,客戶端通過(guò)些IP地址連接到服務(wù)器的PORT端口。send Char[]當(dāng)玩家離開時(shí)服務(wù)器時(shí)會(huì)向另一玩家發(fā)離開消息,此變量記錄的便是這個(gè)消息字符串。包括棋盤的創(chuàng)建以及棋盤響應(yīng)的事件。coordinateXInt客戶端向服務(wù)器發(fā)送消息時(shí)記發(fā)的當(dāng)前玩家下棋的橫向位置。msgchar[]記錄了玩家與玩家之間聊天信息。getFailed(Message msg)void當(dāng)玩家輸?shù)粲螒驎r(shí)顯示失敗信息。newGame()void重新開始新游戲,程序回到初始狀態(tài)。putChessman(Message msg)void玩家下了一個(gè)棋子后,通過(guò)傳送消息提交到服務(wù)器。sendDisconnect()void向服務(wù)器發(fā)送斷開連接請(qǐng)求,退出程序,斷開與服務(wù)的連接clearBoard()void將棋盤清零,回到初始狀態(tài)。judge(int x,int y,int clr)boolean判斷棋盤,是否有同顏色的棋子構(gòu)成五個(gè)以上,由些判斷勝負(fù)。 服務(wù)器端程序主要變量說(shuō)明表3 服務(wù)器端主要變量說(shuō)明變 量 名類 型功 能playerString記錄了每個(gè)玩家的基本信息。outObjectOutputStream服務(wù)器端的輸出流,用來(lái)發(fā)送消息到客戶端。ggGroup對(duì)戰(zhàn)玩家組的基本信息。groupListArrayList對(duì)戰(zhàn)的玩家列表。sServerSocket服務(wù)器端的套接字。acceptRequest(Messagemsg)voidA玩家接受另B玩家的游戲請(qǐng)求,服務(wù)器向B玩家發(fā)送接受游戲請(qǐng)求消息。doMessage(Message msg)int處理來(lái)自客戶端的消息。getSocket()Socket獲得一個(gè)套接字。putChessman(Message msg)void處理玩家的下子信息。updateClient()void更新玩家列表。chatmessage(Message msg)void處理對(duì)戰(zhàn)的兩玩家的聊天信息。 服務(wù)器端主體流程圖()客戶端消息doMessage(),處理來(lái)自客戶端的消息,判斷消息類型23==3=2457121921136putChessman(msg) denyRequest(msg)acceptRequest(msg)checkVictory(msg)setting(msg, flag)playerRefresh(msg) chatmessage(msg) setting(msg, flag) checkVictory(msg)requestAnother(msg 輸出消息到各客戶端圖 服務(wù)器端主體流程圖 程序模塊功能說(shuō)明表5程序模塊功能說(shuō)明類 名功 能 說(shuō) 明BoardPanel畫出棋盤,處理棋盤事件ChessWZQ客戶端主程序,處理客戶端與服務(wù)器端的消息傳送Group定義一個(gè)對(duì)戰(zhàn)玩家組Player初始化一個(gè)玩家信息Server初始化服務(wù)器端的監(jiān)聽程序Message客戶端與服務(wù)器端傳送的消息對(duì)象ServerOneClient服務(wù)器端的主體程序,處理與客戶端的交互,轉(zhuǎn)發(fā)請(qǐng)求InetAddressTest用于初始化服務(wù)器端的IP地址址信息。2.玩家選擇白色棋子,對(duì)方則自動(dòng)選擇黑色棋子,棋子選色測(cè)試成功。4.在聊天窗口中輸入信息,對(duì)方玩家可以收到自己發(fā)的信息,自己也可以收到對(duì)方玩家輸入的信息,聊天窗口測(cè)試成功。6.點(diǎn)擊Create中的play with people 則系統(tǒng)提示在玩家列表中選擇玩家進(jìn)行游戲,Create菜單測(cè)試成功。5.2 系統(tǒng)性能分析 ,玩家名字可以立即出現(xiàn)在服務(wù)器端的玩家列表中,由此可知客戶端與服務(wù)器的連接速度良好。 由些可以測(cè)定系統(tǒng)對(duì)各方面的性能響應(yīng)要求良好,符合需求分析的要求。在日本和韓國(guó),電子游戲已經(jīng)相繼超過(guò)以汽車制造為代表的傳統(tǒng)制造業(yè)而成為國(guó)民經(jīng)濟(jì)主導(dǎo)產(chǎn)業(yè)之一。根據(jù)市場(chǎng)預(yù)測(cè),從2001年到2005年,美國(guó)的網(wǎng)絡(luò)游戲收入將會(huì)以每年50%的速度遞增。國(guó)內(nèi)網(wǎng)站方面,網(wǎng)易、新浪、搜狐、21CN、騰訊、TOM等紛紛進(jìn)軍網(wǎng)絡(luò)游戲。2003年將繼續(xù)成倍增加。通過(guò)本程序的開發(fā)我掌握了很多JAVA應(yīng)用方面的知識(shí),加深了對(duì)計(jì)算機(jī)網(wǎng)絡(luò)編程的了解。在程序的實(shí)現(xiàn)過(guò)程中,她的指導(dǎo)使我對(duì)網(wǎng)絡(luò)游戲和計(jì)算機(jī)網(wǎng)絡(luò)編程的認(rèn)識(shí)更加深刻,對(duì)人工智能的講解對(duì)我來(lái)說(shuō)是全新的,非常有吸引力的。感謝系里領(lǐng)導(dǎo)為我們學(xué)生畢業(yè)設(shè)計(jì)過(guò)程中提供的各種方便、理解與支持。感謝JAVA中文論壇中開展的討論,我在那里學(xué)到了許多關(guān)于JAVA網(wǎng)絡(luò)編程方面的知識(shí),在寫論文的過(guò)程中和程序?qū)崿F(xiàn)上遇到疑問(wèn)的時(shí)候,從那里也得到了很多啟發(fā)。是他們的鼓勵(lì)和熱心幫助讓我順利的完成了設(shè)計(jì)任務(wù)。/** * message list * type = 1 // request of connected,msg = connector39。s player list * type = 10// response for message type ==1 * type = 11// play with a player,msg save player39。 // message type ,=request of connection boolean setting。 // chessman color ,1 = black ,2 = white boolean forYourTurn。s turn int coordinateX。 // record the coordinate Y from 0~14 ,save black or white char[] msg。 msg = new char[50]。public class Player { String self=null。 boolean setting = false。 public Player(){}}Grou