版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1前言跟著計(jì)算機(jī)技術(shù)的不停發(fā)展,網(wǎng)絡(luò)技術(shù)的普及范圍愈來愈廣,網(wǎng)絡(luò)能夠供給的服務(wù)多樣、便利,已經(jīng)成為人們生產(chǎn)生活中不行缺乏的重要構(gòu)成部分。此刻網(wǎng)絡(luò)休閑游戲發(fā)展快速,它依靠健康、方便、互動(dòng)性強(qiáng)、益智等諸多長處,成為大多半現(xiàn)代人休閑娛樂的首選。網(wǎng)絡(luò)五子棋游戲是使用Java語言開發(fā)的一款游戲。它使用SOCKET成立連結(jié),多線程辦理數(shù)據(jù),以及可嵌入網(wǎng)絡(luò)閱讀器的APPLET作為客戶端,這些特色使這款游戲不論是服務(wù)器仍是客戶端的實(shí)現(xiàn)都相對(duì)簡單。經(jīng)過對(duì)該軟件的編寫,還能夠穩(wěn)固學(xué)生對(duì)以上各樣知識(shí)的掌握和理解。2JAVA語言概括2.1JAVA簡介JAVA是SunMicrosystem企業(yè)開發(fā)的編程語言,是一個(gè)簡單
2、,面向?qū)ο螅⒉际?,解說性,強(qiáng)健,安全,與系統(tǒng)沒關(guān),可移植,高性能,多線程和動(dòng)向的語言。的基本特色簡單性Java與C+語言特別鄰近,但Java比C+簡單,它扔掉了C+中的一些不是絕對(duì)必需的功能,如頭文件、預(yù)辦理文件、指針、結(jié)構(gòu)、運(yùn)算符重載、多重繼承以及自動(dòng)逼迫同型。Java實(shí)現(xiàn)了自動(dòng)的垃圾采集,簡化了內(nèi)存管理的工作。面向?qū)ο驤ava供給了簡單的類體制和動(dòng)向的構(gòu)架模型。對(duì)象中封裝了它的狀態(tài)變量和方法,很好地實(shí)現(xiàn)了模塊化和信息隱蔽;而類則供給了一類對(duì)象的原型,經(jīng)過繼承和重載體制,子類能夠使用或從頭定繼父類或超類所供給的方法,進(jìn)而既實(shí)現(xiàn)了代碼的復(fù)用,又供給了一種動(dòng)向的解決方案。多線程多線程使應(yīng)用程序
3、能夠同時(shí)進(jìn)行不一樣的操作,辦理不一樣的事件。在多線程體制中,不一樣的線程辦理不一樣的任務(wù),他們之間互不干預(yù),不會(huì)因?yàn)橐惶幍群蛴绊懫溆嗖糠?,這樣簡單實(shí)現(xiàn)網(wǎng)絡(luò)上的及時(shí)交互操作。散布性Java是面向網(wǎng)絡(luò)的語言。經(jīng)過它供給的類庫能夠辦理TCP/IP協(xié)議,用戶能夠經(jīng)過URL地點(diǎn)在網(wǎng)絡(luò)上很方便的接見其余對(duì)象。系統(tǒng)結(jié)構(gòu)中立Java是一種網(wǎng)絡(luò)語言,為使Java程序能在網(wǎng)絡(luò)的任何地方運(yùn)轉(zhuǎn),Java解說器生成與系統(tǒng)結(jié)構(gòu)沒關(guān)的字節(jié)碼結(jié)構(gòu)的文件格式。為了使Java的應(yīng)用程序能不依靠于詳細(xì)的系統(tǒng),Java語言環(huán)境還供給了用于接見基層操作系統(tǒng)功能的類構(gòu)成的包,當(dāng)程序使用這些包時(shí),能夠保證它能運(yùn)轉(zhuǎn)在各樣支持Java的平臺(tái)上
4、。安全性用于網(wǎng)絡(luò)、散布環(huán)境下的Java一定要防備病毒的入侵,Java不支持指針,全部對(duì)內(nèi)存的接見都一定經(jīng)過對(duì)象的實(shí)例變量來實(shí)現(xiàn),這樣就防備了程序員使用欺詐手段接見對(duì)象的私有成員,同時(shí)也防止了指針操作中簡單產(chǎn)生的錯(cuò)誤。中輸入/輸出流觀點(diǎn)過濾流DataInputStream和DataOutputStream除了分別作為FilterInputStream和FilterOutputStream的子類外,還分別實(shí)現(xiàn)了接口DataInput和DataOutput。接口DataInput中定義的方法主要包含從流中讀取基本種類的數(shù)據(jù)、讀取一行數(shù)據(jù)、或許讀取指定長度的字節(jié)數(shù),如readBoolean()、rea
5、dInt()、readLine()、readFully()等。接口DataOutput中定義的方法主假如向流中寫入基本種類的數(shù)據(jù)或許寫入必定長度的字節(jié)數(shù)組,如writeChar()、writeDouble()。DataInputStream能夠從所連結(jié)的輸入流中讀取與機(jī)器沒關(guān)的基本種類數(shù)據(jù),用以實(shí)現(xiàn)一種獨(dú)立于詳細(xì)平臺(tái)的輸入方式;DataOutputStream能夠向所連結(jié)的輸出流寫入基本種類的數(shù)據(jù)。體制Socket是面向客戶/服務(wù)器模型設(shè)計(jì)的,網(wǎng)絡(luò)上的兩個(gè)程序經(jīng)過一個(gè)雙向的通信連結(jié)實(shí)現(xiàn)數(shù)據(jù)的互換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket。Socket往常用來實(shí)現(xiàn)客戶方和服務(wù)方的連結(jié)??蛻舫绦蚰軌?/p>
6、向Socket寫懇求,服務(wù)器將辦理此懇求,而后經(jīng)過Socket將結(jié)果返回給用戶。Socket通信體制供給了兩種通信方式:有聯(lián)接和無聯(lián)接方式,分別面向不一樣的應(yīng)用需求。使用有聯(lián)接方式時(shí),通信鏈路供給了靠譜的,全雙工的字節(jié)流服務(wù)。在該方式下,通信兩方一定創(chuàng)立一個(gè)聯(lián)接過程并成立一條通信鏈路,此后的網(wǎng)絡(luò)通信操作完整在這一對(duì)進(jìn)度之間進(jìn)行,通信完成封閉此聯(lián)接過程。使用無聯(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ì)簡單。
7、JAVA支持流套接字(streamsocket)和數(shù)據(jù)報(bào)套接字(datagramsocket)。流套接字使用TCP(TransmissionControlProtocol,傳輸控制協(xié)議)進(jìn)行數(shù)據(jù)傳輸,而數(shù)據(jù)報(bào)套接字使用UDP(UserDatagramProtocol,用戶數(shù)據(jù)報(bào)協(xié)議)。在Socket層實(shí)現(xiàn)的Java網(wǎng)絡(luò)程序是嚴(yán)格同步的。從一臺(tái)機(jī)器發(fā)送數(shù)據(jù)的操作要求對(duì)應(yīng)一個(gè)從其余機(jī)器接受數(shù)據(jù)的操作。2.2JAVA工具JDK1)Java編譯器Java編譯器將Java源代碼文件編譯成可履行的Java字節(jié)碼。Java源代碼文件的擴(kuò)展名為.java,Java編譯器把這類擴(kuò)展名的文件編譯成擴(kuò)展名為.cla
8、ss的文件。源文件中的每個(gè)類在編譯后都將產(chǎn)生一個(gè)class文件,這意味一個(gè)Java源代碼文件可能編譯生成多個(gè)class文件。2)Java解說器Java解說器對(duì)編譯生成的字節(jié)碼格式的可履行程序的運(yùn)轉(zhuǎn)供給支持,它是運(yùn)轉(zhuǎn)非圖形Java程序的命令行工具。程序的設(shè)計(jì)思路和算法3.1人機(jī)博弈的重點(diǎn)人機(jī)棋戰(zhàn)的程序,起碼應(yīng)具備以下5個(gè)部分:某種在機(jī)器中表示棋局的方法,能夠讓程序知道博弈的狀態(tài)。產(chǎn)生合法走法的規(guī)則,以使博弈公正地進(jìn)行,并可判斷人類敵手能否亂走。從全部合法的走法中選擇最正確的走法技術(shù)。一種評(píng)估場(chǎng)面好壞的方法,用以同上邊的技術(shù)配合做出智能的選擇。一個(gè)界面,有了他,這個(gè)程序才能用。2五子棋特色及規(guī)則五
9、子棋的娛樂性強(qiáng)、規(guī)則簡單、易學(xué)、流行性廣。一般人不需長時(shí)間特意訓(xùn)練即可自如行棋。所以極受大眾歡迎。五子棋的規(guī)則為:棋盤采納像圍棋盤相同的15路或19路線的棋盤,在此采納19路的棋盤。下法兩人分別執(zhí)黑白兩色棋子。輪番在棋盤上選擇一個(gè)無子的交錯(cuò)點(diǎn)落子,無子的交錯(cuò)點(diǎn)又被稱為空點(diǎn)。勝敗判斷黑、白兩方有一方的五個(gè)棋子在橫、豎或斜方向上連結(jié)成一線即為該方贏。3.3算法設(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)的地點(diǎn),稱為MAX節(jié)點(diǎn);深度為奇數(shù)的節(jié)點(diǎn)對(duì)應(yīng)于MIN下
10、一步挪動(dòng)的地點(diǎn),稱為MIN節(jié)點(diǎn)(博弈樹的頂節(jié)點(diǎn)深度為0)。k層包含深度為2k和2k1的節(jié)點(diǎn)。往常用層數(shù)表示博弈樹的搜尋深度,他能夠表示出向前展望的一定認(rèn)識(shí)到搜尋到終點(diǎn)是不行能的(除了在博弈快結(jié)束時(shí)),所以,常采納在有限范圍搜尋方法。這里使用啟迪式搜尋。在啟迪式搜尋的過程中,重點(diǎn)的一步是怎樣確立下一個(gè)要觀察的節(jié)點(diǎn),在確立節(jié)點(diǎn)時(shí)只需能充分利用與問題有關(guān)的信息,預(yù)計(jì)出節(jié)點(diǎn)的重要性,就能在搜尋時(shí)選擇重要性較高的節(jié)點(diǎn),以利于博弈者以較快的速度求出最正確的棋步。3.32采納靜態(tài)評(píng)估函數(shù)這里用評(píng)估函數(shù)h(i)權(quán)衡每一個(gè)葉節(jié)點(diǎn)地點(diǎn)的“值”。一個(gè)最正確首步能夠由一個(gè)最小最大化過程產(chǎn)生。假定輪到MAX從搜尋樹的葉
11、節(jié)點(diǎn)中選用,他必定選擇擁有最大值的節(jié)點(diǎn)。所以,MIN葉節(jié)點(diǎn)的一個(gè)MAX節(jié)點(diǎn)雙親的倒推值就等于葉節(jié)點(diǎn)的靜態(tài)評(píng)估值中的最大值。另一方面,MIN從葉結(jié)點(diǎn)中選用時(shí),一定選用最小的節(jié)點(diǎn)(即最負(fù)的值)。既然這樣,MAX葉節(jié)點(diǎn)的MIN雙親節(jié)點(diǎn)被分派一個(gè)倒推值,他等于葉節(jié)點(diǎn)靜態(tài)評(píng)估值的最小值。在全部葉節(jié)點(diǎn)的父節(jié)點(diǎn)被給予倒推值后,開始倒推另一層,假定MAX將選擇有最大倒推值的MIN的后繼節(jié)點(diǎn),而MIN會(huì)選擇有最小倒推值的MAX后繼節(jié)點(diǎn)。持續(xù)逐層對(duì)節(jié)評(píng)論估,直到最后開始節(jié)點(diǎn)的后繼者被給予倒推值。MAX將選擇有最大倒推值的節(jié)點(diǎn)作為他的首步。整個(gè)過程的有效性鑒于這樣的假定。用整個(gè)棋盤估值的函數(shù)h(n)為靜態(tài)估值函數(shù)。
12、假想目前棋局S為輪到計(jì)算機(jī)方下棋(用表示),任選一空點(diǎn)作為計(jì)算機(jī)方的下棋地點(diǎn)(可有若干種選擇),接著考慮在此狀況下游戲者一方下棋的棋局(用O表示);從某一“O”棋局出發(fā),任選一空點(diǎn)作為游戲者一方的落子處(又有若干種選擇),再次形成計(jì)算機(jī)方下棋的“”棋局;依此類推,這樣可形成一棵以S為根結(jié)點(diǎn)的博弈樹,該樹以O(shè)棋局為第2層子結(jié)點(diǎn),以棋局為第3層子結(jié)點(diǎn)等等。假如持續(xù)向前搜尋,可形成多層子結(jié)點(diǎn),此刻以向前搜尋3層子結(jié)點(diǎn)為例來說明極大極小值的過程。對(duì)第3層子結(jié)點(diǎn)的某一棋局n,求出其預(yù)計(jì)值h(n),假定有一博弈樹已形成,如圖1所示,h(n)的值由各結(jié)點(diǎn)旁的數(shù)值給出。依據(jù)極小極大化剖析法,先計(jì)算第3層子結(jié)點(diǎn)
13、h(n)值,而后第2層子結(jié)點(diǎn)的預(yù)計(jì)值取他的各后繼子結(jié)點(diǎn)的極小值,根結(jié)點(diǎn)的預(yù)計(jì)值取他的各子結(jié)點(diǎn)的極大值。這個(gè)獲得最大預(yù)計(jì)值的子結(jié)點(diǎn)即為從S出發(fā)的計(jì)算機(jī)方的最正確落子方案。棋盤上某一行、某一列或某一對(duì)角線為一路,這里使用的棋盤為19行19列,所以,行和列方向上共有191938路;從左下到右上方向的對(duì)角線有37路,相同,從左上到右下方向的對(duì)角線也有37路。但關(guān)于五子棋來說一定在一條直線上有連續(xù)五個(gè)棋子才能贏。所以,在對(duì)角線上就能夠減少8路。所以,整個(gè)棋盤路的總數(shù)為:對(duì)某一棋局n,第i路得分:h(i)hc(i)hm(i)。此中:hc(i)為計(jì)算機(jī)方在第i路預(yù)計(jì)值得分,hm(i)為游戲者一方在第i路得分
14、。對(duì)的得分規(guī)則作以下說明。規(guī)則中代表一空點(diǎn);o代表對(duì)方棋子;代表有計(jì)算機(jī)方棋子;表示連續(xù)2點(diǎn)為空點(diǎn);表示連續(xù)3個(gè)空點(diǎn)接一個(gè)計(jì)算機(jī)方棋子,再接兩空點(diǎn)。某一規(guī)則表示如在i路上有棋子構(gòu)成形如則hc(i)30。其余規(guī)則表示相同。在系統(tǒng)中使用的主要估值規(guī)則以下:由對(duì)稱性可知和的估值相同,同理可得其余擁有這樣對(duì)稱性的估值都以為是相等的。在連續(xù)兩路上出現(xiàn)(3)的情況=hc(i)=5000,一路出現(xiàn),此外一路出現(xiàn)(4)=hc(i)=5000。所以在整個(gè)棋盤上的總估值為:為了增添系統(tǒng)的智能化也能夠增添其余的一些規(guī)則。33遺傳算法優(yōu)化估值函數(shù)在博弈程序的幾大主要部分里,估值函數(shù)是與詳細(xì)的棋類知識(shí)密切聯(lián)合的一部分。
15、能夠說估值函數(shù)在很大程度上決定了博弈程序的棋力高低。上邊給出的估值是依據(jù)實(shí)質(zhì)經(jīng)驗(yàn)給出的。怎樣對(duì)上述的估值進(jìn)行優(yōu)化呢?下邊采納遺傳算法來改良靜態(tài)估值。遺傳算法的預(yù)計(jì)值在很大的程度上也依靠于實(shí)行者的經(jīng)驗(yàn)??墒悄軌蚶靡恍└咚矫制遄V或同其余博弈程序棋戰(zhàn),看使用某一組參數(shù)時(shí)取勝的機(jī)率有多大來進(jìn)行較驗(yàn)。經(jīng)過幾次的試驗(yàn)一般就能夠獲得較好的靜態(tài)估值。傳統(tǒng)的算法一般只好保護(hù)一組較好的參數(shù)。遺傳算法同傳統(tǒng)的算法對(duì)比能夠同時(shí)保護(hù)幾組較好的參數(shù),經(jīng)過向此中增添一組新參數(shù),往常是將幾組老參數(shù)中選出的值組合在一同做一點(diǎn)變化。而后同幾組老的參數(shù)比較孰優(yōu)孰劣,將最差的一組從中去除。這里面較重要的操作是交錯(cuò)和變異操作。交
16、錯(cuò)經(jīng)過隨機(jī)互換父代個(gè)體的信息來繼承已有參數(shù)中的優(yōu)秀內(nèi)容;變異經(jīng)過隨機(jī)改變個(gè)體中的基因此增添種群的多樣性,防止優(yōu)化的因局部震蕩而失敗。能夠?qū)⑦z傳算法的優(yōu)化估值參數(shù)的過程用圖2表示。遺傳算法的長處:因?yàn)樗褜に惴ㄊ菑膯栴}的解開始的,而不是一組參數(shù)。所以被局部震蕩擾亂致使求最優(yōu)解失敗的可能性大大減小。此算法能將搜尋重點(diǎn)集中于性能高的部分,能較快地求出最正確的參數(shù)。在使用中應(yīng)該注意的問題以下:種群數(shù)量這是影響算法性能的重要要素。種群數(shù)量過大,會(huì)致使運(yùn)算時(shí)間太長,結(jié)果收斂遲緩;種群數(shù)量太小則可能致使算法精度過低,甚至停止不前。交錯(cuò)概率這個(gè)用于控制交錯(cuò)操作的頻度。此概率過大會(huì)致使種群中的個(gè)體更新過快,較優(yōu)的
17、個(gè)體不可以穩(wěn)固的保持和傳達(dá)信息;此概率過小則會(huì)使優(yōu)化的過程遲緩甚至停止不前。變異概率這個(gè)概率用于控制產(chǎn)生變異個(gè)體的頻度,目的是防備整個(gè)種群中隨意參數(shù)的幾個(gè)基因保持不變。一般使用一個(gè)很小的概率即足以達(dá)成此任務(wù);概率太大則遺傳信息沒法穩(wěn)固傳達(dá),進(jìn)而使優(yōu)化過程變?yōu)殡S機(jī)過程,失掉切實(shí)的方向而致使失敗。程序?qū)崿F(xiàn)4.1程序設(shè)計(jì)思路實(shí)現(xiàn)一個(gè)用戶能夠Internet上任何地方的不一樣機(jī)長進(jìn)行游戲,使用多線程和網(wǎng)絡(luò)套接字?jǐn)?shù)據(jù)流的散布式五子棋游戲,依據(jù)要達(dá)成的功能,本程序采納多客戶服務(wù)方式。服務(wù)器創(chuàng)立服務(wù)器Socket,一直處于監(jiān)聽等候狀態(tài)。客戶端是動(dòng)作的倡始者,何時(shí)發(fā)出申請(qǐng)由客戶端決定??蛻舳讼蚍?wù)器發(fā)出申請(qǐng),
18、服務(wù)器賜予響應(yīng),客戶端發(fā)出申請(qǐng)后立刻可從Socket通道去取服務(wù)方的結(jié)果。服務(wù)器接受兩個(gè)客戶端連結(jié)后開始一個(gè)線程,不停接受客戶端發(fā)來的數(shù)據(jù),并把辦理后的數(shù)據(jù)傳遞給客戶端。服務(wù)器能夠創(chuàng)立隨意多局(圖3-1)。服務(wù)1N客戶端客戶端客戶端客戶端圖3-1系統(tǒng)框架Fig.3-1FrameofSystem在對(duì)服務(wù)器與客戶端的設(shè)計(jì)開發(fā)以前,為了使開發(fā)方便,將服務(wù)器與客戶端之間用以通信的變量規(guī)定好。經(jīng)過編寫一個(gè)接口GameConstant(),在此中定義各個(gè)常量的值:publicstaticintPLAYER1=1;publicstaticintPLAYER2=2;publicstaticintPLAYER1
19、_WON=1;publicstaticintPLAYER2_WON=2;publicstaticintDRAW=3;publicstaticintCONTINUE=4;publicstaticintSTOP=100;publicstaticintGAMEPORT=8000;服務(wù)器和客戶端在設(shè)計(jì)時(shí)繼承接口GameConstant()里面的全部數(shù)據(jù)。4.2服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)為了使界面友善,服務(wù)器使用圖形組件,創(chuàng)立成一個(gè)能夠顯示游戲信息的框架。在框架中創(chuàng)立一個(gè)包含文本區(qū)的轉(zhuǎn)動(dòng)窗格,并在文本區(qū)顯示游戲信息(圖3-2)。圖3-2服務(wù)器界面Fig.3-2InterfaceofGame-server要成立服
20、務(wù)器,需要?jiǎng)?chuàng)立一個(gè)服務(wù)器Socket,并把它附帶到一個(gè)端口上,服務(wù)器通過這個(gè)端口監(jiān)聽連結(jié)懇求。端口表記Socket上的TCP服務(wù)。網(wǎng)絡(luò)的類寄存在包中,引入包后經(jīng)過實(shí)現(xiàn)一個(gè)ServerSocket的實(shí)例就能夠創(chuàng)立一個(gè)服務(wù)器Socket,并把它附帶到一個(gè)端口(GAMEPORT)上:ServerSocketserverSocket=newServerSocket(GAMEPORT);而后,服務(wù)器使用以下語句開始監(jiān)聽連結(jié)懇求:Socketplayer1=serverSocket.accept();Socketplayer2=serverSocket.accept();服務(wù)器開始等候,直到客戶提出連結(jié)懇
21、求。連結(jié)成立后,服務(wù)器經(jīng)過數(shù)據(jù)輸入流從客戶端接收信息,而且經(jīng)過數(shù)據(jù)輸出流把相應(yīng)的標(biāo)記發(fā)送給客戶端。newDataOutputStream(player1.getOutputStream().writeInt(PLAYER1);newDataOutputStream(player2.getOutputStream().writeInt(PLAYER2);當(dāng)客戶端知足開局條件時(shí),就開啟一個(gè)線程辦理客戶之間數(shù)據(jù),同時(shí)持續(xù)監(jiān)聽其余客戶端的連結(jié)懇求。多線程是Java的一個(gè)特色,多線程能夠使程序反響更快、交互性更強(qiáng),并能提升履行效率。創(chuàng)立一個(gè)新的線程的生命周期以下狀態(tài):新建,就緒,運(yùn)轉(zhuǎn),堵塞,死亡。在Ja
22、va中,供給了多種控制線程的方法,在服務(wù)器頂用到的主要以下幾種:publicvoidrun()Java運(yùn)轉(zhuǎn)系統(tǒng)調(diào)用這個(gè)方法來履行線程。在用戶線程類中,一定覆蓋這個(gè)方法而且供給線程履行的代碼。publicvoidstart()該方法啟動(dòng)線程,它惹起對(duì)run()方法的調(diào)用??蛻纛愔械目蛇\(yùn)轉(zhuǎn)對(duì)象調(diào)用該方法。服務(wù)器程序采納類HandleGame繼承Thread類來實(shí)現(xiàn)對(duì)線程的調(diào)用,同時(shí)對(duì)run()方法覆蓋。以下是HandleGame()類里面主要的數(shù)據(jù)域和方法:privatecharcell:Char種類數(shù)組用來記錄玩家的標(biāo)記。privateDataInputStreamisFromPlayer1;p
23、rivateDataOutputStreamosToPlayer1;privateDataInputStreamisFromPlayer2;privateDataOutputStreamosToPlayer2;:四個(gè)數(shù)據(jù)流用來實(shí)現(xiàn)與兩個(gè)玩家之間信息的傳達(dá)。publicHandleGame(Socketplayer1,Socketplayer2):結(jié)構(gòu)函數(shù),兩個(gè)參數(shù)用以接收傳達(dá)過來的Socket對(duì)象。publicvoidrun():對(duì)繼承Thread類中的run()方法進(jìn)行覆蓋。privatebooleanisFull():判斷能否滿格。privatebooleanisWon(introw,in
24、tcolumn,chartoken):判斷新標(biāo)記的單元格能否使一方獲勝。游戲局一旦成立起來,服務(wù)器便于工作交替地從客戶端那邊接收數(shù)據(jù)。從客戶端接收到數(shù)據(jù)后,服務(wù)器判斷游戲狀態(tài),并依據(jù)結(jié)果進(jìn)行有關(guān)操作,直至游戲結(jié)束。4.3客戶端的設(shè)計(jì)與實(shí)現(xiàn)客戶端負(fù)責(zé)與玩家的交互。所以要?jiǎng)?chuàng)立一個(gè)界面,包含一個(gè)20*20的下棋地區(qū),當(dāng)玩家選定單元格或接收到其余玩家選定的單元格時(shí),用不一樣的標(biāo)記顯示;兩個(gè)顯示游戲名稱和游戲狀態(tài)的標(biāo)簽和兩個(gè)菜單欄上的按鍵用以進(jìn)行控制,如圖3-3:圖3-3客戶端界面Fig.3-3InterfaceofGame-client翻開這里客戶程序設(shè)計(jì)成一個(gè)JavaAppletGameClient
25、.html文件時(shí),閱讀器調(diào)用,用戶能夠在Web閱讀器里運(yùn)轉(zhuǎn)。init()方法對(duì)界面進(jìn)行初始化。點(diǎn)擊當(dāng)用戶Start時(shí)開啟一個(gè)線程和服務(wù)器連結(jié),經(jīng)過數(shù)據(jù)流進(jìn)行數(shù)據(jù)互換。connectToServer=newSocket(localhost,GAMEPORT);isFromServer=newDataInputStream(connectToServer.getInputStream();osToServer=newDataOutputStream(connectToServer.getOutputStream();下邊是類GameClient的主要方法和數(shù)據(jù):publicclassGameCli
26、entextendsJAppletimplementsRunnable,ActionListener,GameConstantsprivatebooleanmyTurn=false;:標(biāo)記能否輪到自己下棋privatecharmyToken=;:標(biāo)記自己的棋子privatecharotherToken=;:標(biāo)記敵手的棋子privateCellcell=newCell2020;:生成20*20privateintrowSelected;:記錄所選單元格的行privateintcolumnSelected;:記錄所選單元格的列個(gè)單元格privatebooleancontinueToPlay=tru
27、e;privatebooleanwaiting=true;:記錄游戲進(jìn)行中的狀態(tài)publicvoidinit():初始化用戶界面,翻開網(wǎng)頁時(shí)由閱讀器調(diào)用publicvoidactionPerformed(ActionEvente):覆蓋ActionListener接口里面actionPerformed()方法,用來辦理用戶點(diǎn)擊菜單欄惹起的操作。publicvoidrun()覆蓋Runnable接口里的run()方法,用以對(duì)游戲過程中的數(shù)據(jù)傳輸,辦理,控制。在客戶程序的類中,因?yàn)樗^承了Applet類,所以不可以再經(jīng)過申明Thread類的擴(kuò)展來實(shí)現(xiàn),只好經(jīng)過實(shí)現(xiàn)Java供給的一個(gè)Runnable
28、接口,進(jìn)行線程的創(chuàng)立和運(yùn)轉(zhuǎn)。Runnable接口的實(shí)現(xiàn)是特別簡單的,它只包含run()方法,使用時(shí)只需將該方法覆蓋。從游戲設(shè)計(jì)來看,單元格是辦理鼠標(biāo)點(diǎn)擊事件和顯示標(biāo)記的GUI對(duì)象。在這里使用的是面板,設(shè)置單元格Cell為JPanel的子類。將Cell類申明為內(nèi)部類,能夠直接使用GameClient類中定義的變量與方法,使程序簡短了然。Cell類中包含以下主要數(shù)據(jù)和方法:publicclassCellextendsJPanelimplementsMouseListenerprivateintrow;privateintcolumn;privatechartoken=;publicCell(int
29、row,intcolumn):結(jié)構(gòu)函數(shù)publicvoidpaintComponent(Graphicsg):Graphics對(duì)象g是由Java運(yùn)轉(zhuǎn)系統(tǒng)自動(dòng)創(chuàng)立,這個(gè)對(duì)象控制信息的繪制方式。能夠使用定義在Graphics類中的多種畫法繪制字符串的幾何圖形。publicvoidmouseClicked(MouseEvente)publicvoidmouseExited(MouseEvente)publicvoidmouseEntered(MouseEvente)publicvoidmouseReleased(MouseEvente)publicvoidmousePressed(MouseEvente):接口MouseListener中的方法。4.4程序的運(yùn)轉(zhuǎn)第一將編寫好的程序使用Java編譯器編譯,生成以class為擴(kuò)展名的類文件,而后使用Java解說器分別運(yùn)轉(zhuǎn)服務(wù)器和客戶端。客戶端發(fā)出連結(jié),服務(wù)器接收后開啟線程對(duì)游戲進(jìn)行控制,游戲結(jié)束時(shí)封閉線程。詳細(xì)流程如圖3-4所示:玩家一服務(wù)器1.初始化用戶界面創(chuàng)立一個(gè)服務(wù)器套接字。向服務(wù)器懇求連結(jié)收第一個(gè)玩家的連結(jié)懇求,而且接,并從服務(wù)器獲通知玩家他是玩家一,使用標(biāo)記知所用棋子的標(biāo)“X”。記。接收第二個(gè)玩家的連結(jié)懇求,而且3.從服務(wù)器獲得開始通知玩家他是玩家二,使用標(biāo)記標(biāo)記。“O”。啟動(dòng)對(duì)局線程。4
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中外合資企業(yè)合同書模板2024年
- 商標(biāo)轉(zhuǎn)讓協(xié)議
- 房屋租賃合同補(bǔ)充協(xié)議案例
- 司機(jī)的勞動(dòng)合同協(xié)議范本2024年
- 二手車轉(zhuǎn)讓協(xié)議書的范本
- 電子商務(wù)加盟合同范本2024年
- 6.20條例條令學(xué)習(xí)
- 2024年學(xué)校物品采購合同
- 2024年美容院用工合同
- 專業(yè)勞動(dòng)合同模板
- 銀行存款業(yè)務(wù)課件
- 瘢痕注射的深度護(hù)理
- 2024年全國初中數(shù)學(xué)競(jìng)賽試題及答案
- 安防監(jiān)控系統(tǒng)技術(shù)標(biāo)投標(biāo)書范本-圖文
- 大學(xué)生青春期教育
- 中國石油天然氣股份有限公司油氣田站場(chǎng)目視化設(shè)計(jì)規(guī)定
- 基于豆瓣網(wǎng)電影數(shù)據(jù)的分析與可視化
- 腦梗死的護(hù)理病歷
- 肺炎支原體性肺炎護(hù)理課件
- 科學(xué)論文中的學(xué)術(shù)不端案例分析
- 科學(xué)計(jì)算課件
評(píng)論
0/150
提交評(píng)論