freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

五子棋設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)-資料下載頁(yè)

2025-05-16 03:47本頁(yè)面

【導(dǎo)讀】立題目的和意義:本程序旨在用JAVA實(shí)現(xiàn)一個(gè)基本于C/S模式的五子棋網(wǎng)絡(luò)對(duì)戰(zhàn)游戲。玩家作為客戶(hù)端通過(guò)服務(wù)器端與其它玩家進(jìn)行對(duì)戰(zhàn),聊天等功能。通過(guò)實(shí)現(xiàn)本程序加深對(duì)計(jì)算機(jī)網(wǎng)絡(luò)編程的了解。IntelPentium®2及以上處理器,32M以上內(nèi)存,4G以上硬盤(pán);Microsoft®Windows?9X/NT/XP操作系統(tǒng);800*600或以上的屏幕分辨率。本文主要講的是用Eclipse開(kāi)發(fā)工具與java開(kāi)發(fā)語(yǔ)言開(kāi)發(fā)出一個(gè)自定義界面的五子棋小游戲,本游戲程序能實(shí)現(xiàn)兩個(gè)人對(duì)陣下棋,并且程序中能智能的判定游戲的獲勝方和游戲的結(jié)束與否,實(shí)現(xiàn)兩方進(jìn)行博弈。通過(guò)對(duì)軟件的編寫(xiě),更深入的理解了面向?qū)ο蟮母拍?,也體會(huì)到利用面向?qū)ο笳Z(yǔ)言處理一些問(wèn)題的優(yōu)勢(shì)。同時(shí)也加深了對(duì)多線程,流套接字等高級(jí)技術(shù)的理解。五子棋是起源于中國(guó)古代的傳統(tǒng)黑白棋種之一。現(xiàn)代五子棋日文稱(chēng)之為“連珠”,英文稱(chēng)之為“Renju”、“Gobang”或“FIR”,亦有“連五子”、“五子連”、“串珠”、“五目”、“五目碰”、“五格”等多種稱(chēng)謂。

  

【正文】 //////////////// // 如果點(diǎn)擊的是“放棄游戲”按鈕,同樣要修改按鈕狀態(tài)。 if (() == ) { // 如果棋局正在進(jìn)行,判定退出游戲的一方輸 if (isOnChess) { (/giveup + chessClientName)。 (1 * )。 (true)。 (true)。 (false)。 (請(qǐng)建立游戲或者加入游戲)。 } if (!isOnChess) { (true)。 (true)。 (false)。 (請(qǐng)建立游戲或者加入游戲)。 } isClient = isServer = false。 } clientThread線程類(lèi)對(duì)消息的處理在設(shè)計(jì)完5個(gè)面板類(lèi)后即可設(shè)計(jì)客戶(hù)端的主類(lèi)。因?yàn)橛辛松鲜?個(gè)面板類(lèi)后實(shí)現(xiàn)游戲的客戶(hù)端主類(lèi)chessClient也就非常簡(jiǎn)單了,它繼承于Frame,實(shí)現(xiàn)了ActionListener和KeyListener接口。該類(lèi)添加了對(duì)控制面板中相應(yīng)按鈕的事件響應(yīng)和聊天面板中鍵盤(pán)事件的處理。為了使客戶(hù)端正常運(yùn)作,還必須了解客戶(hù)端的線程類(lèi)clientThread,它對(duì)chessClient的作用就好像chessThread對(duì)chessPad一樣,clientThread的構(gòu)造方法接收一個(gè)chessClient對(duì)象,然后在線程run方法體內(nèi)監(jiān)聽(tīng)端口,從服務(wù)器讀取消息后進(jìn)行處理。讀取和處理都是利用chessClient對(duì)象進(jìn)行的。同chessThread一樣,因?yàn)镾ocket讀取、發(fā)送消息時(shí)可能會(huì)阻塞,所以還需要一個(gè)clientThread作為客戶(hù)端線程來(lái)實(shí)時(shí)接收發(fā)送消息。clientThread類(lèi)負(fù)責(zé)不斷接受并處理來(lái)自服務(wù)器端的消息,它繼承自Thread類(lèi),對(duì)于不同的消息clientThread會(huì)做出不同的處理,主要處理的消息如下。以/userlist開(kāi)頭:更新用戶(hù)名列表。以/username開(kāi)頭:更新客戶(hù)端窗口標(biāo)題。以/reject開(kāi)頭:拒絕加入游戲。以/peer開(kāi)頭:一方加入游戲,開(kāi)始對(duì)弈。以/youwin開(kāi)頭:你贏了,處理棋盤(pán)等。以/ok開(kāi)頭:創(chuàng)建游戲成功,等待別人加入。以/error開(kāi)頭:傳輸出錯(cuò),退出游戲重新加入。處理這些消息主要由acceptMessage方法完成,其代碼如下:public void acceptMessage(String recMessage) { if ((/userlist )) { // 如果接收到的信息以/userlist 開(kāi)頭,將其后的用戶(hù)名提取出來(lái),添加到 // 輸入信息Panel左邊的用戶(hù)列表中。 StringTokenizer userToken = new StringTokenizer(recMessage, )。 int userNumber = 0。 ()。 ()。 (所有人)。 while (()) { String user = (String) ( )。 if (userNumber 0 amp。amp。 !([inchess])) { (user)。 (user)。 } userNumber++。 } (所有人)。 } // 如果如果接收到的信息以/yourname 開(kāi)頭,將用戶(hù)名顯示在客戶(hù)端對(duì)話(huà)框標(biāo)題欄。 else if ((/yourname )) { //之所以是10因?yàn)椤?yourname ”正好10個(gè)字符,后面的是用戶(hù)名。 = (10)。 (五子棋客戶(hù)端 + 當(dāng)前用戶(hù)名: + )。 } // 如果如果接收到的信息以/reject開(kāi)頭,在狀態(tài)欄顯示拒絕加入游戲。 else if ((/reject)) { try { (不能加入游戲)。 //更新按鈕狀態(tài) (false)。 (true)。 (true)。 } catch (Exception ef) { ()。 } (true)。 } // 如果如果接收到的信息以/peer開(kāi)頭,則記下對(duì)方的名字,然后進(jìn)入等待狀態(tài) else if ((/peer )) { //同理,因?yàn)?peer 六個(gè)字符,所以是6 = (6)。 if () {//黑子先行 = 1。 = true。 (請(qǐng)黑棋下子)。 } else if () { = 1。 (已加入游戲,等待對(duì)方下子...)。 } } else if ((/youwin)) { = false。 ()。 (對(duì)方退出,請(qǐng)點(diǎn)放棄游戲退出連接)。 = false。 } else if ((/OK)) { (創(chuàng)建游戲成功,等待別人加入...)。 } else if ((/error)) { (傳輸錯(cuò)誤:請(qǐng)退出程序,重新加入 \n)。 } else {//普通聊天 (recMessage + \n)。 (().length())。 } } 服務(wù)器端程序?qū)崿F(xiàn)服務(wù)器界面很簡(jiǎn)潔,實(shí)現(xiàn)起來(lái)也比較簡(jiǎn)單,如圖42所示。其主要包含三部分:連接數(shù)量的狀態(tài)欄、當(dāng)前用戶(hù)信息列表和控制面板。 圖42 服務(wù)器界面 服務(wù)器端網(wǎng)絡(luò)功能主要包括以下幾方面:1. 處理來(lái)自客戶(hù)端的連接請(qǐng)求。2. 維護(hù)客戶(hù)信息列表。3. 轉(zhuǎn)發(fā)由客戶(hù)端發(fā)送的通信數(shù)據(jù)至其他客戶(hù)端。(1)處理連接請(qǐng)求 在服務(wù)器端主類(lèi)chessServer中,makeMessageServer()方法負(fù)責(zé)處理來(lái)自客戶(hù)端的連接請(qǐng)求,服務(wù)器在接收客戶(hù)方的請(qǐng)求后立即初始化一個(gè)serverThread線程對(duì)象來(lái)處理服務(wù)器與客戶(hù)之間的交互,住程序則返回繼續(xù)監(jiān)聽(tīng)端口,等待下一個(gè)客戶(hù)的連接請(qǐng)求。 (2)維護(hù)客戶(hù)信息列表客戶(hù)信息列表動(dòng)態(tài)反映了當(dāng)前連接到服務(wù)器端的所有玩家信息,包括玩家IP、玩家姓名、對(duì)戰(zhàn)玩家狀態(tài)等。列表由Java特定的數(shù)據(jù)結(jié)構(gòu)哈希表Hashtable實(shí)現(xiàn)。Hashtable的簡(jiǎn)單用法如下。創(chuàng)建一個(gè)數(shù)字哈希表的代碼如下:Hashtable numbers=new Hashtable()。(one, new Integer(1))。(two, new Integer(2))。(three, new Integer(3))。檢索一個(gè)數(shù)字的代碼如下:Integer n=(Integer) (two)。If (n !=NULL){ (two=+n)。}哈希表的說(shuō)明如表41所示。表41 哈希表的說(shuō)明名稱(chēng)類(lèi)型說(shuō)明clientSataHsahHashtable為客戶(hù)端Soket和用來(lái)發(fā)送消息的輸出流簡(jiǎn)歷哈希映射clientNameHashHashtable為客戶(hù)端Socket和其姓名建立哈希映射chessPeerHashHashtable為游戲?qū)?zhàn)雙方建立哈希映射哈希表的維護(hù)方法如下。有新的客戶(hù)端連接請(qǐng)求時(shí),調(diào)用一下代碼: (clientSocket,outData)。 (clientSocket,(玩家+clientAccessNumber++))。以上代碼分別建立兩個(gè)相應(yīng)的哈希映射,方便發(fā)送消息使用。當(dāng)某個(gè)客戶(hù)端斷開(kāi)連接時(shí),調(diào)用一下代碼: (clientSocket)。 (clientSocket)。以上代碼從哈希表中移除相應(yīng)的哈希映射。當(dāng)有兩個(gè)玩家建立對(duì)戰(zhàn)游戲成功時(shí),調(diào)用一下代碼: (serverName,selfName)。以上代碼為對(duì)戰(zhàn)雙方建立哈希映射,以便以后轉(zhuǎn)發(fā)消息時(shí)使用。當(dāng)對(duì)戰(zhàn)玩家有一方放棄游戲或者退出游戲時(shí),調(diào)用以下代碼:(chessClientName)。以上代碼從哈希表中移除相應(yīng)的哈希映射。(3)消息轉(zhuǎn)發(fā) 在服務(wù)器端為每個(gè)客戶(hù)端建立的服務(wù)線程對(duì)象serverThread中對(duì)客戶(hù)端發(fā)送來(lái)的消息進(jìn)行轉(zhuǎn)發(fā)。 處理來(lái)自客戶(hù)端的連接請(qǐng)求 此功能主要在服務(wù)器端主類(lèi)chessServer的makeMessageServer方法中實(shí)現(xiàn):首先建立一個(gè)serverSorket對(duì)象,然后進(jìn)入循環(huán)不斷監(jiān)聽(tīng)新的用戶(hù)連接,在創(chuàng)建一個(gè)與此連接關(guān)聯(lián)的serverThead線程,負(fù)責(zé)為這個(gè)用戶(hù)服務(wù),轉(zhuǎn)發(fā)消息等。 chessServer類(lèi)的makeMessageServer代碼具體實(shí)現(xiàn)如下:public void makeMessageServer(int port, MessageServerPanel server) throws IOException { Socket clientSocket。 long clientAccessNumber = 1。 = server。 try { // 輸出服務(wù)器的啟動(dòng)信息 serverSocket = new ServerSocket(port)。 (服務(wù)器開(kāi)始于: + ().getLocalHost() + : + () + \n)。 while (true) { clientSocket = ()。 (用戶(hù)連接: + clientSocket + \n)。 DataOutputStream outData = new DataOutputStream(())。 //在這里填充這兩個(gè)Hashtable,在對(duì)應(yīng)線程里用到。 (clientSocket, outData)。 (clientSocket, (玩家 + clientAccessNumber++))。 //每連接一個(gè)用戶(hù),創(chuàng)建一個(gè)線程,監(jiān)聽(tīng)服務(wù)。 ServerThread thread = new ServerThread(clientSocket, clientDataHash, clientNameHash, chessPeerHash, server)。 ()。 } } catch (IOException ex) { (已經(jīng)有服務(wù)器在運(yùn)行. \n)。 } } 轉(zhuǎn)發(fā)消息serverThread類(lèi)負(fù)責(zé)接受客戶(hù)端發(fā)來(lái)的消息。根據(jù)消息的類(lèi)型重新封裝再發(fā)回給客戶(hù)端,由客戶(hù)端進(jìn)行處理。處理消息時(shí)要針對(duì)很多情況分別進(jìn)行處理。消息轉(zhuǎn)發(fā)主要在serverThread類(lèi)的messageTransfer方法中實(shí)現(xiàn),部分代碼如下:public void messageTransfer(String message) { String clientName, peerName。 /////////////命令處理/////////////////////////////// // 如果消息以“/”開(kāi)頭,表明是命令消息。 if ((/)) { // 如果消息以“/list”開(kāi)頭,則將其回饋到客戶(hù)端以更新用戶(hù)列表 if ((/li
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1