




已閱讀5頁,還剩1頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
3.1 程序設計思路實現一個用戶可以Internet上任何地方的不同機上進行游戲,使用多線程和網絡套接字數據流的分布式五子棋游戲,根據要完成的功能,本程序采用多客戶服務方式。服務器創建服務器Socket,始終處于監聽等待狀態。客戶端是動作的發起者,何時發出申請由客戶端決定。客戶端向服務器發出申請,服務器給予響應,客戶端發出申請后立即可從Socket通道去取服務方的結果。服務器接受兩個客戶端連接后開始一個線程,不斷接受客戶端發來的數據,并把處理后的數據傳送給客戶端。服務器可以創建任意多局(圖3-1)。服 務 器游戲局1游戲局N客戶端1客戶端2客戶端M客戶端N圖3-1 系統框架Fig.3-1 Frame of System在對服務器與客戶端的設計開發之前,為了使開發方便,將服務器與客戶端之間用以通信的變量規定好。通過編寫一個接口GameConstant(),在其中定義各個常量的值: public static int PLAYER1 = 1; public static int PLAYER2 = 2; public static int PLAYER1_WON = 1; public static int PLAYER2_WON = 2; public static int DRAW = 3; public static int CONTINUE = 4; public static int STOP = 100; public static int GAMEPORT = 8000;服務器和客戶端在設計時繼承接口GameConstant()里面的所有數據。3.2 服務器的設計與實現為了使界面友好,服務器使用圖形組件,創建成一個可以顯示游戲信息的框架。在框架中創建一個包含文本區的滾動窗格,并在文本區顯示游戲信息(圖3-2)。圖3-2 服務器界面Fig.3-2 Interface of Game-server要建立服務器,需要創建一個服務器Socket,并把它附加到一個端口上,服務器通過這個端口監聽連接請求。端口標識Socket上的TCP服務。網絡的類存放在包中,引入包后通過實現一個ServerSocket的實例就可以創建一個服務器Socket,并把它附加到一個端口(GAMEPORT)上: ServerSocketserverSocket=newServerSocket (GAMEPORT);然后,服務器使用下列語句開始監聽連接請求:Socketplayer1=serverSocket.accept ();Socketplayer2=serverSocket.accept ();服務器開始等待,直到客戶提出連接請求。連接建立后,服務器通過數據輸入流從客戶端接收信息,并且通過數據輸出流把相應的標記發送給客戶端。new DataOutputStream(player1.getOutputStream().writeInt(PLAYER1);new DataOutputStream(player2.getOutputStream().writeInt(PLAYER2);當客戶端滿足開局條件時,就開啟一個線程處理客戶之間數據,同時繼續監聽其它客戶端的連接請求。多線程是Java的一個特點,多線程可以使程序反應更快、交互性更強,并能提高執行效率。創建一個新的線程的生命周期如下狀態: 新建,就緒,運行,阻塞,死亡。在Java中,提供了多種控制線程的方法,在服務器中用到的主要以下幾種: publicvoidrun ()Java運行系統調用這個方法來執行線程。在用戶線程類中,必須覆蓋這個方法并且提供線程執行的代碼。 publicvoidstart ()該方法啟動線程,它引起對run()方法的調用。客戶類中的可運行對象調用該方法。服務器程序采用類HandleGame繼承Thread類來實現對線程的調用,同時對run ()方法覆蓋。以下是HandleGame () 類里面主要的數據域和方法: private char cell:Char類型數組用來記錄玩家的標記。private DataInputStream isFromPlayer1; private DataOutputStream osToPlayer1; private DataInputStream isFromPlayer2; private DataOutputStream osToPlayer2; :四個數據流用來實現與兩個玩家之間信息的傳遞。public HandleGame (Socket player1, Socket player2):構造函數,兩個參數用以接收傳遞過來的Socket對象。public void run():對繼承Thread類中的run ()方法進行覆蓋。private boolean isFull() :判斷是否滿格。private boolean isWon(int row,int column,char token):判斷新標記的單元格是否使一方獲勝。游戲局一旦建立起來,服務器便于工作交替地從客戶端那里接收數據。從客戶端接收到數據后,服務器判斷游戲狀態,并根據結果進行相關操作,直至游戲結束。3.3 客戶端的設計與實現客戶端負責與玩家的交互。因此要創建一個界面,包括一個20*20的下棋區域,當玩家選定單元格或接收到別的玩家選定的單元格時,用不同的標記顯示;兩個顯示游戲名稱和游戲狀態的標簽和兩個菜單欄上的按鍵用以進行控制,如圖3-3:圖3-3 客戶端界面Fig.3-3 Interface of Game-client這里客戶程序設計成一個Java Applet,用戶可以在Web瀏覽器里運行。當用戶打開GameClient.html文件時,瀏覽器調用init ()方法對界面進行初始化。點擊Start時開啟一個線程和服務器連接,通過數據流進行數據交換。 connectToServer = new Socket(localhost, GAMEPORT); isFromServer = new DataInputStream(connectToServer.getInputStream(); osToServer = new DataOutputStream(connectToServer.getOutputStream();下面是類GameClient的主要方法和數據: public class GameClient extends JApplet implements Runnable, ActionListener, GameConstants private boolean myTurn = false; :標記是否輪到自己下棋 private char myToken = ; :標記自己的棋子 private char otherToken = ; :標記對手的棋子 private Cell cell =new Cell2020; :生成20*20個單元格 private int rowSelected; :記錄所選單元格的行 private int columnSelected; :記錄所選單元格的列 private boolean continueToPlay = true; private boolean waiting = true;:記錄游戲進行中的狀態 public void init():初始化用戶界面,打開網頁時由瀏覽器調用 public void actionPerformed(ActionEvent e):覆蓋ActionListener接口里面actionPerformed ()方法,用來處理用戶點擊菜單欄引起的操作。 public void run()覆蓋Runnable接口里的run ()方法,用以對游戲過程中的數據傳輸,處理,控制。 在客戶程序的類中,由于它繼承了Applet類,所以不能再通過聲明Thread類的擴展來實現,只能通過實現Java提供的一個Runnable接口,進行線程的創建和運行。Runnable接口的實現是非常簡單的,它只包含run ()方法,使用時只要將該方法覆蓋。從游戲設計來看,單元格是處理鼠標點擊事件和顯示標記的GUI對象。在這里使用的是面板,設置單元格Cell為JPanel的子類。將Cell類聲明為內部類,可以直接使用GameClient類中定義的變量與方法,使程序簡潔明了。Cell類中包含以下主要數據和方法: public class Cell extends JPanel implements MouseListener private int row; private int column; private char token = ; public Cell(int row, int column):構造函數 public void paintComponent(Graphics g):Graphics對象g是由Java運行系統自動創建,這個對象控制信息的繪制方式。可以使用定義在Graphics類中的多種畫法繪制字符串的幾何圖形。 public void mouseClicked(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseEntered(MouseEvent e)public void mouseReleased(MouseEvent e) public void mousePressed(MouseEvent e) :接口MouseListener中的方法。 3.4 程序的運行首先將編寫好的程序使用Java編譯器編譯,生成以class為擴展名的類文件,然后使用Java解釋器分別運行服務器和客戶端。客戶端發出連接,服務器接收后開啟線程對游戲進行控制,游戲結束時關閉線程。具體流程如圖3-4所示:玩家一1. 初始化用戶界面2. 向服務器請求連接,并從服務器獲知所用棋子的標記。3. 從服務器得到開始標志。4. 等待玩家標記單元格,并向服務器發送單元格的行號和列號。5. 從服務器接收游戲狀態。6. 如果狀態是WIN,顯示是勝者,如果玩家二獲勝,接收玩家二的最后一步走棋信息。中斷循環。7. 如果狀態是DRAW,顯示游戲結束,中斷循環。8. 如果狀態是CONTINUE,接收玩家二選定的單元格的行號和列號,標記玩家二選定的單元格。服務器創建一個服務器套接字。接收第一個玩家的連接請求,并且通知玩家他是玩家一,使用標記“X”。接收第二個玩家的連接請求,并且通知玩家他是玩家二,使用標記“O”。啟動對局線程。處理對局:1 告訴玩家一開始游戲。2 接收玩家一選定單元格的行和列。3 判斷游戲狀態(STOP,WIN,DRAW,CONTINUE)。如果玩家一退出,向玩家二發送狀態(STOP),退出。4 如果玩家一獲勝,給兩個玩家都發送狀態(PLAYER1_WON),并且向玩家二發送玩家一的走棋信息。退出。5 如果狀態是CONTINUE,通知玩家二輪他走棋,并且向玩家二發送玩家一最新選定單元格的行和列。6 接收玩家二選定的單元格的行和列。7 如果玩家二退出,向玩家一發送狀態(STOP),退出。8 如果玩家二獲勝,給兩個玩家都發送狀態(PLAYER2_WON),并且向玩家一發送玩家二的走棋信息。退出。9如果狀態是CONTINUE,發送狀態,并且向玩家一發送玩家二最近選定的單元格的行和列。玩家二1 初始化用戶界面2 向服務器請求連接,并從服務器獲知所用棋子的標記。3 從服務器接收游戲狀態。4 如果狀態是WIN,顯示是勝者,如果玩家一獲勝,接收玩家一的最后一步走棋信息。中斷循環。5 如果狀態是CONTINUE,接收玩家一選定的單元格的行號和列號,標記玩家一選定的單元格。6 等待玩家標記單元格,并向服務器發送單元格的行號和列號。圖3-4 運行流程Fig.3-4 Flow Chart4 小結隨著計算機和網絡技術的不斷發展,信息技術給人們帶來的幫助越來越大,單獨一臺計算機已經不能滿足人們的需求
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 糖類的教學課件
- 大宗物資處置方案(3篇)
- 藥業銷售公司方案(3篇)
- 企業出海定制方案(3篇)
- 車站夜間清查方案模板(3篇)
- 山西應用科技學院《日語論文寫作》2023-2024學年第二學期期末試卷
- 沈陽大學《醫學細胞生物學討論》2023-2024學年第二學期期末試卷
- 蘇州工藝美術職業技術學院《能源與環境》2023-2024學年第二學期期末試卷
- 綏化學院《體育教育科學研究方法》2023-2024學年第二學期期末試卷
- 宣化科技職業學院《流行音樂》2023-2024學年第二學期期末試卷
- 高校物業管理服務實施方案
- 工程造價咨詢服務投標方案(專家團隊版-)
- 消化內鏡護理常規
- 經濟法學-001-國開機考復習資料
- 大規模分布式存儲系統架構設計與優化
- 招標代理入圍服務方案
- 【MOOC】電子技術實習-北京科技大學 中國大學慕課MOOC答案
- 2023年計量經濟學總題庫
- 安全事故以案說法
- 《基于模型驅動架構的專用規則引擎組件研究》
- 智慧樹知到《運動生理學》章節測試答案
評論
0/150
提交評論