網(wǎng)絡(luò)掃雷游戲畢業(yè)設(shè)計_第1頁
已閱讀1頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  目錄</b></p><p><b>  前言1</b></p><p><b>  1掃雷游戲概述2</b></p><p><b>  1.1基本信息2</b></p><p>  1.2 游戲玩法簡介2</

2、p><p>  2 系統(tǒng)平臺與技術(shù)選擇3</p><p>  2.1開發(fā)語言與工具3</p><p><b>  2.2技術(shù)選擇3</b></p><p>  3掃雷游戲需求分析4</p><p>  3.1編寫需求分析的目的4</p><p>  3.2功組織結(jié)構(gòu)圖

3、4</p><p>  4掃雷游戲軟件總體設(shè)計5</p><p>  4.1主要功能模塊劃分5</p><p>  4.2設(shè)計步驟流程6</p><p>  5掃雷游戲程序詳細設(shè)計8</p><p>  5.1編寫詳細設(shè)計的目的8</p><p>  5.2單機版掃雷游戲的實現(xiàn)8&

4、lt;/p><p>  5.3完成單機版掃雷游戲界面設(shè)計9</p><p>  5.4單機游戲狀態(tài)轉(zhuǎn)換圖11</p><p>  5.5網(wǎng)絡(luò)掃雷的實現(xiàn)12</p><p>  6程序功能完善與優(yōu)化17</p><p>  6.1增加音樂效果17</p><p>  6.2保存功能17&l

5、t;/p><p>  6.3發(fā)送鼠標(biāo)功能的優(yōu)化17</p><p>  6.4增加排行榜功能17</p><p>  6.5增加首次點擊不會點到雷的功能18</p><p>  6.6增加網(wǎng)絡(luò)版雙方玩家點擊計數(shù)18</p><p>  6.7增加聊天功能19</p><p>  7網(wǎng)絡(luò)掃雷

6、游戲功能測試20</p><p><b>  8結(jié) 論28</b></p><p><b>  總 結(jié)29</b></p><p><b>  致 謝30</b></p><p>  參 考 文 獻31</p><p><b>

7、  附錄32</b></p><p><b>  摘 要</b></p><p>  本軟件是一款具有聯(lián)機功能的掃雷游戲,并且具有單機游戲功能。聯(lián)機功能采用C/S模型,通過服務(wù)器程序中轉(zhuǎn)消息,完成對游戲消息的傳送。程序功能豐富,具有多種難度,且?guī)в斜4?,排行榜,聊天等功能?lt;/p><p>  程序的設(shè)計采用了模塊化程序設(shè)計

8、的方法,對底層模塊和經(jīng)常被調(diào)用的函數(shù),進行封裝。使得單機掃雷游戲與網(wǎng)絡(luò)版的掃雷都可以共用底層的游戲邏輯。且使得在單機版的基礎(chǔ)上實現(xiàn)網(wǎng)絡(luò)功能變得簡單。</p><p>  游戲界面美觀,顯示的數(shù)字和地雷都用貼圖實現(xiàn)。</p><p>  關(guān)鍵詞:掃雷游戲;C/S模型;服務(wù)器;</p><p><b>  Abstract</b></p>

9、;<p>  This software is a mine sweeper game with online features and functionality with a single game. Online features using C / S model, the game send the the message through the server program . This program has

10、 a lot of functions,like a variety of difficulty, and with a save,high scores, chat and other functions. Program was designed with a modular design method, often called the bottom of the module and function of the pack

11、age. Makes the game stand-alone mine clearance and the network version of </p><p>  Key words:miner sweeper ;C/S model;server ;</p><p><b>  前言</b></p><p>  隨著計算機與網(wǎng)絡(luò)的普及,人

12、們生活水平的提高,電腦游戲越來越成為人們生活中不可或缺的一部分,在人們繁忙的工作之余,給人帶去歡樂與放松。而一款網(wǎng)絡(luò)游戲,因為能和真實存在的人一起互動,能和周圍的同伴一起游戲,更使得游戲的可玩性大大提高,使得人們更能的投入到游戲中去。</p><p>  隨著電腦游戲產(chǎn)業(yè)的規(guī)模越來越大,開發(fā)一款成功的電腦游戲靠個人之力已非易事。不過,隨著市場上開發(fā)的游戲產(chǎn)品越來越豐富,各種題材的游戲越來越多,創(chuàng)意已成為一款成功游

13、戲的最重要的特點。例如目前流行的游戲<<植物大戰(zhàn)僵尸>>,<<憤怒的小鳥>>,雖然都是一些很小的休閑游戲,但是因其特有的風(fēng)格,使得它們都大獲好評。</p><p>  掃雷游戲是Windows操作系統(tǒng)自帶的一款小游戲,在過去的幾年里,Windows操作系統(tǒng)歷經(jīng)數(shù)次換代更新,變得越來越龐大、復(fù)雜,功能也越來越強大,但是這款小游戲依然是該系統(tǒng)裝機必備的軟件,可見這款小游

14、戲受到越來越多人的喜愛。</p><p>  我的畢業(yè)設(shè)計題目為2D單機版/網(wǎng)絡(luò)版掃雷。單機版掃雷作為一款windows平臺上最為普及的游戲,玩過的人不計其數(shù),對大部分人來說,掃雷游戲不再具有吸引力。可是掃雷網(wǎng)絡(luò)版,卻是一款全新的游戲。由于其網(wǎng)絡(luò)功能實現(xiàn),為掃雷增添了新的趣味,再次豐富了游戲的可玩性。由于設(shè)計任務(wù)書中的對程序設(shè)計的具體要求較少,于是,我就有了很多可以自由發(fā)揮的空間,如對網(wǎng)絡(luò)掃雷游戲玩法的設(shè)定,對網(wǎng)

15、絡(luò)模塊的設(shè)計等,都是秉著實用與簡單的原則進行設(shè)計的。</p><p>  程序的編寫按照的要求,分為兩大模塊,單機版與網(wǎng)絡(luò)版。而其中的單機版,參考windows xp上的掃雷版本,基本實現(xiàn)了該版本掃雷游戲所具有的功能。而網(wǎng)絡(luò)版的掃雷,使用tcp/ip協(xié)議,采用c/s模型架構(gòu),能夠?qū)崿F(xiàn)兩人一起玩同一局掃雷游戲,且服務(wù)器支持多人在線功能。</p><p><b>  1掃雷游戲概述&

16、lt;/b></p><p><b>  1.1基本信息</b></p><p>  掃雷游戲英文名稱為mine sweeper,屬于益智類游戲。通過鼠標(biāo)即可操作游戲。游戲特點為操作簡單,易于上手。</p><p>  1.2 游戲玩法簡介</p><p>  在游戲菜單上,單擊開局。通過鼠標(biāo)單擊即可挖開方塊。如果

17、挖開的是地雷,則輸?shù)粲螒?。如果方塊上出現(xiàn)數(shù)字,則表示在其周圍的八個方塊中共有多少顆地雷。 由玩家逐個翻開方塊,以找出所有地雷為最終游戲目標(biāo)。如果玩家翻開所有非地雷的方塊,則游戲通關(guān)。且根據(jù)游戲計時,判定玩家是否打破了在當(dāng)前難度下的最短記錄,如果是新紀錄,則提示玩家輸入姓名,進入游戲高分榜。</p><p>  地雷的位置初始時隨機生成??梢越o確定是雷的格子通過右鍵進行標(biāo)記。如果無法判定某方塊是否有雷,請用右鍵單擊

18、兩次給它標(biāo)記一個問號 (?)。之后,可以用鼠標(biāo)右鍵單擊方塊一次將該方塊標(biāo)記為地雷或者或用鼠標(biāo)右鍵單擊方塊兩次去掉標(biāo)記。</p><p>  游戲除了有中級高級初級難度之外,還允許用戶自定義游戲難度。即設(shè)定格子的高度,寬度,及雷的數(shù)量。</p><p>  網(wǎng)絡(luò)掃雷游戲的玩法與單機游戲相同,且可以兩個人玩在不同的主機上一起玩同一盤掃雷游戲。</p><p>  2 系

19、統(tǒng)平臺與技術(shù)選擇</p><p>  2.1開發(fā)語言與工具</p><p>  程序使用c#語言,開發(fā)平臺為vs2008。c#語言因其強大的類庫與能夠十分簡便的使用圖形界面而著稱,可以快速的開發(fā)一款桌面應(yīng)用軟件。而且其具有強大的面向?qū)ο缶幊痰哪芰?使得程序功能模塊的劃分與實現(xiàn)更為容易。</p><p>  Visual Studio 2008 包括各種增強功能,例如

20、可視化設(shè)計器(使用 。NET Framework 3。5 加速開發(fā))、以及能夠加速開發(fā)和處理所有類型數(shù)據(jù)的語言增強功能。</p><p><b>  2.2技術(shù)選擇</b></p><p>  程序的開發(fā)使發(fā)如題目的要求,分為兩大模塊,單機版與網(wǎng)絡(luò)版。</p><p>  單機版主要參考已有的windows xp上的掃雷版本,根據(jù)所需實現(xiàn)的功能

21、,利用c#中的事件處理機制,實現(xiàn)相應(yīng)各種游戲邏輯。</p><p>  網(wǎng)絡(luò)版的掃雷,使用tcp/ip協(xié)議,c/s模型架構(gòu)。之所以采用此種模式,是因為相較于UDP而言,我更為熟悉tcp。雖然使用c/s模型還要寫相應(yīng)的服務(wù)器程序,但是也因為有了服務(wù)器,能夠為網(wǎng)絡(luò)版掃雷很容易的實現(xiàn)一些其它功能,如多人同時聊天,知道對方的游戲狀態(tài)等。</p><p>  程序使用到了多線程技術(shù)。因此服務(wù)器支持多

22、位玩家同時連接到服務(wù)器。服務(wù)器為每一位玩家打開一個阻塞socket,在一個單獨的線程中,接受客戶端傳來的消息。</p><p>  消息的傳送與處理采用命令頭加信息內(nèi)容的方式。即根據(jù)發(fā)出命令的類別不同,使用獨一的字符串的表示,添加在所要發(fā)送消息的前面。然后接受消息時,先分離命令頭與內(nèi)容,根據(jù)命令頭,采用不同的函數(shù)去處理內(nèi)容。</p><p><b>  3掃雷游戲需求分析<

23、/b></p><p>  3.1編寫需求分析的目的</p><p>  需求分析的主要任務(wù)即詳細的找出程序所需要的各種功能實現(xiàn)。本程序為掃雷游戲的實現(xiàn),首先是要實現(xiàn)掃雷游戲的基本功能,根據(jù)掃雷游戲的玩法,設(shè)計程序,實現(xiàn)程序功能。然后,將其添加為可以聯(lián)機的網(wǎng)絡(luò)版掃雷游戲。</p><p><b>  3.2功組織結(jié)構(gòu)圖</b></p

24、><p>  根據(jù)任務(wù)書的要求,做出如下需求分析,如圖3-1所示:</p><p>  圖3-1功能需求組織結(jié)構(gòu)圖</p><p>  4掃雷游戲軟件總體設(shè)計</p><p>  4.1主要功能模塊劃分</p><p>  整個程序的架構(gòu)都由模塊化結(jié)構(gòu),分層結(jié)構(gòu)的思想設(shè)計完成。</p><p>  

25、從設(shè)計上主要分為兩大模塊</p><p>  1.底層邏輯模塊:底層主要由兩大模塊構(gòu)成,也是程序底層邏輯所需要的主 要功能。</p><p>  a) 游戲邏輯模塊:完成掃雷游戲時的各種邏輯</p><p>  b) 通信模塊 :完成客戶端與服務(wù)器之間數(shù)據(jù)的收發(fā)</p><p>  2.界程序設(shè)計的實現(xiàn)面功能模塊:界面模塊屬于上層模塊

26、,調(diào)用底層模塊提供的各種借口,完成游戲游戲功能的實現(xiàn)。并且提供豐富的人機交互界面,方便用戶操作 </p><p>  程序主要功能組織結(jié)構(gòu)圖如圖4-1 </p><p>  圖4-1 程序各模塊組織結(jié)構(gòu)圖</p><p>  游戲邏輯模塊功能細分的組織結(jié)構(gòu)圖如圖4-2所示:</p><p>  圖4-2 游戲邏輯模塊的組織結(jié)構(gòu)

27、圖</p><p><b>  4.2設(shè)計步驟流程</b></p><p>  程序設(shè)計的流程主要為先實現(xiàn)單機掃雷,然后為單機掃雷添加上網(wǎng)絡(luò)模塊。然后再利用同樣的網(wǎng)絡(luò)模塊開發(fā)出服務(wù)器端程序,提供信息的中轉(zhuǎn)服務(wù)。</p><p>  單機掃雷的系統(tǒng)流程圖如圖4-3 所示</p><p>  圖4-3 單機掃雷系統(tǒng)流程圖&l

28、t;/p><p>  網(wǎng)絡(luò)掃雷的系統(tǒng)流程圖如圖4-4 所示</p><p>  圖4-4網(wǎng)絡(luò)掃雷系統(tǒng)流程圖</p><p>  最終,在實現(xiàn)了網(wǎng)絡(luò)與單機游戲的基礎(chǔ)之上,在為程序添加上一些其它功能。如排行榜功能,保存功能等。并且對程序的部分地方予以優(yōu)化。</p><p>  5掃雷游戲程序詳細設(shè)計</p><p>  5.1

29、編寫詳細設(shè)計的目的</p><p>  清楚的說明各個模塊是如何實現(xiàn)的,各個模塊的主要功能,設(shè)計程序時的思路等內(nèi)容。</p><p>  5.2單機版掃雷游戲的實現(xiàn)</p><p>  5.2.1完成掃雷游戲底層邏輯的設(shè)計</p><p>  1.設(shè)計實現(xiàn):在程序中,使用一個SweepGame類完成所有底層的游戲邏輯功能。</p>

30、<p>  2.掃雷的底層表現(xiàn)形式:使用二維數(shù)組存儲當(dāng)前游戲狀態(tài)。2D掃雷游戲,抽象的說來,游戲的實質(zhì)即是在二維空間,不同的點之間所具有的不同狀態(tài),例如該格子是雷,可以用數(shù)字-1表示,該格子周圍一個雷也沒有,可以用0表示,。使用二維數(shù)組能夠完全表示所有地雷地圖的數(shù)據(jù)。并且,再利用另一個二維數(shù)組,用以表示當(dāng)前點是否已被用戶點擊。</p><p>  3.游戲基本屬性:地雷數(shù)組寬度,高度,地雷數(shù)量,游戲

31、難度。</p><p>  4.游戲狀態(tài) :游戲失敗,游戲通關(guān),游戲進行中</p><p>  5.SweepGame類主要功能:初始化游戲狀態(tài):生成隨機的地雷數(shù)組,根據(jù)生成的地雷位置,將其余并非地雷的位置填上數(shù)字,數(shù)字代表該格子周圍八個格子里,有幾個地雷。。</p><p>  設(shè)置游戲等級:游戲等級分為四等:初級,中級,高級和自定義。其中,其三者都由默認設(shè)

32、置設(shè)置游戲?qū)傩?。通過游戲等級的設(shè)置,間接設(shè)置游戲的基本屬性。</p><p>  掃雷邏輯實現(xiàn):即當(dāng)用戶點擊鼠標(biāo),通過界面?zhèn)魅氲絊weepGame時,是作為SweepGame二維數(shù)組中的一個下標(biāo)。通過該下標(biāo)所指示的地雷二維數(shù)組,判斷用戶是否踩到雷了,或者是數(shù)字。然后,在進行下一步判斷。</p><p>  5.2.2掃雷游戲狀態(tài)分類</p><p>  當(dāng)玩家掃雷時

33、,即用鼠標(biāo)左鍵點擊一個格子時,有以下幾種狀態(tài):</p><p>  踩到雷:游戲失敗,結(jié)束游戲并且在界面中顯示所有的雷。</p><p>  點到的是數(shù)字:顯示數(shù)字,游戲繼續(xù)。</p><p>  若玩家點到的格子周圍一顆雷也沒有時:就采用遞歸算法,繼續(xù)向周圍擴展。</p><p>  當(dāng)玩家點開所有的非雷的格子:提示游戲通過,并且結(jié)束游戲。

34、</p><p>  掃雷底層邏輯關(guān)鍵函數(shù)分析:</p><p>  public bool checkMines(int col, int row){}</p><p>  checkMine(int ,int) 函數(shù)的主要功能即是對傳入的格子的坐標(biāo),判斷當(dāng)前格子是什么,然后根據(jù)此,判斷下一步游戲該如何進行。 </p><p>

35、;  private void serch(int col,int row){}</p><p>  Serch(int col,int row) 該函數(shù)由checkMines函數(shù)調(diào)用,用于根據(jù)該格子所顯示的數(shù)字,實現(xiàn)游戲邏輯,該函數(shù)的實現(xiàn)使用了遞歸調(diào)用。如果數(shù)字非0,則直接顯示。否則,就要向該格子的周圍八個格子進行遞歸,繼續(xù)查找下去。并且,當(dāng)翻開所有非雷格子后,更改游戲狀態(tài)為游戲通關(guān)。</p>&

36、lt;p>  SweepGame類的功能如圖5-1所示:</p><p>  圖5-1 SweepGame類主要功能</p><p>  5.3完成單機版掃雷游戲界面設(shè)計</p><p>  5.3.1界面功能實現(xiàn)</p><p>  1模仿windows xp版本的掃雷界面,添加界面元素:</p><p>&l

37、t;b>  a)計時窗口</b></p><p>  b) 當(dāng)前地雷剩余數(shù)窗口</p><p><b>  c) 掃雷面板</b></p><p><b>  d) 菜單欄</b></p><p><b>  2.實現(xiàn)方式</b></p><

38、;p>  計時窗口與當(dāng)前地雷剩余數(shù)窗口用PictureBox控件實現(xiàn)。</p><p>  用一個SpiltContainer控件劃分兩個Panel,分別添加掃雷面板和計時、地雷數(shù)窗口。并且添加菜單控件。</p><p><b>  3.功能的實現(xiàn)</b></p><p><b>  a)菜單功能</b></p

39、><p>  開局:根據(jù)當(dāng)前游戲難度直接開始一盤新游戲</p><p>  初級,中級,高級游戲設(shè)定:根據(jù)選項設(shè)定游戲難度后開始新游戲。</p><p>  自定義難度:首先彈出游戲設(shè)置對話框,讓用戶設(shè)置掃雷游戲基本屬性,然后根據(jù)用戶設(shè)定的屬性開始新游戲。</p><p>  自定義對話框設(shè)計如圖5-2所示:</p><p&g

40、t;  圖5-2 自定義難度時彈出的對話框</p><p><b>  b)掃雷面板功能</b></p><p>  功能描述:使掃雷面板接受鼠標(biāo)事件,并根據(jù)不同的鍵,定義不同的功能。</p><p>  鼠標(biāo)左鍵定義:打開該鼠標(biāo)坐標(biāo)所在的格子,并以此點開始執(zhí)行掃雷邏輯。</p><p>  鼠標(biāo)右鍵定義:點擊一次時完成

41、地雷的標(biāo)記,點擊兩次對此點進行疑問標(biāo)記。點擊三次消除標(biāo)記。</p><p>  5.3.2尋找素材,完成貼圖</p><p>  游戲中需要用到很多貼圖,如下所示:地雷,雷爆炸,問號,0~8大小數(shù)字圖片等。從網(wǎng)絡(luò)上收索合適圖片,使用PhotoShop對其進行裁剪,變換大小等操作。</p><p>  5.3.3游戲界面與游戲底層邏輯之間的對應(yīng)關(guān)系</p>

42、<p>  根據(jù)格子的不同狀態(tài),顯示不同的圖片</p><p>  1.未點擊的格子---為一張藍色帶有立體感的純色圖片。</p><p>  2.點擊之后,非地雷的格子,顯示其周圍地雷的數(shù)量--直接有數(shù)字對應(yīng)相應(yīng)的數(shù)字圖片,若果數(shù)字為0,則顯示比未點擊格子淺色的圖片</p><p>  3.地雷--對應(yīng)地雷圖片</p><p>

43、;  4.點擊地雷--對應(yīng)地雷爆炸的圖片。</p><p>  5.3.4游戲界面展示</p><p>  最終生成的中級難度的游戲界面如圖5-3所示:</p><p>  圖5-3 中級游戲難度</p><p>  5.4單機游戲狀態(tài)轉(zhuǎn)換圖</p><p>  單機掃雷游戲的狀態(tài)轉(zhuǎn)換圖如圖5-4 所示,描述了根據(jù)不同

44、的事件,游戲的狀態(tài)的轉(zhuǎn)換:</p><p>  圖5-4單機掃雷狀態(tài)轉(zhuǎn)換圖</p><p>  5.5網(wǎng)絡(luò)掃雷的實現(xiàn)</p><p>  5.5.1完成掃雷客戶端通信模塊實現(xiàn)</p><p>  1.C#提供的TcpClient類的使用</p><p>  該類為 TCP 網(wǎng)絡(luò)服務(wù)提供客戶端連接,它提供了一些簡單的方法

45、,用于在同步阻止模式下通過網(wǎng)絡(luò)來連接、發(fā)送和接收流數(shù)據(jù)。</p><p>  tcpClient.Connect(ipAd, port);//連接服務(wù)器的代碼</p><p>  tcpClient..Send(data);//向服務(wù)器發(fā)送數(shù)據(jù)</p><p><b>  2.通信模塊</b></p><p>  a)設(shè)

46、計實現(xiàn):在程序中添加類Client,用它來完成與服務(wù)器的所有通信操作,如發(fā)送數(shù)據(jù),接受數(shù)據(jù)等操作。</p><p>  b)傳送數(shù)據(jù)分類及數(shù)據(jù)處理:考慮到游戲中,玩家之間要傳送數(shù)據(jù)的類型有很多,于是增加數(shù)據(jù)類NetCommand,其中封裝著所有需要傳送的文件類型的文件頭。例如鼠標(biāo)左鍵,用public const string LEFT_BUTTONDOWN ,在發(fā)送數(shù)據(jù)的時候,在數(shù)據(jù)文件之前先把這個文件頭傳送過去

47、,然后接收端或者是服務(wù)器根據(jù)文件頭的內(nèi)容,按照不同的方式處理數(shù)據(jù)。</p><p>  NetCommand類:使用NetCommand封裝了所有的命令頭。</p><p><b>  部分命令如下所示:</b></p><p>  public const string PRIVCE_CHAT = "privcchat";

48、//私聊</p><p>  public const string INVITE_JOIN = "invitejoin";//邀請游戲</p><p>  public const string AGREE_JOIN = "agreejoin";//同意加入游戲</p><p>  public const string N

49、O_AGREE_JOIN = "noagreejoin";</p><p>  public const string MOUSE_POS = "mousepos";//鼠標(biāo)位置</p><p>  public const string LEFT_BUTTONDOWN = "leftbuttondown";//鼠標(biāo)左鍵</

50、p><p>  c)傳送的消息的內(nèi)容:根據(jù)所傳遞消息類型的不同,傳送的內(nèi)容也發(fā)生相應(yīng)的變化。</p><p>  鼠標(biāo)消息內(nèi)容:1.左右鍵2.鼠標(biāo)的坐標(biāo)</p><p>  聊天消息內(nèi)容:1.是否為私聊2.聊天的文本消息</p><p>  地雷數(shù)據(jù)消息:地雷的分布</p><p>  d)傳送消息的目的:任何消息首先都是

51、傳給服務(wù)器,由服務(wù)器將消息處理之后,取得消息最后該發(fā)往那個服務(wù)器。所以,目的游戲客戶端的地址也作為消息內(nèi)容的一部分傳送。</p><p>  e)所需功能的分析:游戲客戶端能夠把聯(lián)機游戲時所需要的各種內(nèi)容都首先發(fā)送給服務(wù)器,服務(wù)器在轉(zhuǎn)發(fā)信息給其它客戶端。即通信模塊又分為兩大功能。發(fā)送與接收。</p><p>  游戲客戶端之間的通信由圖5-5所示:</p><p>

52、<b>  f)發(fā)送功能的實現(xiàn)</b></p><p>  通過底層函數(shù): private int sendVarData(Socket s,byte[] data),函數(shù)功能為使用Socket s,向服務(wù)器附送數(shù)據(jù),并且具有發(fā)送數(shù)據(jù)時,同時將數(shù)據(jù)的長度給發(fā)出去的功能。其實現(xiàn)原理為封裝了c#的socket類的send函數(shù)的使用。</p><p>  中間層函數(shù): pu

53、blic void sendData(string command,string msg)函數(shù),其目的為供其他函數(shù)傳入相應(yīng)的命令頭和數(shù)據(jù),然后其將命令與數(shù)據(jù)組合之后,再調(diào)用sendVarData將數(shù)據(jù)直接發(fā)送給服務(wù)器。</p><p>  最上層函數(shù):上層函數(shù)根據(jù)消息類型的不同,分別建立不同的函數(shù)。例如傳遞鼠標(biāo)消息到服務(wù)器的函數(shù)public void sendMousePosToParter(int xPos,

54、int yPos){},參數(shù)為傳入客戶端鼠標(biāo)坐標(biāo),然后將它封裝成數(shù)據(jù),調(diào)用sendData函數(shù),將其傳給服務(wù)器。</p><p>  h)處理傳遞過來的消息的實現(xiàn):</p><p>  底層函數(shù):程序使用函數(shù) void receiveData()接受數(shù)據(jù),然后,將數(shù)據(jù)分離為命令與內(nèi)容。再通過switch-case語句, 選擇不同的分支完成對命令的處理。</p><p&g

55、t;  高層處理函數(shù):處理命令的函數(shù)都以hand開頭,例如handMousePos與handMousePosChange一起,處理對方發(fā)送過來的鼠標(biāo)消息,然后更改自己窗體中,代表對方鼠標(biāo)的位置。</p><p>  5.5.2服務(wù)器的實現(xiàn)</p><p>  服務(wù)器的主要功能及實現(xiàn)</p><p>  a)顯示當(dāng)前連接的玩家列表</p><p&g

56、t;  實現(xiàn)方式:對每一個與服務(wù)器連接的客戶端,記錄其ip地址與端口,然后通過一個ListBox控件顯示。當(dāng)用戶斷開連接時,則清楚ListBox中該用戶的信息。</p><p>  b)轉(zhuǎn)發(fā)玩家之間發(fā)送的信息</p><p>  此功能的實現(xiàn)的過程如下:</p><p>  首先,得到客戶端傳過來的信息,然后將其分解成命令與內(nèi)容。并根據(jù)命令頭,選擇相應(yīng)處理程序。(此

57、過程與客戶端接收命令以后的過程相同,但不同之處在于,服務(wù)器是利用多線程,對每個客戶端都有一個單獨的serviceClient,接收并處理命令)</p><p>  在startListener中接收客戶端的連接,并新建線程,建立對這個客戶端socket的監(jiān)聽。 開啟一個監(jiān)聽工作線程的代碼如下:</p><p>  ThreadStart tStart = new ThreadStart(s

58、erviceClient);</p><p>  通過serviceClient里的阻塞套接字,等待客戶端發(fā)送過來的信息。并且交給消息處理函數(shù)處理。</p><p>  在消息處理函數(shù)的實現(xiàn)原理與客戶端的一樣,實現(xiàn)方式為由serverClient根據(jù)聊天命令頭進行調(diào)用,知道以后發(fā)送過來消息必然是聊天信息,通過handChat函數(shù),從clientSocket中將聊天信息讀出,然后,在根據(jù)客戶

59、端鏈表,將信息發(fā)送給其他用戶。</p><p>  c)發(fā)送服務(wù)器消息,客戶端之間的狀態(tài)信息</p><p>  服務(wù)器消息即為從服務(wù)器向所有用戶轉(zhuǎn)發(fā)的信息,實現(xiàn)方式為為所有的用戶建立一張鏈表,然后,遍歷所有的客戶,將信息發(fā)送給他們。</p><p>  public void sendSysMsg(string msg){}</p><p>

60、;  服務(wù)器要想向客戶端發(fā)送很多狀態(tài)信息,如有新客戶端加入,兩個客戶端一起進入游戲等。</p><p>  5.5.2開始聯(lián)機游戲時的狀態(tài)轉(zhuǎn)換圖</p><p>  網(wǎng)絡(luò)掃雷游戲時進行聯(lián)機游戲的狀態(tài)轉(zhuǎn)換圖如圖5-6所示:</p><p>  圖5-6 玩家A 邀請 玩家B 進行聯(lián)機游戲的狀態(tài)轉(zhuǎn)換圖</p><p>  說明:由于雙方玩的是同

61、一盤游戲,為保證雙方的數(shù)據(jù)相同,由游戲的邀請方生成地雷的信息,然后將該信息通過服務(wù)器傳給被邀請方。雙方游戲時,通過對鼠標(biāo)事件的處理,將本方的信息不斷的傳給對方。</p><p>  6程序功能完善與優(yōu)化</p><p><b>  6.1增加音樂效果</b></p><p>  1.目的:通過音樂的添加,使得游戲的效果得到增強。</p&g

62、t;<p>  2.實現(xiàn)方式:通過c#提供的SoundPlayer,添加并播放音樂。添加了三個音樂效果,點擊時的音效,地雷爆炸音效及游戲通過時的音樂。</p><p><b>  6.2保存功能</b></p><p>  1功能描述:在單機模式下,允許用戶在退出時保存當(dāng)前游戲,當(dāng)用戶下次進 行游戲時,提示用戶可以繼續(xù)上次保存的游戲。</p&g

63、t;<p>  2實現(xiàn)方法:把當(dāng)前的游戲信息,如游戲的雷數(shù),高度,寬度,地雷數(shù)組和當(dāng)前的訪問數(shù)組一起寫入一個文本文件,然后當(dāng)繼續(xù)游戲時,從文本文件中讀取數(shù)據(jù)并賦值給游戲的狀態(tài)變量。實現(xiàn)原理為c#語言中提供的訪問文本文件的類。</p><p>  6.3發(fā)送鼠標(biāo)功能的優(yōu)化</p><p>  1.功能描述:當(dāng)雙方進行聯(lián)機游戲時,要將本機的鼠標(biāo)信息發(fā)送給對方,以更新對方客戶端上的

64、信息。但是,由于鼠標(biāo)的移動,會產(chǎn)生大量的消息。而這些消息,對于掃雷并非都是需要的。因為,大量鼠標(biāo)的移動,也許都沒有移動出一個掃雷的小格子。</p><p>  2.優(yōu)化方式:設(shè)置兩個變量表示鼠標(biāo)舊的坐標(biāo),當(dāng)前坐標(biāo)與舊坐標(biāo)的距離大于某個值時,此時更新舊值,同時發(fā)送鼠標(biāo)值。</p><p>  6.4增加排行榜功能</p><p>  1.功能描述:記錄初級,中級,高級

65、難度中的最短時間作為排行榜。當(dāng)用戶當(dāng)前游戲通過后時間比記錄的時間短,則告知用戶,讓用戶輸入自己的姓名,并且記錄在排行榜上。</p><p>  2.實現(xiàn)方式:將排行榜信息記錄在一個文本文件中,每次開始游戲的時候,就將文本文件的信息讀取出來。并且,網(wǎng)絡(luò)版掃雷的排行榜文本文件保存在服務(wù)器上,當(dāng)游戲客戶端進行聯(lián)機游戲之時,由服務(wù)器讀取文件并且傳給用戶。當(dāng)用戶修改了這些信息時,還要講信息發(fā)送給服務(wù)器。讓服務(wù)器更新排行榜。

66、如圖6-1所示:</p><p>  圖6-1 單機版掃雷排行榜</p><p>  6.5增加首次點擊不會點到雷的功能</p><p>  1.功能描述:即當(dāng)用戶第一次點擊時,如果點到的是一個雷,則此時,程序會自動調(diào)整地雷的位置,然后,根據(jù)此重新生成相應(yīng)的游戲地圖。在網(wǎng)絡(luò)版游戲中也實現(xiàn)了此功能。</p><p>  2.實現(xiàn)方式:記錄是否是

67、首次點擊標(biāo)志,如是,則自動將雷向右移動至一個不是雷的位置。</p><p>  6.6增加網(wǎng)絡(luò)版雙方玩家點擊計數(shù)</p><p>  1.功能描述:即當(dāng)玩家點擊游戲的格子的時候,當(dāng)點擊的是一個沒有被點開的格子時,算作有效點擊一次,并在相應(yīng)的控件上顯示</p><p>  2.實現(xiàn)方式:在制作的聊天控件上,新創(chuàng)建兩個Label控件,并且,當(dāng)有鼠標(biāo)左鍵按鍵和接受到連接方

68、發(fā)送的鼠標(biāo)左鍵信息時,將Label控件上的數(shù)字增加。</p><p><b>  6.7增加聊天功能</b></p><p>  功能描述:在用戶連接服務(wù)器時起,就有群聊與私聊這兩個功能。當(dāng)用戶進行聯(lián)機游戲時,雙方自動變?yōu)樗搅摹?lt;/p><p>  聯(lián)機時聊天窗口如圖6-2所示:</p><p>  圖6-2 聯(lián)機聊天時

69、窗口界面</p><p>  說明:發(fā)送按鈕左邊的即為消息發(fā)送框,將消息寫入,然后發(fā)送,與自己聯(lián)機的玩家就會受到該信息,并且在發(fā)送按鈕上面的文本框中顯示。</p><p>  7網(wǎng)絡(luò)掃雷游戲功能測試</p><p>  1 通過菜單選項進入網(wǎng)絡(luò)版掃雷游戲,如圖7-1 所示</p><p>  圖7-1 游戲開始界面</p>&l

70、t;p>  選擇兩人游戲選項,開始進入網(wǎng)絡(luò)版掃雷游戲界面,如圖7-2所示:</p><p>  圖7-2 填寫游戲服務(wù)器的地址</p><p><b>  2.打開服務(wù)器</b></p><p>  此時,開啟服務(wù)器,服務(wù)器界面及功能如圖7-3所示所示:</p><p>  圖7-3 開啟服務(wù)器之后等待客戶端連接&

71、lt;/p><p>  當(dāng)有兩位玩家進入游戲時,服務(wù)器顯示信息如圖7-4所示:</p><p>  圖 7-4 有兩位客戶連接服務(wù)器</p><p>  服務(wù)器功能說明:服務(wù)器支持多客戶端的連接,當(dāng)有客戶端連接,或者退出時,消息欄里將顯示客戶端的狀態(tài)??梢栽谖谋究蛑休斎胄畔?,點擊發(fā)送按鈕,將所有的信息發(fā)送給所有連接的用戶。</p><p>  當(dāng)

72、客戶端連接到服務(wù)器時,客戶端顯示的狀態(tài)如圖7-5所示:</p><p>  圖7-5 當(dāng)客戶連接至服務(wù)器時收到的服務(wù)器信息</p><p><b>  3.聊天功能測試</b></p><p>  聊天有群聊與私聊的功能。</p><p>  私聊:通過點擊私聊按鈕,然后將文本框中的信息發(fā)送給當(dāng)前選則用戶,其他用戶則收

73、不到此消息。</p><p>  群聊:即發(fā)送的消息所有的人都能接收到。</p><p>  聊天功能的私聊與群聊功能測試如圖7-6所示:</p><p>  圖7-6 聊天功能測試</p><p>  4.邀請游戲功能測試</p><p>  步驟為:首先用鼠標(biāo)選中對方,然后點擊邀請,此時,客戶端會發(fā)送消息至所選的客

74、戶端。對方會受到對話框提示,問是否加入游戲。如圖7-7所示:</p><p>  圖7-7 收到對方邀請信息</p><p>  當(dāng)同意對方邀請時,則雙方同時進入新游戲,新游戲的地雷分布都是一樣的,而且,雙方的鼠標(biāo)都會在對方的窗口上同步顯示為一個小黑箭頭。如圖7-8所示:</p><p>  圖7-8 雙方一起玩掃雷游戲的界面</p><p>

75、;  當(dāng)其他游戲客戶端連接到服務(wù)器時,狀態(tài)欄會顯示當(dāng)前玩家正處于聯(lián)機游戲中,并且不能邀請其進行游戲。如圖7-9所示:</p><p>  圖7-9 不能邀請已進入游戲的玩家</p><p>  5.測試游戲難度調(diào)整</p><p>  設(shè)置為初級游戲難度如圖7-10 所示:</p><p>  圖7-10 初級游戲難度</p>

76、<p>  自定義游戲難度時,彈出設(shè)置難度的對話框,如圖7-11所示:</p><p>  圖7-11 自定義游戲?qū)υ捒?lt;/p><p>  設(shè)定游戲之后游戲顯示如圖7-12所示</p><p>  圖7-12 自己設(shè)定的游戲難度</p><p><b>  8結(jié) 論</b></p><p

77、>  經(jīng)過將近三個月的時間,基本完成了本次的畢業(yè)設(shè)計----2D單機/網(wǎng)絡(luò)掃雷游戲。本程序已經(jīng)過我與同學(xué)的多次測試,在不同的PC上通過網(wǎng)絡(luò)功能可以成功進行游戲,并且在帶寬充足的局域網(wǎng)內(nèi),游戲能夠運行的很流暢。</p><p>  雖然在程序網(wǎng)絡(luò)模塊設(shè)計的時候,有很多其它能夠使得程序聯(lián)網(wǎng)功能更好,更快的技術(shù),但由于本人自身開發(fā)經(jīng)驗的欠缺,所以選擇了最熟悉的C/S模型,服務(wù)器利用多線程與阻塞套接字的技術(shù)。但服務(wù)

78、器在少量客戶端連接的情況下,效率仍能夠滿足需要。</p><p>  在本系統(tǒng)的開發(fā)中,由于本人是初次開發(fā)軟件,在知識、經(jīng)驗方面都存在著不中間。另外,在整個開發(fā)的過程中,時間比較倉促。因此,該系統(tǒng)必然會存在一些缺陷和不足。</p><p><b>  總結(jié)</b></p><p>  畢業(yè)設(shè)計作為我大學(xué)四年學(xué)習(xí)的一個檢驗,無論在量上還是質(zhì)上都是

79、以前所做的課程設(shè)計所不能比擬的。為了圓滿的完成它,我也為此付出了大量的時間。去圖書館借書,查資料,請教老師等。出拿到任務(wù)書時,還對任務(wù)似懂非懂,但是經(jīng)過一段時間的學(xué)習(xí)與知識儲備,畢業(yè)設(shè)計的開發(fā)方案也漸漸在心中浮現(xiàn)。</p><p>  首先是選擇開發(fā)語言,c#雖然是自學(xué)的,但是由于其強大的GUI庫與編譯VS2008,所以我也就毫不猶豫的選擇了它。然后,一點一點,一個模塊一個模塊的去完成,完善程序。從底層開始寫起,

80、從字符界面的掃雷游戲開始做起,完成了游戲底層。接著,開發(fā)了一個單機版的游戲模型,圖形界面,鼠標(biāo)事件。當(dāng)時,心中滿是喜悅與激動。因為,離最后的完成,我已邁出了一大步。接著便是網(wǎng)絡(luò)模塊的添加了,由于對widows網(wǎng)絡(luò)編程的不熟悉,所以,專門的去熟悉socket的使用,為此,還照著書上的例子寫了一個聊天程序。而這個聊天程序,也直接成了我的C/S模型的原型。在技術(shù)上已經(jīng)沒有任何問題之后,我的開發(fā)也走上了正軌,每天寫一點,添加一些新的功能,就像修

81、房子一樣,最終,一個頗具規(guī)模的,具有完善功能的網(wǎng)絡(luò)掃雷就給我實現(xiàn)了。那時,心中的成就感讓我感覺到很快樂。</p><p>  寫程序,并且把程序?qū)懞?,并不是一件容易的事情,需要耐心,遇到問題更需要不放棄的毅力,恒心,和信心。還有,要多喝老師與同學(xué)交流,聽取別人的意見,是戰(zhàn)勝困難的一條捷徑。</p><p>  但是通過艱辛的努力,所收獲到的,不僅是一個程序的完成,而是通過自己努力戰(zhàn)勝困難的

82、喜悅,通過寫大量程序?qū)ψ约杭夹g(shù)的又一次促進,對程序設(shè)計又有更多的理解與感悟。也為以后,程序員的生涯做好了準備。</p><p><b>  致 謝</b></p><p>  不久的六月,就將離開校園了??催@自己一行一行寫出來的代碼,十分欣慰。通過四年的努力,使得自己已擁有一定的編程水平了,所以面對畢業(yè)設(shè)計的這個題目時,也沒有多分的擔(dān)憂。雖然面對著很多的問題,但是因

83、為周圍豐富的可以利用的資源,很多問題也就一個個被攻克了。</p><p>  在此,感謝指導(dǎo)老師xxx,在我有問題的時候,能夠為我解答。也感謝專業(yè)里幫助了我的的同學(xué),不僅解答了我的一些問題,而且擴寬了我的思路。最后,感謝西華大學(xué),為我提供了一個良好的學(xué)習(xí)平臺,為我的專業(yè)知識打下了堅固的基礎(chǔ)。</p><p><b>  參 考 文 獻</b></p>&

84、lt;p>  [1] C#2.0完全自學(xué)手冊/張立等編著 北京:機械工業(yè)出版社,2007</p><p>  [2] C#程序設(shè)計語言/(美) Anders Hejlsberg等著 顧雁宏,徐旭銘譯 北京:機械工業(yè)出版社</p><p>  [3] C#網(wǎng)絡(luò)編程技術(shù)教程 金華, 華進編著 人民郵電出版社 2009 </p><p>  [4] C# .N

85、ET課程設(shè)計指導(dǎo)/主編龔自霞, 高群 北京:北京大學(xué)出版社,2008.01 </p><p>  [5]C# 3.0從基礎(chǔ)到項目實戰(zhàn)/李海濤等編著 北京:化學(xué)工業(yè)出版社,2010 </p><p>  [6]C#與.NET 3.5高級程序設(shè)計/(美) Andrew Troelsen著 朱曄 ... [等] 譯 </p><p>  [7]C#基礎(chǔ)與實例教程 郝春

86、強編著 中國電力出版社 2005.08 </p><p>  [8]C# .NET課程設(shè)計指導(dǎo) 主編龔自霞, 高群 北京大學(xué)出版社 2008.01 </p><p>  [9]C#快速入門 B-power工作室編著 中國鐵道出版社 2001.08 </p><p>  [10]C#網(wǎng)絡(luò)程序設(shè)計 B-power工作室編著 中國鐵道出版社 2001 </p&

87、gt;<p><b>  附錄</b></p><p>  部分核心函數(shù)的代碼:</p><p>  1游戲邏輯類的核心函數(shù)</p><p>  SweepGame類作用:完成游戲底層邏輯的設(shè)定與處理,如用二維數(shù)組表現(xiàn)游戲,判定游戲勝負狀態(tài)。其部分核心函數(shù)將在下面介紹。</p><p>  serch,作用

88、是當(dāng)點到的是一個周圍沒有雷的格子時,將向周圍遞歸繼續(xù)點開格子。</p><p>  saveCurrentGame,將當(dāng)前所有游戲信息寫入到文本文件中。</p><p>  public class SweepGame</p><p><b>  {</b></p><p>  private void serch( i

89、nt h,int w) </p><p><b>  { </b></p><p>  //首先判斷是否越出了地雷矩陣</p><p>  if (h == 0 || w == 0 || h == this.height +1|| w == this.width+1)</p><p><b>  re

90、turn;</b></p><p>  if (this.rightButtonFlag[h, w] == SweepGame.RightButtonOne)</p><p><b>  return;</b></p><p>  if (this.visitedArray[h, w] == true)</p><

91、;p><b>  return;</b></p><p>  if (this.mineArray[h, w] == SweepGame.BLANK)</p><p><b>  {</b></p><p>  this.visitedArray[h, w] = true;//標(biāo)記為要顯示;</p>&

92、lt;p>  this.visitedBoxCount++;</p><p>  //并向這個點的 上下左右遞歸</p><p>  serch(h, w - 1);//left</p><p>  serch(h, w + 1); //right</p><p>  serch(h - 1, w);//up</p>&l

93、t;p>  serch(h + 1, w);//down</p><p>  serch(h-1, w - 1);// 左上</p><p>  serch(h-1, w + 1); //右上</p><p>  serch(h +1, w-1);//左下</p><p>  serch(h + 1, w+1);//右下</p&

94、gt;<p><b>  }</b></p><p>  else//此時,則此位置是一個數(shù)字</p><p><b>  {</b></p><p>  this.visitedArray[h, w] = true;//標(biāo)記為要顯示;</p><p>  this.visitedBo

95、xCount++;</p><p><b>  }</b></p><p>  if (this.visitedBoxCount == this.totalVisitedBox)</p><p><b>  {</b></p><p>  this.GameState = SweepGame.WIN

96、;</p><p>  //owner.showWinInfo();</p><p><b>  }</b></p><p><b>  }</b></p><p>  public void saveCurrentGame(string strGameFormInfo)</p>&l

97、t;p><b>  {</b></p><p>  //將當(dāng)前所有的游戲信息寫入文件之中.</p><p>  FileStream fs=new FileStream("gameSave.txt",FileMode.Create);</p><p>  StreamWriter sw = new StreamWrit

98、er(fs);</p><p>  if (strGameFormInfo != null)</p><p><b>  {</b></p><p>  //如果傳入的游戲界面信息字符串不為空的話,就將其寫入第一行</p><p>  sw.WriteLine(strGameFormInfo);</p>&

99、lt;p><b>  }</b></p><p>  //分隔符使用逗號隔開</p><p>  string div = ",";</p><p>  string data=""; </p><p>  //寫入高寬,寬度,雷數(shù),等級,游戲狀態(tài)</p>&l

100、t;p>  data += this.height +","+this.width + "," + this.mineNum + "," + gameLevel+","+this.GameState;</p><p>  sw.WriteLine(data);</p&g

101、t;<p>  //寫入地雷數(shù)組信息.</p><p>  for(int i=1;i<=height;i++)</p><p><b>  {</b></p><p>  data="";//清空data,一行一行的寫數(shù)據(jù).</p><p>  for (int j = 1; j

102、 <= width; j++)</p><p><b>  {</b></p><p>  data += mineArray[i, j].ToString();</p><p>  if(j!=width)//每個數(shù)字之間用,隔開</p><p>  data+=",";</p>

103、<p><b>  }</b></p><p>  sw.WriteLine(data);</p><p><b>  }</b></p><p>  for(int i=1;i<=height;i++)</p><p><b>  {</b></p&g

104、t;<p>  data="";//清空data,一行一行的寫數(shù)據(jù).</p><p>  for (int j = 1; j <=width; j++)</p><p><b>  {</b></p><p>  data += visitedArray[i, j];</p><p&g

105、t;  if(j!=width)//每個數(shù)字之間用,隔開</p><p>  data+=",";</p><p><b>  }</b></p><p>  sw.WriteLine(data);</p><p><b>  }</b></p><p>

106、  for (int i = 1; i <= height; i++)</p><p><b>  {</b></p><p>  data = "";//清空data,一行一行的寫數(shù)據(jù).</p><p>  for (int j = 1; j <= width; j++)</p><p>

107、;<b>  {</b></p><p>  data += rightButtonFlag[i, j];</p><p>  if (j != width)//每個數(shù)字之間用,隔開</p><p>  data += ",";</p><p><b>  }</b></p

108、><p>  sw.WriteLine(data);</p><p><b>  }</b></p><p>  sw.Flush();</p><p>  sw.Close();</p><p><b>  }</b></p><p><b>

109、  }</b></p><p>  2 通信模塊的核心代碼</p><p>  Client類即為完成了通信模塊客戶端的類,功能主要是發(fā)送與接收各種消息,并將接收到的數(shù)據(jù)交給邏輯模塊和界面模塊去處理。</p><p>  connectServer,根據(jù)給定的服務(wù)器IP地址與端口,連接服務(wù)器,并且保存本地的端口號。</p><p>

110、;  sendVarData,根據(jù)套接字發(fā)送時為無邊界套接字,所以將消息發(fā)送之前,將消息的長度發(fā)送給對方,使得接收方獲取指定大小的數(shù)據(jù)。</p><p>  recvVarData,對應(yīng)接受使用sendVarData發(fā)送的數(shù)據(jù)。</p><p>  recivedData,為客戶端的接受命令并且調(diào)用處理函數(shù)的工作線程。</p><p>  class Client&

111、lt;/p><p><b>  {</b></p><p>  public bool connectServer(string ipAd,int port)</p><p><b>  {</b></p><p>  tcpClient = new TcpClient();</p>&l

112、t;p>  Console.WriteLine("客戶端開始連接...");</p><p><b>  try</b></p><p><b>  {</b></p><p>  tcpClient.Connect(ipAd, port);</p><p>  }catc

113、h(SocketException e)</p><p><b>  { </b></p><p>  this.exceptionStr= e.Message;</p><p>  return false;</p><p><b>  }</b></p><p> 

114、 isConnected = true;//將連接狀態(tài)為真</p><p>  clientName = tcpClient.Client.LocalEndPoint.ToString();</p><p>  Thread t = new Thread(new ThreadStart(recivedData));</p><p>  t.Start();</

115、p><p>  return true;</p><p><b>  }</b></p><p>  private int sendVarData(Socket s,byte[] data)</p><p>  { //將data的長度轉(zhuǎn)換成字節(jié),并將其作為數(shù)據(jù)的首部先發(fā)送給服務(wù)器</p><p&g

116、t;  byte[] byteSize;</p><p>  int size = data.Length;</p><p>  byteSize = BitConverter.GetBytes(size);</p><p><b>  try</b></p><p><b>  {</b><

117、/p><p>  s.Send(byteSize);</p><p><b>  }</b></p><p>  catch (SocketException e)</p><p><b>  {</b></p><p><b>  return 0;</b>

118、;</p><p><b>  }</b></p><p>  int curOffset = 0,leftNum=size;//當(dāng)前發(fā)送數(shù)據(jù)偏移量與還剩余數(shù)據(jù)大小</p><p>  int num= 0;</p><p>  while (curOffset < size)</p><p&g

119、t;<b>  {</b></p><p>  num = s.Send(data, curOffset, leftNum, SocketFlags.None);</p><p>  curOffset += num;</p><p>  leftNum -= num;</p><p><b>  }</

120、b></p><p>  return curOffset;</p><p><b>  }</b></p><p>  private byte[] ReceiveVarData(Socket s)</p><p><b>  {</b></p><p>  byte

121、[] byteSize = new byte[4];</p><p><b>  int rev;</b></p><p><b>  try</b></p><p><b>  {</b></p><p>  rev = s.Receive(byteSize, 0, 4, S

122、ocketFlags.None); </p><p><b>  }</b></p><p>  catch (SocketException e)</p><p><b>  {</b></p><p>  MessageBox.Show("與服務(wù)器連接已經(jīng)斷開");<

123、/p><p>  this.stopClient();</p><p>  owner.changePanel(owner.panelConSer);</p><p>  return null;</p><p><b>  }</b></p><p>  if (rev == 0) { return

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論