版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、SANY 標(biāo)準(zhǔn)化小組 #QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#隨著汁算機(jī)技術(shù)的不斷發(fā)展,網(wǎng)絡(luò)技術(shù)的普及范用越來越廣,網(wǎng)絡(luò)能夠提供的服務(wù) 多樣、便捷,已經(jīng)成為人們生產(chǎn)生活中不可缺少的重要組成部分。如今網(wǎng)絡(luò)休閑游戲發(fā) 展迅速,它憑借健康、方便、互動(dòng)性強(qiáng)、益智等諸多優(yōu)點(diǎn),成為大部分現(xiàn)代人休閑娛樂 的首選。網(wǎng)絡(luò)五子棋游戲是使用JaVa語言開發(fā)的一款游戲。它使用SOCKET建立連接,多線 程處理數(shù)據(jù),以及可嵌入網(wǎng)絡(luò)瀏覽器的APPLET作為客戶端,這些特點(diǎn)使這款游戲無論 是服務(wù)器還是客戶端的實(shí)現(xiàn)都相對(duì)容易。通過對(duì)該軟件的編寫,還可以鞏固學(xué)生對(duì)以上 各種知識(shí)的掌握和理解。2 JAVA語言
2、概述JAVA簡(jiǎn)介JAVA是SUn MiCrOSyStenl公司開發(fā)的編程語言,是一個(gè)簡(jiǎn)單,面向?qū)ο?,分?式,解釋性,強(qiáng)壯,安全,與系統(tǒng)無關(guān),可移植,高性能,多線程和動(dòng)態(tài)的語言。JAVA的基本特點(diǎn)(1) 簡(jiǎn)單性JaVa與C+語言非常相近,但JaVa比C+簡(jiǎn)單,它拋棄了 C+中的一些不是絕 對(duì)必要的功能,如頭文件、預(yù)處理文件、指針、結(jié)構(gòu)、運(yùn)算符重載、多重繼承以及 自動(dòng)強(qiáng)迫同型。JdVa實(shí)現(xiàn)了自動(dòng)的垃圾收集,簡(jiǎn)化了內(nèi)存管理的工作。(2) 面向?qū)ο驤aVd提供了簡(jiǎn)單的類機(jī)制和動(dòng)態(tài)的構(gòu)架模型。對(duì)象中封裝了它的狀態(tài)變量和方 法,很好地實(shí)現(xiàn)了模塊化和信息隱藏;而類則提供了一類對(duì)象的原型,通過繼承和 重載機(jī)
3、制,子類可以使用或重新定義父類或超類所提供的方法,從而既實(shí)現(xiàn)了代碼 的復(fù)用,又提供了一種動(dòng)態(tài)的解決方案。(3) 多線程多線程使應(yīng)用程序可以同時(shí)進(jìn)行不同的操作,處理不同的事件。在多線程機(jī)制 中,不同的線程處理不同的任務(wù),他們之間互不干涉,不會(huì)由于一處等待影響其他 部分,這樣容易實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時(shí)交互操作。(4) 分布性JaVd是面向網(wǎng)絡(luò)的語言。通過它提供的類庫可以處理TCP/IP協(xié)議,用戶可以 通過URL地址在網(wǎng)絡(luò)上很方便的訪問其他對(duì)象。(5) 體系結(jié)構(gòu)中立JaVd是一種網(wǎng)絡(luò)語言,為使JaVd程序能在網(wǎng)絡(luò)的任何地方運(yùn)行,Jdvd解釋器 生成與體系結(jié)構(gòu)無關(guān)的字節(jié)碼結(jié)構(gòu)的文件格式。為了使JaVa的應(yīng)用
4、程序能不依賴于 具體的系統(tǒng),JaVa語言環(huán)境還提供了用于訪問底層操作系統(tǒng)功能的類組成的包,當(dāng) 程序使用這些包時(shí),可以確保它能運(yùn)行在各種支持JdVd的平臺(tái)上。(6) 安全性用于網(wǎng)絡(luò)、分布環(huán)境下的JdVd必須要防止病毒的入侵,JaVa不支持指針,一 切對(duì)內(nèi)存的訪問都必須通過對(duì)象的實(shí)例變量來實(shí)現(xiàn),這樣就防止了程序員使用欺騙 手段訪問對(duì)象的私有成員,同時(shí)也避免了指針操作中容易產(chǎn)生的錯(cuò)誤。JaVa中輸入/輸出流概念過濾流 DatalnPUtStream 和 DataOUtPUtStreanl 除了分別作為 FiIterlnPUtStreaIn 和 FiIterOUtPUtStream 的子類外,還分別實(shí)
5、現(xiàn)了接口 DatalnPUt和DataOUtPUto接口 DatalnPUt中定義的方法主要包括從流中讀取基本 類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長(zhǎng)度的字節(jié)數(shù),如readBoolean(). readlnt () readLine () readFully ()等。接I 1 DataOUtPUt 中定義的方法主要是向 流中寫入基本類型的數(shù)據(jù)或者寫入一定長(zhǎng)度的字節(jié)數(shù)組,如writeChdr()、 WriteDOUbIe ()。DatalnPUtStreain可以從所連接的輸入流中讀取與機(jī)器無關(guān)的基 本類型數(shù)據(jù),用以實(shí)現(xiàn)一種獨(dú)立于具體平臺(tái)的輸入方式;DataOUtPUtStreain可以向 所
6、連接的輸出流寫入基本類型的數(shù)據(jù)。SOCket機(jī)制SOCket是面向客戶/服務(wù)器模型設(shè)計(jì)的,網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通 訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)SOCketO SOCket通常用來 實(shí)現(xiàn)客戶方和服務(wù)方的連接。客戶程序可以向SOCket寫請(qǐng)求,服務(wù)器將處理此請(qǐng) 求,然后通過SOCket將結(jié)果返回給用戶。SOCket通信機(jī)制提供了兩種通訊方式:有聯(lián)接和無聯(lián)接方式,分別面向不同的 應(yīng)用需求。使用有聯(lián)接方式時(shí),通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在 該方式下,通信雙方必須創(chuàng)建一個(gè)聯(lián)接過程并建立一條通訊鏈路,以后的網(wǎng)絡(luò)通信 操作完全在這一對(duì)進(jìn)程之間進(jìn)行,通信完畢關(guān)閉此聯(lián)
7、接過程。使用無聯(lián)接方式時(shí)其 系統(tǒng)開銷比無聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報(bào)服務(wù),不能保證信源 所傳輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)建一個(gè)聯(lián)接過程和 建立一條通訊鏈路,網(wǎng)絡(luò)通信操作在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。應(yīng)用程序相對(duì)容易。JAVA支持流套接字(Stredm SOCket)和數(shù)據(jù)報(bào)套接字(datagram SOCket)。流套接字使用 TCP (TranSmiSSiOn COntrOI Protocol,傳 輸控制協(xié)議)進(jìn)行數(shù)據(jù)傳輸,而數(shù)據(jù)報(bào)套接字使用UDP (USer Datagram PrOtOCol,用戶數(shù)據(jù)報(bào)協(xié)議)。在SOCket層實(shí)現(xiàn)的JaVa網(wǎng)絡(luò)程序
8、是嚴(yán)格同步的。從一臺(tái)機(jī)器發(fā)送數(shù)據(jù)的操作 要求對(duì)應(yīng)一個(gè)從其他機(jī)器接受數(shù)據(jù)的操作。JAVA工具JDK1) JaVd編譯器JaVa編譯器將JaVa源代碼文件編譯成可執(zhí)行的JaVa字節(jié)碼。兀眩源代碼文件的擴(kuò) 展名為.java, JaVa編譯器把這種擴(kuò)展名的文件編譯成擴(kuò)展名為.class的文件。源 文件中的每個(gè)類在編譯后都將產(chǎn)生一個(gè)CIaSS文件,這意味一個(gè)JaVa源代碼文件可 能編譯生成多個(gè)CIaSS文件。2) JaVa解釋器JaVa解釋器對(duì)編譯生成的字節(jié)碼格式的可執(zhí)行程序的運(yùn)行提供支持,它是運(yùn)行非圖 形Java程序的命令行工具。3程序的設(shè)計(jì)思路和算法人機(jī)博弈的要點(diǎn)人機(jī)對(duì)弈的程序,至少應(yīng)具備以下5個(gè)部
9、分:(1) 某種在機(jī)器中表示棋局的方法,能夠讓程序知道博弈的狀態(tài)。(2) 產(chǎn)生合法走法的規(guī)則,以使憚弈公正地進(jìn)行,并可判斷人類對(duì)手是否亂走。(3) 從所有合法的走法中選擇最佳的走法技術(shù)。(4) -種評(píng)佔(zhàn)局面優(yōu)劣的方法,用以同上面的技術(shù)配合做出智能的選擇。(5) 個(gè)界面,有了他,這個(gè)程序才能用。五子棋特點(diǎn)及規(guī)則五子棋的娛樂性強(qiáng)、規(guī)則簡(jiǎn)單、易學(xué)、流行性廣。普通人不需長(zhǎng)時(shí)間專門訓(xùn)練即可 自如行棋。因此極受大眾歡迎。五子棋的規(guī)則為:(1) 棋盤 采用像圍棋盤一樣的13路或19路線的棋盤,在此采用19路的棋盤。(2) 下法兩人分別執(zhí)黑白兩色棋子。輪流在棋盤上選擇一個(gè)無子的交義點(diǎn)落子, 無子的交叉點(diǎn)乂被稱
10、為空點(diǎn)。(3) 輸贏判斷 黑、口雙方有一方的五個(gè)棋子在橫、豎或斜方向上連接成一線即為 該方贏。算法設(shè)計(jì)博弈樹的搜索過程在以下討論中,命名2個(gè)博弈者M(jìn)AX和MIN。下面的任務(wù)是為MAX找最佳的移動(dòng)。假設(shè)MAX先移動(dòng),然后2個(gè)博弈者輪流移動(dòng)。因此,深度為偶數(shù)的節(jié)點(diǎn),對(duì)應(yīng)于MAX下 一步移動(dòng)的位置,稱為MAX節(jié)點(diǎn);深度為奇數(shù)的節(jié)點(diǎn)對(duì)應(yīng)于MIN下一步移動(dòng)的位置,稱 為MIN節(jié)點(diǎn)(博弈樹的頂節(jié)點(diǎn)深度為0)。k層包括深度為2k和2k+l的節(jié)點(diǎn)。通常用層 數(shù)表示博弈樹的搜索深度,他可以表示出向前預(yù)測(cè)的必須認(rèn)識(shí)到搜索到終點(diǎn)是不可能的 (除了在ft?弈快結(jié)束時(shí)),所以,常采用在有限范圍搜索方法。這里使用啟發(fā)式搜
11、索。在 啟發(fā)式搜索的過程中,關(guān)鍵的一步是如何確定下一個(gè)要考察的節(jié)點(diǎn),在確定節(jié)點(diǎn)時(shí)只要 能充分利用與問題有關(guān)的信息,佔(zhàn)汁出節(jié)點(diǎn)的重要性,就能在搜索時(shí)選擇重要性較高的 節(jié)點(diǎn),以利于博弈者以較快的速度求出最佳的棋步。.2采用靜態(tài)評(píng)估函數(shù)這里用評(píng)估函數(shù)h(i)衡量每一個(gè)葉節(jié)點(diǎn)位置的“值”。一個(gè)最佳首步可以由一個(gè) 最小最大化過程產(chǎn)生。假設(shè)輪到MAX從搜索樹的葉節(jié)點(diǎn)中選取,他肯定選擇擁有最大值 的節(jié)點(diǎn)。因此,MI葉節(jié)點(diǎn)的一個(gè)MAX節(jié)點(diǎn)雙親的倒推值就等于葉節(jié)點(diǎn)的靜態(tài)評(píng)估值中的最大值。另一方面,MI從葉結(jié)點(diǎn)中選取時(shí),必須選取最 小的節(jié)點(diǎn)(即最負(fù)的值)。既然如此,MAX葉節(jié)點(diǎn)的MI雙親節(jié)點(diǎn)被分配一個(gè)倒推值,他
12、等于葉節(jié)點(diǎn)靜態(tài)評(píng)佔(zhàn)值的最小值。在所有葉節(jié)點(diǎn)的父節(jié)點(diǎn)被賦予倒推值后,開始倒推另 一層,假定MAX將選擇有最大倒推值的MIN的后繼節(jié)點(diǎn),而MIN會(huì)選擇有最小倒推值的 MAX后繼節(jié)點(diǎn)。繼續(xù)逐層對(duì)節(jié)點(diǎn)評(píng)估,直到最后開始節(jié)點(diǎn)的后繼者被賦予倒推值。MAX 將選擇有最大倒推值的節(jié)點(diǎn)作為他的首步。整個(gè)過程的有效性基于這樣的假設(shè)。用整個(gè) 棋盤佔(zhàn)值的函數(shù)h(n)為靜態(tài)估值函數(shù)。設(shè)想當(dāng)前棋局S為輪到訃算機(jī)方下棋(用表 示),任選一空點(diǎn)作為計(jì)算機(jī)方的下棋位置(可有若干種選擇),接著考慮在此悄況下游 戲者一方下棋的棋局(用O表示);從某一 “0”棋局出發(fā),任選一空點(diǎn)作為游戲者一方 的落子處(乂有若干種選擇),再次形成訃
13、算機(jī)方下棋的“ ”棋局;依此類推,這樣 可形成一棵以S為根結(jié)點(diǎn)的博弈樹,該樹以0棋局為第2層子結(jié)點(diǎn),以棋局為第3層子 結(jié)點(diǎn)等等。如果繼續(xù)向前搜索,可形成多層子結(jié)點(diǎn),現(xiàn)在以向前搜索3層子結(jié)點(diǎn)為例來 說明極大極小值的過程。對(duì)第3層子結(jié)點(diǎn)的某一棋局n,求出其估計(jì)值h(n),假設(shè)有一 博弈樹已形成,如圖1所示,h(n)的值山各結(jié)點(diǎn)旁的數(shù)值給出。根據(jù)極小極大化分析法,先計(jì)算第3層子結(jié)點(diǎn)h(n)值,然后笫2層子結(jié)點(diǎn)的估計(jì)值 取他的各后繼子結(jié)點(diǎn)的極小值,根結(jié)點(diǎn)的佔(zhàn)計(jì)值取他的各子結(jié)點(diǎn)的極大值。這個(gè)取得最 大估計(jì)值的子結(jié)點(diǎn)即為從S出發(fā)的計(jì)算機(jī)方的最佳落子方案。棋盤上某一行、某一列或某一對(duì)角線為一路,這里使用的棋
14、盤為19行19列,因此, 行和列方向上共有1919 = 38路;從左下到右上方向的對(duì)角線有37路,同樣,從左上 到右下方向的對(duì)角線也有37路。但對(duì)于五子棋來說必須在一條直線上有連續(xù)五個(gè)棋子 才能贏。因此,在對(duì)角線上就可以減少8路。所以,整個(gè)棋盤路的總數(shù)為:T-=38(57-8)(37-8) =96 路對(duì)某一棋局n,第i路得分:h(i) =he(i) h=(i)。其中:h(i)為計(jì)算機(jī)方在第i路估計(jì)值得分,ha(i)為游戲者一方在第i路得分。對(duì)的 得分規(guī)則作如下說明。規(guī)則中+代表一空點(diǎn);。代表對(duì)方棋子;*代表有計(jì)算機(jī)方棋 子;+表示連續(xù)2點(diǎn)為空點(diǎn);+ + +*+表示連續(xù)3個(gè)空點(diǎn)接一個(gè)計(jì)算機(jī)方棋子
15、, 再接兩空點(diǎn)。某一規(guī)則+ 表示如在i路上有棋子構(gòu)成形如+ + +*+ +則h(i) = 30o其他規(guī)則表示相同。在系統(tǒng)中使用的主要估值規(guī)則如下:曲對(duì)稱性可知+ + * *+ + +和+ + +* + +的估值相同,同理可得其他具有這樣 對(duì)稱性的佔(zhàn)值都認(rèn)為是相等的。在連續(xù)兩路上出現(xiàn)的悄形=hc(i)=5 000,-路出現(xiàn) (3),另外一路出現(xiàn)(4)=hc(i)=5 OOOo所以在整個(gè)棋盤上的總估值為:An) - . = 30(Z) + + * =A.( )00t3 +=5A.G,=3OO(4)0 +-AjG) = 3005) * 4-=*,= I 000 ) = 10 W傳算法同傳統(tǒng)的算法相比
16、可以同時(shí)維護(hù)兒組較好的參數(shù),通過向其中添加一組新參數(shù), 通常是將兒組老參數(shù)中選出的值組合在一起做一點(diǎn)變化。然后同兒組老的參數(shù)比較孰優(yōu) 孰劣,將最差的一組從中去除。這里面較重要的操作是交義和變異操作。交義通過隨機(jī) 交換父代個(gè)體的信息來繼承已有參數(shù)中的優(yōu)良內(nèi)容;變異通過隨機(jī)改變個(gè)體中的基因而 增加種群的多樣性,避免優(yōu)化的因局部震蕩而失敗。可以將遺傳算法的優(yōu)化佔(zhàn)值參數(shù)的過程用圖2表示。遺傳算法的優(yōu)點(diǎn):(1) IlI于搜索算法是從問題的解開始的,而不是一組參數(shù)。所以被局部震蕩干擾導(dǎo) 致求最優(yōu)解失敗的可能性大大減小。(2) 此算法能將搜索重點(diǎn)集中于性能高的部分,能較快地求出最佳的參數(shù)。 在使用中應(yīng)當(dāng)注意
17、的問題如下:種群數(shù)Ll這是影響算法性能的重要因素。種群數(shù)Ll過大,會(huì)導(dǎo)致運(yùn)算時(shí)間太長(zhǎng), 結(jié)果收斂緩慢;種群數(shù)目太小則可能導(dǎo)致算法精度過低,甚至停止不前。交叉概率這個(gè)用于控制交義操作的頻度。此概率過大會(huì)導(dǎo)致種群中的個(gè)體更新過 快,較優(yōu)的個(gè)體不能穩(wěn)定的保持和傳遞信息;此概率過小則會(huì)使優(yōu)化的過程緩慢其至停 止不前。變異概率這個(gè)概率用于控制產(chǎn)生變異個(gè)體的頻度,目的是防止整個(gè)種群中任意參 數(shù)的兒個(gè)基因保持不變。一般使用一個(gè)很小的概率即足以達(dá)成此任務(wù);概率太大則遺 傳信息無法穩(wěn)定傳遞,從而使優(yōu)化過程變成隨機(jī)過程,失去確切的方向而導(dǎo)致失敗。 4程序?qū)崿F(xiàn)程序設(shè)計(jì)思路實(shí)現(xiàn)一個(gè)用戶可以Internet上任何地方的
18、不同機(jī)上進(jìn)行游戲,使用多線程和網(wǎng)絡(luò) 套接字?jǐn)?shù)據(jù)流的分布式五子棋游戲,根據(jù)要完成的功能,本程序采用多客戶服務(wù)方式。 服務(wù)器創(chuàng)建服務(wù)器Socket,始終處于監(jiān)聽等待狀態(tài)??蛻舳耸莿?dòng)作的發(fā)起者,何時(shí)發(fā)出 申請(qǐng)山客戶端決定。客戶端向服務(wù)器發(fā)出申請(qǐng),服務(wù)器給予響應(yīng),客戶端發(fā)出申請(qǐng)后立 即可從SOCket通道去取服務(wù)方的結(jié)果。服務(wù)器接受兩個(gè)客戶端連接后開始一個(gè)線程, 不斷接受客戶端發(fā)來的數(shù)據(jù),并把處理后的數(shù)據(jù)傳送給客戶端。服務(wù)器可以創(chuàng)建任意多 局(圖3-1) o服務(wù)圖3-1系統(tǒng)框架Frame Of SyStem在對(duì)服務(wù)器與客戶端的設(shè)計(jì)開發(fā)之前,為了使開發(fā)方便,將服務(wù)器與客戶端之間用以通信的變量規(guī)定好。通過
19、編寫一個(gè)接口 GanleCOnStant(),在其中定義各個(gè)常量的值:PUbliCStatiCintPUbliCStatiCintPUbIiCStatiCIntPUbIiCStatiCIntPUbIiCStaticintPUbliCStatiCintPUbliCStatiCintPUbliCStatiCintPLAYERI 二 1;PLAYER2 二 2;PLAYERI_WON = 1;PLAYER2_WON = 2;DRAW 二 3;CONTlNUE = 4;STOP = 100;GAMEPORT = 8000;服務(wù)器和客戶端在設(shè)汁時(shí)繼承接口 GaIneCOnStant ()里面的所有數(shù)據(jù)。
20、服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)為了使界面友好,服務(wù)器使用圖形組件,創(chuàng)建成一個(gè)可以顯示游戲信息的框架。在 框架中創(chuàng)建一個(gè)包含文本區(qū)的滾動(dòng)窗格,并在文本區(qū)顯示游戲信息(圖3-2) o 圖3-2服務(wù)器界面InterfaCe Of Game-SerVer要建立服務(wù)器,需要?jiǎng)?chuàng)建一個(gè)服務(wù)器Socket,并把它附加到一個(gè)端口上,服務(wù)器通 過這個(gè)端口監(jiān)聽連接請(qǐng)求。端口標(biāo)識(shí)SOCket上的TCP服務(wù)。網(wǎng)絡(luò)的類存放在包中,引 入包后通過實(shí)現(xiàn)一個(gè)SerVerSOCket的實(shí)例就可以創(chuàng)建一個(gè)服務(wù)器Socket,并把它附加 到一個(gè)端口 (GAMEPORT)上:SerVerSOCket SerVerSOCket = new SerV
21、erSOCket (GAMEPORT);然后,服務(wù)器使用下列語句開始監(jiān)聽連接請(qǐng)求:SOCket PlayerI =();SOCket PIayer2 =();服務(wù)器開始等待,直到客戶提出連接請(qǐng)求。連接建立后,服務(wù)器通過數(shù)據(jù)輸入流從 客戶端接收信息,并且通過數(shù)據(jù)輸出流把相應(yīng)的標(biāo)記發(fā)送給客戶端。new DataOUtputStream(). Writelnt(PLAYERl);new DataOUtPUtStream(). Writelnt(PLAYER2);當(dāng)客戶端滿足開局條件時(shí),就開啟一個(gè)線程處理客戶之間數(shù)據(jù),同時(shí)繼續(xù)監(jiān)聽其它 客戶端的連接請(qǐng)求。多線程是JaVa的一個(gè)特點(diǎn),多線程可以使程序反應(yīng)
22、更快、交互性更強(qiáng),并能提高 執(zhí)行效率。創(chuàng)建一個(gè)新的線程的生命周期如下狀態(tài):新建,就緒,運(yùn)行,阻塞,死亡。在JaVd中,提供了多種控制線程的方法,在服務(wù)器中用到的主要以下兒種: PUbIiC VOid run ()JaVa運(yùn)行系統(tǒng)調(diào)用這個(gè)方法來執(zhí)行線程。在用戶線程類中,必須覆蓋這個(gè) 方法并且提供線程執(zhí)行的代碼。PUbIiC VOid Start ()該方法啟動(dòng)線程,它引起對(duì)run()方法的調(diào)用??蛻纛愔械目蛇\(yùn)行對(duì)象調(diào)用 該方法。服務(wù)器程序采用類HandIeGame繼承Thread類來實(shí)現(xiàn)對(duì)線程的調(diào)用,同時(shí)對(duì)run () 方法覆蓋。以下是HandIeGame ()類里面主要的數(shù)據(jù)域和方法:PriV
23、ate char cell: Chdr類型數(shù)組用來記錄玩家的標(biāo)記。PriVate DatalnPUtStream iSFromPlayerl;PriVate DdtdOUtPUtStrearn OSTOPIayerI;PriVate DdtdlnputStream isFromPlayer2;PriVate DdtautputStream OSTOPIayer2;:四個(gè)數(shù)據(jù)流用來實(shí)現(xiàn)與兩個(gè)玩家之間信息的傳遞。PUbliC HandIeGame (SOCket PIayer1, SOCket PIayer2):構(gòu)造函數(shù),兩個(gè)參數(shù)用以接收傳遞過來的SOCket對(duì)象。PUbliC VOid run(
24、):對(duì)繼承Thread類中的run ()方法進(jìn)行覆蓋。PriVate boolean isFull ():判斷是否滿格。PriVate boolean ISWOn(int row, int column, Char token): 判斷新標(biāo)記的單元格是否使一方獲勝。游戲局一旦建立起來,服務(wù)器便于工作交替地從客戶端那里接收數(shù)據(jù)。從客戶端接 收到數(shù)據(jù)后,服務(wù)器判斷游戲狀態(tài),并根據(jù)結(jié)果進(jìn)行相關(guān)操作,直至游戲結(jié)束??蛻舳说脑O(shè)計(jì)與實(shí)現(xiàn)客戶端負(fù)責(zé)與玩家的交互。因此要?jiǎng)?chuàng)建一個(gè)界面,包括一個(gè)20*20的下棋區(qū)域,當(dāng) 玩家選定單元格或接收到別的玩家選定的單元格時(shí),用不同的標(biāo)記顯示;兩個(gè)顯示游戲 名稱和游戲狀態(tài)的
25、標(biāo)簽和兩個(gè)菜單欄上的按鍵用以進(jìn)行控制,如圖3-3: 圖3-3客戶端界面InterfaCe Of Game-CIient這里客戶程序設(shè)計(jì)成一個(gè)JaVa Applet,用戶可以在Web瀏覽器里運(yùn)行。當(dāng)用戶打開文件時(shí),瀏覽器調(diào)用init ()方法對(duì)界面進(jìn)行初始化。點(diǎn)擊Stdrt時(shí)開啟一個(gè)線 程和服務(wù)器連接,通過數(shù)據(jù)流進(jìn)行數(shù)據(jù)交換。COnneCtTOSerVer = new SOCket (ZZIOCaIhOSGAMEPORT):i SFromServer = new DatalnPUtStreamo);OSTOSerVer = new DataOUtPUtStreamo);下面是類GameClien
26、t的主要方法和數(shù)據(jù):PUbliC CIaSS GameCIient extends JAPPIetimplements Runnable, ActionListener, GameCOnStantSPriVate boolean my Turn = false; :標(biāo)記是否輪到自己下棋 PriVate Char myToken =,;: 標(biāo)記自己的棋子PriVate Char OtherTOken =,;:標(biāo)記對(duì)手的棋子PriVate CelI CelI = new Cell 20 20;:生成 20*20 個(gè)單元格PriVate int rowSelected; :記錄所選單元格的行PriV
27、ate int COIUmnSeIeCted;:記錄所選單元格的列PriVate boolean COntinUeTOPIay = true;PriVate boolean Wditing = true;:記錄游戲進(jìn)行中的狀態(tài)PUbliC VOid init ():初始化用戶界面,打開網(wǎng)頁時(shí)由瀏覽器調(diào)用PUbliC VOid actiOnPerfOrmed(ACtiOnEVent e):覆蓋ACtiOnLiStener接口里面actionPerformed ()方法,用來處理用戶 點(diǎn)擊菜單欄引起的操作。PUbIiC VOid run()覆蓋RUnnable接口里的run ()方法,用以對(duì)游戲過
28、程中的數(shù)據(jù)傳輸,處 理,控制。在客戶程序的類中,由于它繼承了 APPIet類,所以不能再通過聲明Thread類的擴(kuò) 展來實(shí)現(xiàn),只能通過實(shí)現(xiàn)JaVa提供的一個(gè)RUnnabIe接口,進(jìn)行線程的創(chuàng)建和運(yùn)行。RUnnabIe接口的實(shí)現(xiàn)是非常簡(jiǎn)單的,它只包含run ()方法,使用時(shí)只要將該方法覆 蓋。從游戲設(shè)計(jì)來看,單元格是處理鼠標(biāo)點(diǎn)擊事件和顯示標(biāo)記的GUl對(duì)象。在這里使用 的是面板,設(shè)置單元格CeII為JPaneI的子類。將CeII類聲明為內(nèi)部類,可以直接使 用GameCIient類中定義的變量與方法,使程序簡(jiǎn)潔明了。CelI類中包含以下主要數(shù)據(jù)和方法:PUbIiC CIaSS CelI extend
29、s JPaneI implements MOUSeLiStenerPriVate int row;PriVate int column;PriVate Char token =;PUbIiC Cell (int row, int COIUmn) :構(gòu)造函數(shù)PUbliC VOid PaintCOmPOnent(GraPhiCS g) :GraPhiCS對(duì)象g是山JdVd運(yùn)行系統(tǒng)自動(dòng)創(chuàng)建,這個(gè)對(duì)象控制信息的繪制方式。可以使用定義在GraPhiCS類中的多種畫法繪制字符串的兒何圖形。PUbIiC VOid mousedicked(MOUSeEVent e)PUbIiCPUbIiCVOid mouse
30、Exited(MouseEvent e)VOid mouseEntered(MOUSeEVent e)PUbIiC VOid mouseReleased(MOUSeEVent e)PUbIiC VOid mousePressed(MOUSeEVent e):接口 MOUSeLiStener 中的方法。程序的運(yùn)行首先將編寫好的程序使用JaVd編譯器編譯,生成以CIaSS為擴(kuò)展名的類文件,然 后使用JaVd解釋器分別運(yùn)行服務(wù)器和客戶端??蛻舳税l(fā)出連接,服務(wù)器接收后開啟線 程對(duì)游戲進(jìn)行控制,游戲結(jié)束時(shí)關(guān)閉線程。具體流程如圖3-4所示:玩家一1. 初始化用戶界面2. 向服務(wù)器請(qǐng)求連 接,并從服務(wù)器獲 知所用棋子的標(biāo) 記。3 從服務(wù)器得到開始 標(biāo)志。4等待玩家標(biāo)記單元 格并向服務(wù)器發(fā) 送爪元格的行號(hào)和 列號(hào)。.從服務(wù)器接收游戲 狀態(tài)。6. 如果狀態(tài)是WIN, 顯示是勝者,如果 玩家二獲勝,接收 玩家二的最后一步 走棋信息。中斷循 環(huán)。7. 如果狀態(tài)是DRAW, 顯示游戲結(jié)束,中 斷循環(huán)。8如果狀態(tài)是CONTINUE-接收玩 家二
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 石河子大學(xué)《西方法律思想史》2021-2022學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《生態(tài)工程學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《基礎(chǔ)工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《電子技術(shù)》2022-2023學(xué)年期末試卷
- 沈陽理工大學(xué)《信號(hào)變換》2021-2022學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《計(jì)算機(jī)網(wǎng)絡(luò)與通信》2022-2023學(xué)年期末試卷
- 溫病息風(fēng)止痙法
- 消毒設(shè)備維護(hù)管理
- 沈陽理工大學(xué)《光纖傳感技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣告合同高空作業(yè)免責(zé)協(xié)議書
- 發(fā)現(xiàn)生活中的美-完整版PPT
- 小學(xué)道德與法治人教三年級(jí)上冊(cè)第三單元安全護(hù)我成長(zhǎng)-《遭遇陌生人》教案
- CAMDS操作方法及使用技巧
- 平狄克《微觀經(jīng)濟(jì)學(xué)》(第8版)筆記和課后習(xí)題詳解
- 最優(yōu)化理論與算法課程教學(xué)大綱
- 2022年湖北省武漢市江岸區(qū)育才第二小學(xué)六上期中數(shù)學(xué)試卷
- (最新版)中小學(xué)思政課一體化建設(shè)實(shí)施方案三篇
- PSA提氫裝置操作規(guī)程
- 水工隧洞概述(67頁清楚明了)
- 計(jì)算機(jī)維修工技能考核試卷
- 2020年四川省德陽市高三一診考試地理試卷(Word版,含答案)
評(píng)論
0/150
提交評(píng)論