版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rè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)平臺(tái)與技術(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è)計(jì)5</p><p> 4.1主要功能模塊劃分5</p><p> 4.2設(shè)計(jì)步驟流程6</p><p> 5掃雷游戲程序詳細(xì)設(shè)計(jì)8</p><p> 5.1編寫詳細(xì)設(shè)計(jì)的目的8</p><p> 5.2單機(jī)版掃雷游戲的實(shí)現(xiàn)8&
4、lt;/p><p> 5.3完成單機(jī)版掃雷游戲界面設(shè)計(jì)9</p><p> 5.4單機(jī)游戲狀態(tài)轉(zhuǎn)換圖11</p><p> 5.5網(wǎng)絡(luò)掃雷的實(shí)現(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增加首次點(diǎn)擊不會(huì)點(diǎn)到雷的功能18</p><p> 6.6增加網(wǎng)絡(luò)版雙方玩家點(diǎn)擊計(jì)數(shù)18</p><p> 6.7增加聊天功能19</p><p> 7網(wǎng)絡(luò)掃雷
6、游戲功能測(cè)試20</p><p><b> 8結(jié) 論28</b></p><p><b> 總 結(jié)29</b></p><p><b> 致 謝30</b></p><p> 參 考 文 獻(xiàn)31</p><p><b>
7、 附錄32</b></p><p><b> 摘 要</b></p><p> 本軟件是一款具有聯(lián)機(jī)功能的掃雷游戲,并且具有單機(jī)游戲功能。聯(lián)機(jī)功能采用C/S模型,通過服務(wù)器程序中轉(zhuǎn)消息,完成對(duì)游戲消息的傳送。程序功能豐富,具有多種難度,且?guī)в斜4妫判邪瘢奶斓裙δ堋?lt;/p><p> 程序的設(shè)計(jì)采用了模塊化程序設(shè)計(jì)
8、的方法,對(duì)底層模塊和經(jīng)常被調(diào)用的函數(shù),進(jìn)行封裝。使得單機(jī)掃雷游戲與網(wǎng)絡(luò)版的掃雷都可以共用底層的游戲邏輯。且使得在單機(jī)版的基礎(chǔ)上實(shí)現(xiàn)網(wǎng)絡(luò)功能變得簡單。</p><p> 游戲界面美觀,顯示的數(shù)字和地雷都用貼圖實(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> 隨著計(jì)算機(jī)與網(wǎng)絡(luò)的普及,人
12、們生活水平的提高,電腦游戲越來越成為人們生活中不可或缺的一部分,在人們繁忙的工作之余,給人帶去歡樂與放松。而一款網(wǎng)絡(luò)游戲,因?yàn)槟芎驼鎸?shí)存在的人一起互動(dòng),能和周圍的同伴一起游戲,更使得游戲的可玩性大大提高,使得人們更能的投入到游戲中去。</p><p> 隨著電腦游戲產(chǎn)業(yè)的規(guī)模越來越大,開發(fā)一款成功的電腦游戲靠個(gè)人之力已非易事。不過,隨著市場(chǎng)上開發(fā)的游戲產(chǎn)品越來越豐富,各種題材的游戲越來越多,創(chuàng)意已成為一款成功游
13、戲的最重要的特點(diǎn)。例如目前流行的游戲<<植物大戰(zhàn)僵尸>>,<<憤怒的小鳥>>,雖然都是一些很小的休閑游戲,但是因其特有的風(fēng)格,使得它們都大獲好評(píng)。</p><p> 掃雷游戲是Windows操作系統(tǒng)自帶的一款小游戲,在過去的幾年里,Windows操作系統(tǒng)歷經(jīng)數(shù)次換代更新,變得越來越龐大、復(fù)雜,功能也越來越強(qiáng)大,但是這款小游戲依然是該系統(tǒng)裝機(jī)必備的軟件,可見這款小游
14、戲受到越來越多人的喜愛。</p><p> 我的畢業(yè)設(shè)計(jì)題目為2D單機(jī)版/網(wǎng)絡(luò)版掃雷。單機(jī)版掃雷作為一款windows平臺(tái)上最為普及的游戲,玩過的人不計(jì)其數(shù),對(duì)大部分人來說,掃雷游戲不再具有吸引力??墒菕呃拙W(wǎng)絡(luò)版,卻是一款全新的游戲。由于其網(wǎng)絡(luò)功能實(shí)現(xiàn),為掃雷增添了新的趣味,再次豐富了游戲的可玩性。由于設(shè)計(jì)任務(wù)書中的對(duì)程序設(shè)計(jì)的具體要求較少,于是,我就有了很多可以自由發(fā)揮的空間,如對(duì)網(wǎng)絡(luò)掃雷游戲玩法的設(shè)定,對(duì)網(wǎng)
15、絡(luò)模塊的設(shè)計(jì)等,都是秉著實(shí)用與簡單的原則進(jìn)行設(shè)計(jì)的。</p><p> 程序的編寫按照的要求,分為兩大模塊,單機(jī)版與網(wǎng)絡(luò)版。而其中的單機(jī)版,參考windows xp上的掃雷版本,基本實(shí)現(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)即可操作游戲。游戲特點(diǎn)為操作簡單,易于上手。</p><p> 1.2 游戲玩法簡介</p><p> 在游戲菜單上,單擊開局。通過鼠標(biāo)單擊即可挖開方塊。如果
17、挖開的是地雷,則輸?shù)粲螒颉H绻綁K上出現(xiàn)數(shù)字,則表示在其周圍的八個(gè)方塊中共有多少顆地雷。 由玩家逐個(gè)翻開方塊,以找出所有地雷為最終游戲目標(biāo)。如果玩家翻開所有非地雷的方塊,則游戲通關(guān)。且根據(jù)游戲計(jì)時(shí),判定玩家是否打破了在當(dāng)前難度下的最短記錄,如果是新紀(jì)錄,則提示玩家輸入姓名,進(jìn)入游戲高分榜。</p><p> 地雷的位置初始時(shí)隨機(jī)生成??梢越o確定是雷的格子通過右鍵進(jìn)行標(biāo)記。如果無法判定某方塊是否有雷,請(qǐng)用右鍵單擊
18、兩次給它標(biāo)記一個(gè)問號(hào) (?)。之后,可以用鼠標(biāo)右鍵單擊方塊一次將該方塊標(biāo)記為地雷或者或用鼠標(biāo)右鍵單擊方塊兩次去掉標(biāo)記。</p><p> 游戲除了有中級(jí)高級(jí)初級(jí)難度之外,還允許用戶自定義游戲難度。即設(shè)定格子的高度,寬度,及雷的數(shù)量。</p><p> 網(wǎng)絡(luò)掃雷游戲的玩法與單機(jī)游戲相同,且可以兩個(gè)人玩在不同的主機(jī)上一起玩同一盤掃雷游戲。</p><p> 2 系
19、統(tǒng)平臺(tái)與技術(shù)選擇</p><p> 2.1開發(fā)語言與工具</p><p> 程序使用c#語言,開發(fā)平臺(tái)為vs2008。c#語言因其強(qiáng)大的類庫與能夠十分簡便的使用圖形界面而著稱,可以快速的開發(fā)一款桌面應(yīng)用軟件。而且其具有強(qiáng)大的面向?qū)ο缶幊痰哪芰?使得程序功能模塊的劃分與實(shí)現(xiàn)更為容易。</p><p> Visual Studio 2008 包括各種增強(qiáng)功能,例如
20、可視化設(shè)計(jì)器(使用 。NET Framework 3。5 加速開發(fā))、以及能夠加速開發(fā)和處理所有類型數(shù)據(jù)的語言增強(qiáng)功能。</p><p><b> 2.2技術(shù)選擇</b></p><p> 程序的開發(fā)使發(fā)如題目的要求,分為兩大模塊,單機(jī)版與網(wǎng)絡(luò)版。</p><p> 單機(jī)版主要參考已有的windows xp上的掃雷版本,根據(jù)所需實(shí)現(xiàn)的功能
21、,利用c#中的事件處理機(jī)制,實(shí)現(xiàn)相應(yīng)各種游戲邏輯。</p><p> 網(wǎng)絡(luò)版的掃雷,使用tcp/ip協(xié)議,c/s模型架構(gòu)。之所以采用此種模式,是因?yàn)橄噍^于UDP而言,我更為熟悉tcp。雖然使用c/s模型還要寫相應(yīng)的服務(wù)器程序,但是也因?yàn)橛辛朔?wù)器,能夠?yàn)榫W(wǎng)絡(luò)版掃雷很容易的實(shí)現(xiàn)一些其它功能,如多人同時(shí)聊天,知道對(duì)方的游戲狀態(tài)等。</p><p> 程序使用到了多線程技術(shù)。因此服務(wù)器支持多
22、位玩家同時(shí)連接到服務(wù)器。服務(wù)器為每一位玩家打開一個(gè)阻塞socket,在一個(gè)單獨(dú)的線程中,接受客戶端傳來的消息。</p><p> 消息的傳送與處理采用命令頭加信息內(nèi)容的方式。即根據(jù)發(fā)出命令的類別不同,使用獨(dú)一的字符串的表示,添加在所要發(fā)送消息的前面。然后接受消息時(shí),先分離命令頭與內(nèi)容,根據(jù)命令頭,采用不同的函數(shù)去處理內(nèi)容。</p><p><b> 3掃雷游戲需求分析<
23、/b></p><p> 3.1編寫需求分析的目的</p><p> 需求分析的主要任務(wù)即詳細(xì)的找出程序所需要的各種功能實(shí)現(xiàn)。本程序?yàn)閽呃子螒虻膶?shí)現(xiàn),首先是要實(shí)現(xiàn)掃雷游戲的基本功能,根據(jù)掃雷游戲的玩法,設(shè)計(jì)程序,實(shí)現(xiàn)程序功能。然后,將其添加為可以聯(lián)機(jī)的網(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è)計(jì)</p><p> 4.1主要功能模塊劃分</p><p> 整個(gè)程序的架構(gòu)都由模塊化結(jié)構(gòu),分層結(jié)構(gòu)的思想設(shè)計(jì)完成。</p><p>
25、從設(shè)計(jì)上主要分為兩大模塊</p><p> 1.底層邏輯模塊:底層主要由兩大模塊構(gòu)成,也是程序底層邏輯所需要的主 要功能。</p><p> a) 游戲邏輯模塊:完成掃雷游戲時(shí)的各種邏輯</p><p> b) 通信模塊 :完成客戶端與服務(wù)器之間數(shù)據(jù)的收發(fā)</p><p> 2.界程序設(shè)計(jì)的實(shí)現(xiàn)面功能模塊:界面模塊屬于上層模塊
26、,調(diào)用底層模塊提供的各種借口,完成游戲游戲功能的實(shí)現(xiàn)。并且提供豐富的人機(jī)交互界面,方便用戶操作 </p><p> 程序主要功能組織結(jié)構(gòu)圖如圖4-1 </p><p> 圖4-1 程序各模塊組織結(jié)構(gòu)圖</p><p> 游戲邏輯模塊功能細(xì)分的組織結(jié)構(gòu)圖如圖4-2所示:</p><p> 圖4-2 游戲邏輯模塊的組織結(jié)構(gòu)
27、圖</p><p><b> 4.2設(shè)計(jì)步驟流程</b></p><p> 程序設(shè)計(jì)的流程主要為先實(shí)現(xiàn)單機(jī)掃雷,然后為單機(jī)掃雷添加上網(wǎng)絡(luò)模塊。然后再利用同樣的網(wǎng)絡(luò)模塊開發(fā)出服務(wù)器端程序,提供信息的中轉(zhuǎn)服務(wù)。</p><p> 單機(jī)掃雷的系統(tǒng)流程圖如圖4-3 所示</p><p> 圖4-3 單機(jī)掃雷系統(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> 最終,在實(shí)現(xiàn)了網(wǎng)絡(luò)與單機(jī)游戲的基礎(chǔ)之上,在為程序添加上一些其它功能。如排行榜功能,保存功能等。并且對(duì)程序的部分地方予以優(yōu)化。</p><p> 5掃雷游戲程序詳細(xì)設(shè)計(jì)</p><p> 5.1
29、編寫詳細(xì)設(shè)計(jì)的目的</p><p> 清楚的說明各個(gè)模塊是如何實(shí)現(xiàn)的,各個(gè)模塊的主要功能,設(shè)計(jì)程序時(shí)的思路等內(nèi)容。</p><p> 5.2單機(jī)版掃雷游戲的實(shí)現(xiàn)</p><p> 5.2.1完成掃雷游戲底層邏輯的設(shè)計(jì)</p><p> 1.設(shè)計(jì)實(shí)現(xiàn):在程序中,使用一個(gè)SweepGame類完成所有底層的游戲邏輯功能。</p>
30、<p> 2.掃雷的底層表現(xiàn)形式:使用二維數(shù)組存儲(chǔ)當(dāng)前游戲狀態(tài)。2D掃雷游戲,抽象的說來,游戲的實(shí)質(zhì)即是在二維空間,不同的點(diǎn)之間所具有的不同狀態(tài),例如該格子是雷,可以用數(shù)字-1表示,該格子周圍一個(gè)雷也沒有,可以用0表示,。使用二維數(shù)組能夠完全表示所有地雷地圖的數(shù)據(jù)。并且,再利用另一個(gè)二維數(shù)組,用以表示當(dāng)前點(diǎn)是否已被用戶點(diǎn)擊。</p><p> 3.游戲基本屬性:地雷數(shù)組寬度,高度,地雷數(shù)量,游戲
31、難度。</p><p> 4.游戲狀態(tài) :游戲失敗,游戲通關(guān),游戲進(jìn)行中</p><p> 5.SweepGame類主要功能:初始化游戲狀態(tài):生成隨機(jī)的地雷數(shù)組,根據(jù)生成的地雷位置,將其余并非地雷的位置填上數(shù)字,數(shù)字代表該格子周圍八個(gè)格子里,有幾個(gè)地雷。。</p><p> 設(shè)置游戲等級(jí):游戲等級(jí)分為四等:初級(jí),中級(jí),高級(jí)和自定義。其中,其三者都由默認(rèn)設(shè)
32、置設(shè)置游戲?qū)傩?。通過游戲等級(jí)的設(shè)置,間接設(shè)置游戲的基本屬性。</p><p> 掃雷邏輯實(shí)現(xiàn):即當(dāng)用戶點(diǎn)擊鼠標(biāo),通過界面?zhèn)魅氲絊weepGame時(shí),是作為SweepGame二維數(shù)組中的一個(gè)下標(biāo)。通過該下標(biāo)所指示的地雷二維數(shù)組,判斷用戶是否踩到雷了,或者是數(shù)字。然后,在進(jìn)行下一步判斷。</p><p> 5.2.2掃雷游戲狀態(tài)分類</p><p> 當(dāng)玩家掃雷時(shí)
33、,即用鼠標(biāo)左鍵點(diǎn)擊一個(gè)格子時(shí),有以下幾種狀態(tài):</p><p> 踩到雷:游戲失敗,結(jié)束游戲并且在界面中顯示所有的雷。</p><p> 點(diǎn)到的是數(shù)字:顯示數(shù)字,游戲繼續(xù)。</p><p> 若玩家點(diǎn)到的格子周圍一顆雷也沒有時(shí):就采用遞歸算法,繼續(xù)向周圍擴(kuò)展。</p><p> 當(dāng)玩家點(diǎn)開所有的非雷的格子:提示游戲通過,并且結(jié)束游戲。
34、</p><p> 掃雷底層邏輯關(guān)鍵函數(shù)分析:</p><p> public bool checkMines(int col, int row){}</p><p> checkMine(int ,int) 函數(shù)的主要功能即是對(duì)傳入的格子的坐標(biāo),判斷當(dāng)前格子是什么,然后根據(jù)此,判斷下一步游戲該如何進(jìn)行。 </p><p>
35、; private void serch(int col,int row){}</p><p> Serch(int col,int row) 該函數(shù)由checkMines函數(shù)調(diào)用,用于根據(jù)該格子所顯示的數(shù)字,實(shí)現(xiàn)游戲邏輯,該函數(shù)的實(shí)現(xiàn)使用了遞歸調(diào)用。如果數(shù)字非0,則直接顯示。否則,就要向該格子的周圍八個(gè)格子進(jìn)行遞歸,繼續(xù)查找下去。并且,當(dāng)翻開所有非雷格子后,更改游戲狀態(tài)為游戲通關(guān)。</p>&
36、lt;p> SweepGame類的功能如圖5-1所示:</p><p> 圖5-1 SweepGame類主要功能</p><p> 5.3完成單機(jī)版掃雷游戲界面設(shè)計(jì)</p><p> 5.3.1界面功能實(shí)現(xiàn)</p><p> 1模仿windows xp版本的掃雷界面,添加界面元素:</p><p>&l
37、t;b> a)計(jì)時(shí)窗口</b></p><p> b) 當(dāng)前地雷剩余數(shù)窗口</p><p><b> c) 掃雷面板</b></p><p><b> d) 菜單欄</b></p><p><b> 2.實(shí)現(xiàn)方式</b></p><
38、;p> 計(jì)時(shí)窗口與當(dāng)前地雷剩余數(shù)窗口用PictureBox控件實(shí)現(xiàn)。</p><p> 用一個(gè)SpiltContainer控件劃分兩個(gè)Panel,分別添加掃雷面板和計(jì)時(shí)、地雷數(shù)窗口。并且添加菜單控件。</p><p><b> 3.功能的實(shí)現(xiàn)</b></p><p><b> a)菜單功能</b></p
39、><p> 開局:根據(jù)當(dāng)前游戲難度直接開始一盤新游戲</p><p> 初級(jí),中級(jí),高級(jí)游戲設(shè)定:根據(jù)選項(xiàng)設(shè)定游戲難度后開始新游戲。</p><p> 自定義難度:首先彈出游戲設(shè)置對(duì)話框,讓用戶設(shè)置掃雷游戲基本屬性,然后根據(jù)用戶設(shè)定的屬性開始新游戲。</p><p> 自定義對(duì)話框設(shè)計(jì)如圖5-2所示:</p><p&g
40、t; 圖5-2 自定義難度時(shí)彈出的對(duì)話框</p><p><b> b)掃雷面板功能</b></p><p> 功能描述:使掃雷面板接受鼠標(biāo)事件,并根據(jù)不同的鍵,定義不同的功能。</p><p> 鼠標(biāo)左鍵定義:打開該鼠標(biāo)坐標(biāo)所在的格子,并以此點(diǎn)開始執(zhí)行掃雷邏輯。</p><p> 鼠標(biāo)右鍵定義:點(diǎn)擊一次時(shí)完成
41、地雷的標(biāo)記,點(diǎn)擊兩次對(duì)此點(diǎn)進(jìn)行疑問標(biāo)記。點(diǎn)擊三次消除標(biāo)記。</p><p> 5.3.2尋找素材,完成貼圖</p><p> 游戲中需要用到很多貼圖,如下所示:地雷,雷爆炸,問號(hào),0~8大小數(shù)字圖片等。從網(wǎng)絡(luò)上收索合適圖片,使用PhotoShop對(duì)其進(jìn)行裁剪,變換大小等操作。</p><p> 5.3.3游戲界面與游戲底層邏輯之間的對(duì)應(yīng)關(guān)系</p>
42、<p> 根據(jù)格子的不同狀態(tài),顯示不同的圖片</p><p> 1.未點(diǎn)擊的格子---為一張藍(lán)色帶有立體感的純色圖片。</p><p> 2.點(diǎn)擊之后,非地雷的格子,顯示其周圍地雷的數(shù)量--直接有數(shù)字對(duì)應(yīng)相應(yīng)的數(shù)字圖片,若果數(shù)字為0,則顯示比未點(diǎn)擊格子淺色的圖片</p><p> 3.地雷--對(duì)應(yīng)地雷圖片</p><p>
43、; 4.點(diǎn)擊地雷--對(duì)應(yīng)地雷爆炸的圖片。</p><p> 5.3.4游戲界面展示</p><p> 最終生成的中級(jí)難度的游戲界面如圖5-3所示:</p><p> 圖5-3 中級(jí)游戲難度</p><p> 5.4單機(jī)游戲狀態(tài)轉(zhuǎn)換圖</p><p> 單機(jī)掃雷游戲的狀態(tài)轉(zhuǎn)換圖如圖5-4 所示,描述了根據(jù)不同
44、的事件,游戲的狀態(tài)的轉(zhuǎn)換:</p><p> 圖5-4單機(jī)掃雷狀態(tài)轉(zhuǎn)換圖</p><p> 5.5網(wǎng)絡(luò)掃雷的實(shí)現(xiàn)</p><p> 5.5.1完成掃雷客戶端通信模塊實(shí)現(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、計(jì)實(shí)現(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í)候,在數(shù)據(jù)文件之前先把這個(gè)文件頭傳送過去
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";//邀請(qǐng)游戲</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ā)往那個(gè)服務(wù)器。所以,目的游戲客戶端的地址也作為消息內(nèi)容的一部分傳送。</p><p> e)所需功能的分析:游戲客戶端能夠把聯(lián)機(jī)游戲時(shí)所需要的各種內(nèi)容都首先發(fā)送給服務(wù)器,服務(wù)器在轉(zhuǎn)發(fā)信息給其它客戶端。即通信模塊又分為兩大功能。發(fā)送與接收。</p><p> 游戲客戶端之間的通信由圖5-5所示:</p><p>
52、<b> f)發(fā)送功能的實(shí)現(xiàn)</b></p><p> 通過底層函數(shù): private int sendVarData(Socket s,byte[] data),函數(shù)功能為使用Socket s,向服務(wù)器附送數(shù)據(jù),并且具有發(fā)送數(shù)據(jù)時(shí),同時(shí)將數(shù)據(jù)的長度給發(fā)出去的功能。其實(shí)現(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)處理傳遞過來的消息的實(shí)現(xiàn):</p><p> 底層函數(shù):程序使用函數(shù) void receiveData()接受數(shù)據(jù),然后,將數(shù)據(jù)分離為命令與內(nèi)容。再通過switch-case語句, 選擇不同的分支完成對(duì)命令的處理。</p><p&g
55、t; 高層處理函數(shù):處理命令的函數(shù)都以hand開頭,例如handMousePos與handMousePosChange一起,處理對(duì)方發(fā)送過來的鼠標(biāo)消息,然后更改自己窗體中,代表對(duì)方鼠標(biāo)的位置。</p><p> 5.5.2服務(wù)器的實(shí)現(xiàn)</p><p> 服務(wù)器的主要功能及實(shí)現(xiàn)</p><p> a)顯示當(dāng)前連接的玩家列表</p><p&g
56、t; 實(shí)現(xiàn)方式:對(duì)每一個(gè)與服務(wù)器連接的客戶端,記錄其ip地址與端口,然后通過一個(gè)ListBox控件顯示。當(dāng)用戶斷開連接時(shí),則清楚ListBox中該用戶的信息。</p><p> b)轉(zhuǎn)發(fā)玩家之間發(fā)送的信息</p><p> 此功能的實(shí)現(xiàn)的過程如下:</p><p> 首先,得到客戶端傳過來的信息,然后將其分解成命令與內(nèi)容。并根據(jù)命令頭,選擇相應(yīng)處理程序。(此
57、過程與客戶端接收命令以后的過程相同,但不同之處在于,服務(wù)器是利用多線程,對(duì)每個(gè)客戶端都有一個(gè)單獨(dú)的serviceClient,接收并處理命令)</p><p> 在startListener中接收客戶端的連接,并新建線程,建立對(duì)這個(gè)客戶端socket的監(jiān)聽。 開啟一個(gè)監(jiān)聽工作線程的代碼如下:</p><p> ThreadStart tStart = new ThreadStart(s
58、erviceClient);</p><p> 通過serviceClient里的阻塞套接字,等待客戶端發(fā)送過來的信息。并且交給消息處理函數(shù)處理。</p><p> 在消息處理函數(shù)的實(shí)現(xiàn)原理與客戶端的一樣,實(shí)現(xiàn)方式為由serverClient根據(jù)聊天命令頭進(jìn)行調(diào)用,知道以后發(fā)送過來消息必然是聊天信息,通過handChat函數(shù),從clientSocket中將聊天信息讀出,然后,在根據(jù)客戶
59、端鏈表,將信息發(fā)送給其他用戶。</p><p> c)發(fā)送服務(wù)器消息,客戶端之間的狀態(tài)信息</p><p> 服務(wù)器消息即為從服務(wù)器向所有用戶轉(zhuǎn)發(fā)的信息,實(shí)現(xiàn)方式為為所有的用戶建立一張鏈表,然后,遍歷所有的客戶,將信息發(fā)送給他們。</p><p> public void sendSysMsg(string msg){}</p><p>
60、; 服務(wù)器要想向客戶端發(fā)送很多狀態(tài)信息,如有新客戶端加入,兩個(gè)客戶端一起進(jìn)入游戲等。</p><p> 5.5.2開始聯(lián)機(jī)游戲時(shí)的狀態(tài)轉(zhuǎn)換圖</p><p> 網(wǎng)絡(luò)掃雷游戲時(shí)進(jìn)行聯(lián)機(jī)游戲的狀態(tài)轉(zhuǎn)換圖如圖5-6所示:</p><p> 圖5-6 玩家A 邀請(qǐng) 玩家B 進(jìn)行聯(lián)機(jī)游戲的狀態(tài)轉(zhuǎn)換圖</p><p> 說明:由于雙方玩的是同
61、一盤游戲,為保證雙方的數(shù)據(jù)相同,由游戲的邀請(qǐng)方生成地雷的信息,然后將該信息通過服務(wù)器傳給被邀請(qǐng)方。雙方游戲時(shí),通過對(duì)鼠標(biāo)事件的處理,將本方的信息不斷的傳給對(duì)方。</p><p> 6程序功能完善與優(yōu)化</p><p><b> 6.1增加音樂效果</b></p><p> 1.目的:通過音樂的添加,使得游戲的效果得到增強(qiáng)。</p&g
62、t;<p> 2.實(shí)現(xiàn)方式:通過c#提供的SoundPlayer,添加并播放音樂。添加了三個(gè)音樂效果,點(diǎn)擊時(shí)的音效,地雷爆炸音效及游戲通過時(shí)的音樂。</p><p><b> 6.2保存功能</b></p><p> 1功能描述:在單機(jī)模式下,允許用戶在退出時(shí)保存當(dāng)前游戲,當(dāng)用戶下次進(jìn) 行游戲時(shí),提示用戶可以繼續(xù)上次保存的游戲。</p&g
63、t;<p> 2實(shí)現(xiàn)方法:把當(dāng)前的游戲信息,如游戲的雷數(shù),高度,寬度,地雷數(shù)組和當(dāng)前的訪問數(shù)組一起寫入一個(gè)文本文件,然后當(dāng)繼續(xù)游戲時(shí),從文本文件中讀取數(shù)據(jù)并賦值給游戲的狀態(tài)變量。實(shí)現(xiàn)原理為c#語言中提供的訪問文本文件的類。</p><p> 6.3發(fā)送鼠標(biāo)功能的優(yōu)化</p><p> 1.功能描述:當(dāng)雙方進(jìn)行聯(lián)機(jī)游戲時(shí),要將本機(jī)的鼠標(biāo)信息發(fā)送給對(duì)方,以更新對(duì)方客戶端上的
64、信息。但是,由于鼠標(biāo)的移動(dòng),會(huì)產(chǎn)生大量的消息。而這些消息,對(duì)于掃雷并非都是需要的。因?yàn)?大量鼠標(biāo)的移動(dòng),也許都沒有移動(dòng)出一個(gè)掃雷的小格子。</p><p> 2.優(yōu)化方式:設(shè)置兩個(gè)變量表示鼠標(biāo)舊的坐標(biāo),當(dāng)前坐標(biāo)與舊坐標(biāo)的距離大于某個(gè)值時(shí),此時(shí)更新舊值,同時(shí)發(fā)送鼠標(biāo)值。</p><p> 6.4增加排行榜功能</p><p> 1.功能描述:記錄初級(jí),中級(jí),高級(jí)
65、難度中的最短時(shí)間作為排行榜。當(dāng)用戶當(dāng)前游戲通過后時(shí)間比記錄的時(shí)間短,則告知用戶,讓用戶輸入自己的姓名,并且記錄在排行榜上。</p><p> 2.實(shí)現(xiàn)方式:將排行榜信息記錄在一個(gè)文本文件中,每次開始游戲的時(shí)候,就將文本文件的信息讀取出來。并且,網(wǎng)絡(luò)版掃雷的排行榜文本文件保存在服務(wù)器上,當(dāng)游戲客戶端進(jìn)行聯(lián)機(jī)游戲之時(shí),由服務(wù)器讀取文件并且傳給用戶。當(dāng)用戶修改了這些信息時(shí),還要講信息發(fā)送給服務(wù)器。讓服務(wù)器更新排行榜。
66、如圖6-1所示:</p><p> 圖6-1 單機(jī)版掃雷排行榜</p><p> 6.5增加首次點(diǎn)擊不會(huì)點(diǎn)到雷的功能</p><p> 1.功能描述:即當(dāng)用戶第一次點(diǎn)擊時(shí),如果點(diǎn)到的是一個(gè)雷,則此時(shí),程序會(huì)自動(dòng)調(diào)整地雷的位置,然后,根據(jù)此重新生成相應(yīng)的游戲地圖。在網(wǎng)絡(luò)版游戲中也實(shí)現(xiàn)了此功能。</p><p> 2.實(shí)現(xiàn)方式:記錄是否是
67、首次點(diǎn)擊標(biāo)志,如是,則自動(dòng)將雷向右移動(dòng)至一個(gè)不是雷的位置。</p><p> 6.6增加網(wǎng)絡(luò)版雙方玩家點(diǎn)擊計(jì)數(shù)</p><p> 1.功能描述:即當(dāng)玩家點(diǎn)擊游戲的格子的時(shí)候,當(dāng)點(diǎn)擊的是一個(gè)沒有被點(diǎn)開的格子時(shí),算作有效點(diǎn)擊一次,并在相應(yīng)的控件上顯示</p><p> 2.實(shí)現(xiàn)方式:在制作的聊天控件上,新創(chuàng)建兩個(gè)Label控件,并且,當(dāng)有鼠標(biāo)左鍵按鍵和接受到連接方
68、發(fā)送的鼠標(biāo)左鍵信息時(shí),將Label控件上的數(shù)字增加。</p><p><b> 6.7增加聊天功能</b></p><p> 功能描述:在用戶連接服務(wù)器時(shí)起,就有群聊與私聊這兩個(gè)功能。當(dāng)用戶進(jìn)行聯(lián)機(jī)游戲時(shí),雙方自動(dòng)變?yōu)樗搅摹?lt;/p><p> 聯(lián)機(jī)時(shí)聊天窗口如圖6-2所示:</p><p> 圖6-2 聯(lián)機(jī)聊天時(shí)
69、窗口界面</p><p> 說明:發(fā)送按鈕左邊的即為消息發(fā)送框,將消息寫入,然后發(fā)送,與自己聯(lián)機(jī)的玩家就會(huì)受到該信息,并且在發(fā)送按鈕上面的文本框中顯示。</p><p> 7網(wǎng)絡(luò)掃雷游戲功能測(cè)試</p><p> 1 通過菜單選項(xiàng)進(jìn)入網(wǎng)絡(luò)版掃雷游戲,如圖7-1 所示</p><p> 圖7-1 游戲開始界面</p>&l
70、t;p> 選擇兩人游戲選項(xiàng),開始進(jìn)入網(wǎng)絡(luò)版掃雷游戲界面,如圖7-2所示:</p><p> 圖7-2 填寫游戲服務(wù)器的地址</p><p><b> 2.打開服務(wù)器</b></p><p> 此時(shí),開啟服務(wù)器,服務(wù)器界面及功能如圖7-3所示所示:</p><p> 圖7-3 開啟服務(wù)器之后等待客戶端連接&
71、lt;/p><p> 當(dāng)有兩位玩家進(jìn)入游戲時(shí),服務(wù)器顯示信息如圖7-4所示:</p><p> 圖 7-4 有兩位客戶連接服務(wù)器</p><p> 服務(wù)器功能說明:服務(wù)器支持多客戶端的連接,當(dāng)有客戶端連接,或者退出時(shí),消息欄里將顯示客戶端的狀態(tài)??梢栽谖谋究蛑休斎胄畔ⅲc(diǎn)擊發(fā)送按鈕,將所有的信息發(fā)送給所有連接的用戶。</p><p> 當(dāng)
72、客戶端連接到服務(wù)器時(shí),客戶端顯示的狀態(tài)如圖7-5所示:</p><p> 圖7-5 當(dāng)客戶連接至服務(wù)器時(shí)收到的服務(wù)器信息</p><p><b> 3.聊天功能測(cè)試</b></p><p> 聊天有群聊與私聊的功能。</p><p> 私聊:通過點(diǎn)擊私聊按鈕,然后將文本框中的信息發(fā)送給當(dāng)前選則用戶,其他用戶則收
73、不到此消息。</p><p> 群聊:即發(fā)送的消息所有的人都能接收到。</p><p> 聊天功能的私聊與群聊功能測(cè)試如圖7-6所示:</p><p> 圖7-6 聊天功能測(cè)試</p><p> 4.邀請(qǐng)游戲功能測(cè)試</p><p> 步驟為:首先用鼠標(biāo)選中對(duì)方,然后點(diǎn)擊邀請(qǐng),此時(shí),客戶端會(huì)發(fā)送消息至所選的客
74、戶端。對(duì)方會(huì)受到對(duì)話框提示,問是否加入游戲。如圖7-7所示:</p><p> 圖7-7 收到對(duì)方邀請(qǐng)信息</p><p> 當(dāng)同意對(duì)方邀請(qǐng)時(shí),則雙方同時(shí)進(jìn)入新游戲,新游戲的地雷分布都是一樣的,而且,雙方的鼠標(biāo)都會(huì)在對(duì)方的窗口上同步顯示為一個(gè)小黑箭頭。如圖7-8所示:</p><p> 圖7-8 雙方一起玩掃雷游戲的界面</p><p>
75、; 當(dāng)其他游戲客戶端連接到服務(wù)器時(shí),狀態(tài)欄會(huì)顯示當(dāng)前玩家正處于聯(lián)機(jī)游戲中,并且不能邀請(qǐng)其進(jìn)行游戲。如圖7-9所示:</p><p> 圖7-9 不能邀請(qǐng)已進(jìn)入游戲的玩家</p><p> 5.測(cè)試游戲難度調(diào)整</p><p> 設(shè)置為初級(jí)游戲難度如圖7-10 所示:</p><p> 圖7-10 初級(jí)游戲難度</p>
76、<p> 自定義游戲難度時(shí),彈出設(shè)置難度的對(duì)話框,如圖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)過將近三個(gè)月的時(shí)間,基本完成了本次的畢業(yè)設(shè)計(jì)----2D單機(jī)/網(wǎng)絡(luò)掃雷游戲。本程序已經(jīng)過我與同學(xué)的多次測(cè)試,在不同的PC上通過網(wǎng)絡(luò)功能可以成功進(jìn)行游戲,并且在帶寬充足的局域網(wǎng)內(nèi),游戲能夠運(yùn)行的很流暢。</p><p> 雖然在程序網(wǎng)絡(luò)模塊設(shè)計(jì)的時(shí)候,有很多其它能夠使得程序聯(lián)網(wǎng)功能更好,更快的技術(shù),但由于本人自身開發(fā)經(jīng)驗(yàn)的欠缺,所以選擇了最熟悉的C/S模型,服務(wù)器利用多線程與阻塞套接字的技術(shù)。但服務(wù)
78、器在少量客戶端連接的情況下,效率仍能夠滿足需要。</p><p> 在本系統(tǒng)的開發(fā)中,由于本人是初次開發(fā)軟件,在知識(shí)、經(jīng)驗(yàn)方面都存在著不中間。另外,在整個(gè)開發(fā)的過程中,時(shí)間比較倉促。因此,該系統(tǒng)必然會(huì)存在一些缺陷和不足。</p><p><b> 總結(jié)</b></p><p> 畢業(yè)設(shè)計(jì)作為我大學(xué)四年學(xué)習(xí)的一個(gè)檢驗(yàn),無論在量上還是質(zhì)上都是
79、以前所做的課程設(shè)計(jì)所不能比擬的。為了圓滿的完成它,我也為此付出了大量的時(shí)間。去圖書館借書,查資料,請(qǐng)教老師等。出拿到任務(wù)書時(shí),還對(duì)任務(wù)似懂非懂,但是經(jīng)過一段時(shí)間的學(xué)習(xí)與知識(shí)儲(chǔ)備,畢業(yè)設(shè)計(jì)的開發(fā)方案也漸漸在心中浮現(xiàn)。</p><p> 首先是選擇開發(fā)語言,c#雖然是自學(xué)的,但是由于其強(qiáng)大的GUI庫與編譯VS2008,所以我也就毫不猶豫的選擇了它。然后,一點(diǎn)一點(diǎn),一個(gè)模塊一個(gè)模塊的去完成,完善程序。從底層開始寫起,
80、從字符界面的掃雷游戲開始做起,完成了游戲底層。接著,開發(fā)了一個(gè)單機(jī)版的游戲模型,圖形界面,鼠標(biāo)事件。當(dāng)時(shí),心中滿是喜悅與激動(dòng)。因?yàn)椋x最后的完成,我已邁出了一大步。接著便是網(wǎng)絡(luò)模塊的添加了,由于對(duì)widows網(wǎng)絡(luò)編程的不熟悉,所以,專門的去熟悉socket的使用,為此,還照著書上的例子寫了一個(gè)聊天程序。而這個(gè)聊天程序,也直接成了我的C/S模型的原型。在技術(shù)上已經(jīng)沒有任何問題之后,我的開發(fā)也走上了正軌,每天寫一點(diǎn),添加一些新的功能,就像修
81、房子一樣,最終,一個(gè)頗具規(guī)模的,具有完善功能的網(wǎng)絡(luò)掃雷就給我實(shí)現(xiàn)了。那時(shí),心中的成就感讓我感覺到很快樂。</p><p> 寫程序,并且把程序?qū)懞茫⒉皇且患菀椎氖虑?,需要耐心,遇到問題更需要不放棄的毅力,恒心,和信心。還有,要多喝老師與同學(xué)交流,聽取別人的意見,是戰(zhàn)勝困難的一條捷徑。</p><p> 但是通過艱辛的努力,所收獲到的,不僅是一個(gè)程序的完成,而是通過自己努力戰(zhàn)勝困難的
82、喜悅,通過寫大量程序?qū)ψ约杭夹g(shù)的又一次促進(jìn),對(duì)程序設(shè)計(jì)又有更多的理解與感悟。也為以后,程序員的生涯做好了準(zhǔn)備。</p><p><b> 致 謝</b></p><p> 不久的六月,就將離開校園了。看這自己一行一行寫出來的代碼,十分欣慰。通過四年的努力,使得自己已擁有一定的編程水平了,所以面對(duì)畢業(yè)設(shè)計(jì)的這個(gè)題目時(shí),也沒有多分的擔(dān)憂。雖然面對(duì)著很多的問題,但是因
83、為周圍豐富的可以利用的資源,很多問題也就一個(gè)個(gè)被攻克了。</p><p> 在此,感謝指導(dǎo)老師xxx,在我有問題的時(shí)候,能夠?yàn)槲医獯?。也感謝專業(yè)里幫助了我的的同學(xué),不僅解答了我的一些問題,而且擴(kuò)寬了我的思路。最后,感謝西華大學(xué),為我提供了一個(gè)良好的學(xué)習(xí)平臺(tái),為我的專業(yè)知識(shí)打下了堅(jiān)固的基礎(chǔ)。</p><p><b> 參 考 文 獻(xiàn)</b></p>&
84、lt;p> [1] C#2.0完全自學(xué)手冊(cè)/張立等編著 北京:機(jī)械工業(yè)出版社,2007</p><p> [2] C#程序設(shè)計(jì)語言/(美) Anders Hejlsberg等著 顧雁宏,徐旭銘譯 北京:機(jī)械工業(yè)出版社</p><p> [3] C#網(wǎng)絡(luò)編程技術(shù)教程 金華, 華進(jìn)編著 人民郵電出版社 2009 </p><p> [4] C# .N
85、ET課程設(shè)計(jì)指導(dǎo)/主編龔自霞, 高群 北京:北京大學(xué)出版社,2008.01 </p><p> [5]C# 3.0從基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)/李海濤等編著 北京:化學(xué)工業(yè)出版社,2010 </p><p> [6]C#與.NET 3.5高級(jí)程序設(shè)計(jì)/(美) Andrew Troelsen著 朱曄 ... [等] 譯 </p><p> [7]C#基礎(chǔ)與實(shí)例教程 郝春
86、強(qiáng)編著 中國電力出版社 2005.08 </p><p> [8]C# .NET課程設(shè)計(jì)指導(dǎo) 主編龔自霞, 高群 北京大學(xué)出版社 2008.01 </p><p> [9]C#快速入門 B-power工作室編著 中國鐵道出版社 2001.08 </p><p> [10]C#網(wǎng)絡(luò)程序設(shè)計(jì) B-power工作室編著 中國鐵道出版社 2001 </p&
87、gt;<p><b> 附錄</b></p><p> 部分核心函數(shù)的代碼:</p><p> 1游戲邏輯類的核心函數(shù)</p><p> SweepGame類作用:完成游戲底層邏輯的設(shè)定與處理,如用二維數(shù)組表現(xiàn)游戲,判定游戲勝負(fù)狀態(tài)。其部分核心函數(shù)將在下面介紹。</p><p> serch,作用
88、是當(dāng)點(diǎn)到的是一個(gè)周圍沒有雷的格子時(shí),將向周圍遞歸繼續(xù)點(diǎn)開格子。</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> //并向這個(gè)點(diǎn)的 上下左右遞歸</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í),則此位置是一個(gè)數(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> //分隔符使用逗號(hào)隔開</p><p> string div = ",";</p><p> string data=""; </p><p> //寫入高寬,寬度,雷數(shù),等級(jí),游戲狀態(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)//每個(gè)數(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)//每個(gè)數(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)//每個(gè)數(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ù)器,并且保存本地的端口號(hào)。</p><p>
110、; sendVarData,根據(jù)套接字發(fā)送時(shí)為無邊界套接字,所以將消息發(fā)送之前,將消息的長度發(fā)送給對(duì)方,使得接收方獲取指定大小的數(shù)據(jù)。</p><p> recvVarData,對(duì)應(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等.壓縮文件請(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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)掃雷游戲畢業(yè)設(shè)計(jì)
- 掃雷游戲畢業(yè)設(shè)計(jì)
- 掃雷游戲畢業(yè)設(shè)計(jì)論文
- 掃雷游戲畢業(yè)設(shè)計(jì) (2)
- 掃雷游戲畢業(yè)設(shè)計(jì)論文
- vb做掃雷游戲畢業(yè)設(shè)計(jì)
- 掃雷畢業(yè)設(shè)計(jì)---基于java掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)
- 掃雷游戲的設(shè)計(jì)與開發(fā)畢業(yè)設(shè)計(jì)
- java_掃雷游戲課程設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 基于java的掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 網(wǎng)絡(luò)掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 網(wǎng)絡(luò)棋牌游戲畢業(yè)設(shè)計(jì)
- vb掃雷游戲設(shè)計(jì)論文
- java+畢業(yè)設(shè)計(jì)+掃雷(程序)
- 掃雷游戲設(shè)計(jì)開題報(bào)告
- 網(wǎng)絡(luò)版掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn).pdf
- java課程設(shè)計(jì)-掃雷游戲
- 掃雷游戲課程設(shè)計(jì)報(bào)告
- 掃雷小游戲課程設(shè)計(jì)
- 畢業(yè)論文--掃雷游戲軟件設(shè)計(jì)與實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論