俄羅斯方塊分組對(duì)抗游戲的實(shí)現(xiàn)畢業(yè)論文_第1頁(yè)
已閱讀1頁(yè),還剩33頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  本科生畢業(yè)設(shè)計(jì)</b></p><p>  姓 名: 學(xué) 號(hào): </p><p>  學(xué) 院: 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 </p><p>  專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)  

2、 </p><p>  設(shè)計(jì)題目: 俄羅斯方塊分組對(duì)抗游戲的實(shí)現(xiàn) </p><p>  專 題: </p><p>  指導(dǎo)教師: 職 稱: </p><p>  2013 年 5

3、 月 </p><p>  XXXX大學(xué)畢業(yè)設(shè)計(jì)任務(wù)書</p><p>  學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 專業(yè)年級(jí) 學(xué)生姓名 </p><p>  任務(wù)下達(dá)日期:2013年 1 月 4 日</p><p>  畢業(yè)設(shè)計(jì)日期: 2013年 1月 4日至 2013年6月2日</p>

4、<p>  畢業(yè)設(shè)計(jì)題目:俄羅斯方塊分組對(duì)抗游戲的實(shí)現(xiàn)</p><p><b>  畢業(yè)設(shè)計(jì)專題題目:</b></p><p>  畢業(yè)設(shè)計(jì)主要內(nèi)容和要求:</p><p>  用戶可參與的俄羅斯方塊游戲;具體包括隨機(jī)給出不同的形狀下落填充給定的區(qū)域,若填滿一條便消掉,計(jì)分。若在游戲中各形狀填滿了給定區(qū)域,則游戲結(jié)束。</p&g

5、t;<p>  在此基礎(chǔ)上實(shí)現(xiàn)多人網(wǎng)絡(luò)對(duì)戰(zhàn),并且可以進(jìn)行分組對(duì)戰(zhàn),</p><p>  可以分3個(gè)組。要求根據(jù)消層情況獲得道具,并能夠使用道具進(jìn)行攻擊。</p><p>  院長(zhǎng)簽字: 指導(dǎo)教師簽字:</p><p>  XXXX畢業(yè)設(shè)計(jì)評(píng)閱教師評(píng)閱書</p><p>  評(píng)閱教師評(píng)語(yǔ)(①選題

6、的意義;②基礎(chǔ)理論及基本技能的掌握;③綜合運(yùn)用所學(xué)知識(shí)解決實(shí)際問(wèn)題的能力;③工作量的大??;④取得的主要成果及創(chuàng)新點(diǎn);⑤寫作的規(guī)范程度;⑥總體評(píng)價(jià)及建議成績(jī);⑦存在問(wèn)題;⑧是否同意答辯等):</p><p>  成 績(jī): 評(píng)閱教師簽字:</p><p>  年 月 日</p><p>  中國(guó)礦業(yè)大學(xué)畢

7、業(yè)設(shè)計(jì)答辯及綜合成績(jī)</p><p><b>  摘 要</b></p><p>  俄羅斯方塊(Tetris, 俄文:Тетрис)是一款從1988年起至今都風(fēng)靡全球的電視游戲機(jī)和掌上游戲機(jī)游戲,是落下型益智游戲的始祖。它是由俄羅斯人阿列克謝·帕基特諾夫發(fā)明的一款能鍛煉人的反應(yīng)能力、動(dòng)手能力等能力的教育軟件,故得此名。俄羅斯方塊的基本游戲規(guī)則是移動(dòng)、旋轉(zhuǎn)

8、和擺放游戲自動(dòng)隨機(jī)輸出的各種方塊,當(dāng)某一行或幾行(最多四行)完全充滿時(shí),即消失。由于具有數(shù)學(xué)性、動(dòng)態(tài)性,知名度,而且上手簡(jiǎn)單、老少皆宜,從而家喻戶曉,風(fēng)靡全世界。目前,人們?cè)诨诙砹_斯方塊在基于原有的設(shè)計(jì)原理上,發(fā)展出了許多新的不同類型的游戲,大大增加了這種游戲的趣味性,界面觀賞性,可玩性。游戲分為單機(jī)版、對(duì)戰(zhàn)版、分組對(duì)戰(zhàn)等多種游戲方式。</p><p>  本軟件在了解俄羅斯方塊設(shè)計(jì)原理的基礎(chǔ)之上,借助C/S軟

9、件模型,用CSocket套接字技術(shù)實(shí)現(xiàn)了一個(gè)網(wǎng)絡(luò)版的能進(jìn)行分組對(duì)抗的俄羅斯方塊游戲。該游戲軟件不僅實(shí)現(xiàn)了基本的俄羅斯方塊功能,并能支持俄羅斯方塊服務(wù)器的建立、客戶端接入等功能,在此基礎(chǔ)之上,添加了個(gè)性音效、分組對(duì)抗功能和道具使用等機(jī)制,從而改進(jìn)了傳統(tǒng)的簡(jiǎn)單俄羅斯方塊游戲,大大提高了游戲的趣味性、可玩性,使游戲畫面也更加具有觀賞性,人機(jī)交互性更強(qiáng)。本次開發(fā)所使用的開發(fā)工具為VC++ 6.0,使用的編程語(yǔ)言是C++。本文主要闡述了本俄羅斯方

10、塊軟件的開發(fā)方法以及實(shí)現(xiàn)的功能。</p><p>  關(guān)鍵詞:俄羅斯方塊;CSocket技術(shù);局域網(wǎng);VC++ </p><p><b>  ABSTRACT</b></p><p>  The Tetris (Tetris, the Russian: Тетрис) is a swept the world from 1988 to the

11、 present TV game consoles and handheld game consoles game,is the ancestor of falling puzzle game. It is exercise by the Russians Alexei Pajitnov invention a reaction ability, practical ability and ability of educational

12、software, it was this name. The basic rules of the game of Tetris is moved, rotated and placed the game automatically output random box disappears when a line or lines (up to four lines) completely fill</p><p&

13、gt;  The software based on the understanding of the design principles of Tetris, with the C / S software model, a network version can be grouped against the Tetris game Socket technique. The game software not only to ach

14、ieve the basic Tetris, and can support the establishment of the Tetris server, client access, on this basis, add a personalized sound, scrimmaging features and the use of props and other mechanisms in order to improve si

15、mple Tetris game, greatly increasing the game interesting, easy t</p><p>  Keywords:Tetris ; CSocket; LAN; VC++</p><p><b>  1緒論</b></p><p>  1.1俄羅斯方塊的背景</p><p

16、>  隨著電子信息技術(shù)的高速發(fā)展,電子類的游戲逐漸成為人們?nèi)粘蕵?lè)生活中不可缺失的一部分。俄羅斯方塊游戲是其中一種風(fēng)靡全球的電腦類游戲機(jī)和掌上型游戲機(jī)的游戲,它老少皆宜,而且是可以鍛煉人的反應(yīng)能力、動(dòng)手能力、全局統(tǒng)籌能力,并具有數(shù)學(xué)性、靈活性和良好的可玩性的一款教育軟件。隨著科技水平的發(fā)展,游戲開發(fā)技術(shù)的提升,由俄羅斯方塊衍生出來(lái)的各種經(jīng)典游戲比比皆是。</p><p>  1.2課題研究和發(fā)展?fàn)顩r<

17、/p><p>  俄羅斯方塊最早是在1985年6月由工作于莫斯科科學(xué)計(jì)算機(jī)中心的阿列克謝·帕基特諾夫在玩過(guò)一個(gè)拼圖游戲之后受到啟發(fā)而制作的一個(gè)以Electronica 60為平臺(tái)的游戲,后來(lái),隨著此游戲的熱銷,其版權(quán)問(wèn)題也一直糾纏不清,官司不斷。也導(dǎo)致幾家公司倒閉,一些公司獲益,并以此賺了很多錢,其中,最受關(guān)注的是1989年的Tengen和任天堂的官司,最終Tengen的權(quán)利被否決,而任天堂的請(qǐng)求或許。因此

18、,Tengen版的俄羅斯方塊不得不停止銷售,撤下貨架。而任天堂NES版Tetris同年在美國(guó)發(fā)售。全美銷量大約300萬(wàn)。與此同時(shí),和GB版Tetris捆綁銷售的Game Boy席卷美國(guó),美利堅(jiān)大地上刮起一陣方塊旋風(fēng)。 </p><p>  俄羅斯方塊游戲通過(guò)在container的頂端產(chǎn)生隨機(jī)的一個(gè)形狀的方塊,玩家通過(guò)選擇左移、右移、旋轉(zhuǎn)、下落等集中操作來(lái)使其盡可能整齊的疊在一起,當(dāng)某一行全部充滿時(shí),即消失。由這個(gè)

19、游戲過(guò)程可以看到,這款游戲不僅能鍛煉人的反應(yīng)能力、動(dòng)手能力,更能鍛煉我們統(tǒng)籌安排、隨機(jī)應(yīng)變的能力,而決不是像很多孩子的家長(zhǎng)所有的,能使孩子沉迷其中,降低智力、耽誤身心發(fā)展。</p><p>  1.3本軟件與傳統(tǒng)的俄羅斯方塊的異同</p><p>  俄羅斯方塊本身具有一個(gè)區(qū)別于其他很多游戲的特點(diǎn),就是只能在電子平臺(tái)上運(yùn)行,而不能用實(shí)物來(lái)進(jìn)行游戲,傳統(tǒng)的俄羅斯方塊游戲也有很多版本,他支持在

20、手機(jī)等工具上的單機(jī)模式,也支持在小游戲機(jī)上和電腦上的單機(jī)雙人對(duì)戰(zhàn)模式,本游戲相比傳統(tǒng)的俄羅斯方塊有很多相同之處,但也做了很多改進(jìn):</p><p>  相同點(diǎn):本游戲包含了單機(jī)俄羅斯方塊的主題框架,采用2維數(shù)組來(lái)表示每個(gè)方塊,均由七種方塊組成,分別是L型,反L型,Z型,反Z型,田字型,1型,T型?;舅惴ㄊ窍嗤模措S機(jī)產(chǎn)生一個(gè)方塊,根據(jù)玩家按鍵來(lái)響應(yīng)鍵盤事件和鼠標(biāo)事件,分別進(jìn)行右移、左移、旋轉(zhuǎn)和下落等操作。對(duì)每

21、一行是否充滿的判斷和消去也跟單機(jī)版是相似的思路。游戲邏輯相同,游戲從第一個(gè)方塊下落開始到游戲結(jié)束,整個(gè)流程是相同的。</p><p>  不同點(diǎn):本游戲在原來(lái)的簡(jiǎn)單模式的基礎(chǔ)上做了很多改進(jìn):</p><p>  1.在雙人對(duì)戰(zhàn)的基礎(chǔ)上進(jìn)行了擴(kuò)充,采用C/S模式,最多可容納六個(gè)人一起游戲,并且可隨意選擇自己的分組,共有A B C和自由人四組供選擇,進(jìn)入房間后可以選擇準(zhǔn)備游戲,當(dāng)有超過(guò)兩個(gè)隊(duì)伍

22、且所有人都準(zhǔn)備好時(shí),游戲開始。</p><p>  2.游戲在原來(lái)單純拼方塊的基礎(chǔ)上,增加了很多道具,玩家在消去多行的時(shí)候可隨機(jī)獲得道具,主要有消去幾行、增加幾行、全部消去、加速下落、減速下落等功能,玩家可根據(jù)需求對(duì)自己、隊(duì)友或者對(duì)手使用該道具。</p><p>  3.游戲在交互方式上比之前有很大改進(jìn),之前的單機(jī)游戲或者雙人對(duì)戰(zhàn)模式?jīng)]有辦法進(jìn)行交流,現(xiàn)在的游戲中添加了聊天界面,可以進(jìn)行溝

23、通,并且在使用相應(yīng)道具或者準(zhǔn)備開始游戲的時(shí)候都有音樂(lè),能讓參與游戲的玩家更放松心情,體會(huì)游戲的樂(lè)趣。</p><p>  2 俄羅斯方塊游戲的分析與設(shè)計(jì)</p><p>  2.1 俄羅斯方塊的設(shè)計(jì)原理和技術(shù)需求</p><p>  本軟件是基于單機(jī)版俄羅斯方塊的程序設(shè)計(jì)原理上的擴(kuò)展,在原來(lái)的基礎(chǔ)上加入了網(wǎng)絡(luò)互連,在原來(lái)的單機(jī)模式和雙人對(duì)戰(zhàn)模式上增加了網(wǎng)絡(luò)對(duì)戰(zhàn)模式。

24、即與原始的俄羅斯方塊的程序設(shè)計(jì)原理基本上是相同的,而方塊的模型建立,游戲的操作流程和游戲的過(guò)程中軟件進(jìn)行各種判斷的原理是相同的,但是與原始的俄羅斯方塊相比,本軟件在原有的基礎(chǔ)上又加入了一些新的理念和新的設(shè)計(jì)技術(shù)。比如說(shuō):新增加了網(wǎng)絡(luò)多人分組對(duì)戰(zhàn)、網(wǎng)絡(luò)聊天功能、新的道具模塊等設(shè)計(jì)。</p><p>  本軟件與傳統(tǒng)的單機(jī)版或雙人版俄羅斯方塊游戲具有一定的區(qū)別,傳統(tǒng)的俄羅斯方塊的設(shè)計(jì)模型如下圖2-1所示,本軟件的設(shè)計(jì)

25、模型如圖2-2所示。</p><p>  圖2-1 單機(jī)版俄羅斯方塊游戲模型圖</p><p>  圖2-2 本系統(tǒng)游戲模型</p><p>  從上兩圖中可以得出傳統(tǒng)的俄羅斯方塊模型與本軟件的游戲模型具有很大的不同,本軟件支持多人在線同時(shí)操作,更加豐富。傳統(tǒng)的俄羅斯方塊注重的是人機(jī)交換,而本軟件更注意的是人與人之間通過(guò)這個(gè)網(wǎng)絡(luò)平臺(tái)進(jìn)行的交互。</p>

26、<p>  本軟件為C/S模型。參與游戲的人的機(jī)器都作為客戶端客戶端,而服務(wù)器既可以是上述參與游戲的人的機(jī)器,也可以是單獨(dú)的一臺(tái)機(jī)器。首先由服務(wù)器端建立服務(wù)器,接下來(lái)準(zhǔn)備參與游戲的人可以打開客戶端通過(guò)連接服務(wù)器的IP地址進(jìn)去服務(wù)器,再服務(wù)器將所接受的用戶信息在返回給用戶。</p><p>  游戲運(yùn)行的原理如圖2-3所示。</p><p>  圖2-3 本游戲系統(tǒng)原理圖<

27、/p><p>  本軟件主要有以下幾個(gè)功能:</p><p>  1.建立服務(wù)器。在安裝了服務(wù)器端的電腦上打開服務(wù)器端輸入IP地址并建立服務(wù)器。</p><p>  2.玩家打開安裝的客戶端,并輸入自己的用戶名,通過(guò)特有的IP地址連接到服務(wù)器端所創(chuàng)建的服務(wù)器的房間。 </p><p>  3.連接到本服務(wù)器的所有玩家進(jìn)行分組并都準(zhǔn)備游戲,當(dāng)該房間

28、有至少兩個(gè)組的玩家準(zhǔn)備好了就可以進(jìn)行對(duì)戰(zhàn)了。</p><p>  4.游戲結(jié)束后,本軟件會(huì)對(duì)本局游戲各組玩家的積分和道具的使用狀況進(jìn)行統(tǒng)計(jì)。</p><p><b>  2.2可行性研究</b></p><p>  2.2.1設(shè)計(jì)目的 </p><p>  2.2.2可行性分析</p><p>

29、  管理可行性:本游戲的開發(fā)職位檢測(cè)自己大學(xué)四年所學(xué)到的知識(shí),是在基于傳統(tǒng)的俄羅斯方塊設(shè)計(jì)原理上新添加了網(wǎng)絡(luò)對(duì)戰(zhàn)模塊。便于管理。</p><p>  經(jīng)濟(jì)可行性:做這個(gè)游戲的背景是畢業(yè)設(shè)計(jì),并不注重開發(fā)出來(lái)后的經(jīng)濟(jì)效益和以后的發(fā)展方向,重在檢測(cè)自身的知識(shí)水平,軟件開發(fā)過(guò)程中的經(jīng)濟(jì)需求也不高,只需要本人和一臺(tái)電腦,不需要考慮經(jīng)濟(jì)問(wèn)題。</p><p>  技術(shù)可行性:本游戲?yàn)镃/S模型,用C

30、++語(yǔ)言編寫,開發(fā)工具是VC6.0。</p><p>  社會(huì)可行性:本游戲只為檢測(cè)和鞏固自己所學(xué)知識(shí),開發(fā)出來(lái)的成品只供自己娛樂(lè)和使用,不用考慮對(duì)社會(huì)的影響,也不用考慮版權(quán)和法律的問(wèn)題。</p><p>  2.3軟件的開發(fā)技術(shù)和開發(fā)工具的簡(jiǎn)介</p><p>  游戲主要基于的技術(shù)原理是socket編程。套接字(socket)是一種網(wǎng)絡(luò)編程接口,它是對(duì)通信端點(diǎn)的

31、一種抽象,提供了一個(gè)發(fā)送和接收數(shù)據(jù)的機(jī)制。套接字技術(shù)最先應(yīng)用于unix系統(tǒng),后來(lái)移植到windows系統(tǒng),有了Winsock API。經(jīng)過(guò)對(duì)Winsock API的低層封裝產(chǎn)生了CAsyncSocket類,經(jīng)過(guò)高層次的封裝產(chǎn)生了CSocket類。 CSocket進(jìn)行通信的過(guò)程很簡(jiǎn)單。服務(wù)器首先啟動(dòng),通過(guò)調(diào)用socket函數(shù)建立一個(gè)套接口,然后調(diào)用bind函數(shù)將該套接口和本地網(wǎng)絡(luò)地址聯(lián)系在一起,再調(diào)用listen函數(shù)使套接口做好偵聽的準(zhǔn)備

32、,并規(guī)定它的請(qǐng)求隊(duì)列的長(zhǎng)度,之后就調(diào)用accept函數(shù)來(lái)接收連接??蛻舳嗽诮⑻捉涌谥缶涂烧{(diào)用connect函數(shù)來(lái)發(fā)送和接收數(shù)據(jù)。最后,待數(shù)據(jù)傳送結(jié)束后,雙方調(diào)用close函數(shù)關(guān)閉套接口。其原理如圖2-4所示。</p><p>  圖2-4 Winsock通信原理圖</p><p>  本游戲采用的編程工具是VC++6.0,C++6.0是Microsoft公司推出的一個(gè)基于Windows

33、系統(tǒng)平臺(tái)、可視化的集成開發(fā)環(huán)境,它的源程序按C++語(yǔ)言的要求編寫,并加入了微軟提供的功能強(qiáng)大的MFC(Microsoft Foundation Class)類庫(kù)。MFC中封裝了大部分Windows API函數(shù)和Windows控件,它包含的功能涉及到整個(gè)Windows操作系統(tǒng)。MFC不僅給用戶提供了Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)建應(yīng)用程序的組件,這樣,開發(fā)人員不必從頭設(shè)計(jì)創(chuàng)建和管理一個(gè)標(biāo)準(zhǔn)Windows應(yīng)用程序所需

34、的程序,而是從一個(gè)比較高的起點(diǎn)編程,故節(jié)省了大量的時(shí)間。使用VC++提供的高度可視化的應(yīng)用程序開發(fā)工具和MFC類庫(kù),可使應(yīng)用程序開發(fā)變得簡(jiǎn)單。此外,本程序的開發(fā)人員一直使用VC++6.0進(jìn)行程序設(shè)計(jì),對(duì)此比較熟悉,對(duì)其可視化面向?qū)ο蟮木幊烫攸c(diǎn)相對(duì)了解,在開發(fā)起來(lái)會(huì)輕松許多。</p><p><b>  表2-1 硬件需求</b></p><p>  2.4 需求分析

35、 </p><p>  游戲流程需求:7種方塊共有28中狀態(tài)(包含形象重復(fù)的),在屏幕頂端依次隨機(jī)下落填充給定的區(qū)域,下落過(guò)程中由玩家根據(jù)自己需求的情況下控制方塊的旋轉(zhuǎn)得到自己所需要的圖形,并選擇下落的位置,判斷是否填滿某一行或幾行,若滿消去該行或幾行并獲得積分,在游戲過(guò)程中如果某個(gè)玩家的區(qū)域在無(wú)法放置隨機(jī)落下的方塊,則對(duì)方獲勝;反之,則對(duì)方失敗。游戲的主要功能需求如下:</p><p&g

36、t;  用戶界面需求:7種方塊分別用不同的顏色來(lái)顯示,隨機(jī)落下的方塊在一定的區(qū)域里根據(jù)玩家的操控進(jìn)行變形并放在所需的位置上。需要有良好的人機(jī)交互和觀賞性的界面,玩家登錄到服務(wù)器房間后可以看到以下模塊:登錄到服務(wù)器的各個(gè)玩家的信息、各個(gè)玩家在游戲界面中所在的位置、各個(gè)玩家是否準(zhǔn)備的畫面、玩家之間進(jìn)行交流的聊天對(duì)話框以及在自己所登錄的界面上在游戲過(guò)程中了解到其他玩家的游戲狀況。</p><p>  游戲形狀(方塊)需

37、求:繪制七種常見的基本圖形(長(zhǎng)條形、Z字形、反Z形、田字形、7字形、反7形、T字型),各個(gè)方塊要能實(shí)現(xiàn)它的變形(即旋轉(zhuǎn)),可設(shè)為順時(shí)針或逆時(shí)針變形,一般為逆時(shí)針?lè)较蛐D(zhuǎn)。</p><p>  鍵盤處理事件:方塊隨機(jī)下落時(shí),可以通過(guò)鍵盤上的方向鍵對(duì)方快進(jìn)行控制。上鍵控制方塊的變形,下鍵控制方塊的加速,左鍵控制方塊向左移動(dòng),右鍵控制方塊的向右移動(dòng)。</p><p>  顯示需求:當(dāng)方塊填滿某一

38、行或幾行時(shí)消去該行或幾行,在所消去的行上面的方塊向下移動(dòng),并統(tǒng)計(jì)所得積分。</p><p><b>  2.3 概要設(shè)計(jì)</b></p><p>  2.3.1 功能定義 </p><p>  本系統(tǒng)主要以網(wǎng)絡(luò)通信為基礎(chǔ)實(shí)現(xiàn)人與人的交互。它主要包含以下幾大功能模塊:</p><p>  (1) 系統(tǒng)初始化模塊<

39、;/p><p>  該模塊主要提供玩家進(jìn)入游戲時(shí)初始化游戲界面的功能。登錄時(shí),玩家需要有一個(gè)昵稱,在游戲過(guò)程中,玩家能看到其他所有對(duì)手的資料。</p><p>  (2) 俄羅斯方塊算法模塊</p><p>  該模塊主要實(shí)現(xiàn)俄羅斯方塊游戲的控制。其中它主要包括判斷勝負(fù)算法模塊和方塊產(chǎn)生算法模塊。下圖顯示的就是方塊如何產(chǎn)生的算法。</p><p>

40、;  圖2-5 方塊產(chǎn)生流程</p><p>  (3) 網(wǎng)絡(luò)通信模塊</p><p>  網(wǎng)絡(luò)通信模塊主要包括服務(wù)器的建立、客戶端與服務(wù)器的鏈接、服務(wù)器將其他客戶端玩家資料傳送給玩家。即,在界面內(nèi)保證能讓每個(gè)玩家看到對(duì)手資料。</p><p>  各個(gè)模塊主要實(shí)現(xiàn)的功能如下:</p><p>  圖2-6 網(wǎng)絡(luò)通信模塊功能圖</p&g

41、t;<p>  (4) 游戲界面繪制模塊</p><p>  該模塊是游戲?qū)崿F(xiàn)的核心模塊,它本身并不實(shí)現(xiàn)一些游戲控制的功能。但是,它是其他模塊功能的體現(xiàn)。其他模塊都要受它的調(diào)用,從而形成一個(gè)游戲系統(tǒng)。該模塊主要由初始化界面繪制和游戲開始界面繪制兩個(gè)子模塊組成。它們主要完成界面在不同事件響應(yīng)下游戲界面的繪制和音頻的播放功能。</p><p>  圖2-7 界面繪制模塊圖<

42、/p><p>  以上是游戲功能實(shí)現(xiàn)的主要模塊,它們經(jīng)過(guò)相互調(diào)用控制,協(xié)作分工最終完成了本游戲系統(tǒng)的設(shè)計(jì)。</p><p>  2.3.2 游戲框架設(shè)計(jì)</p><p>  本系統(tǒng)采用C/S軟件模型、單線程、阻塞式網(wǎng)絡(luò)通信的設(shè)計(jì)方式。系統(tǒng)剛運(yùn)行的時(shí)候都要調(diào)用系統(tǒng)初始化模塊讀取用戶配置信息對(duì)游戲主系統(tǒng)進(jìn)行初始化,之后系統(tǒng)進(jìn)入游戲主界面。系統(tǒng)通過(guò)調(diào)用網(wǎng)絡(luò)通信模塊中的服務(wù)器端

43、模塊完成服務(wù)器的建立,并等待連接??蛻舳酥鹘缑媸紫日{(diào)用網(wǎng)絡(luò)通信模塊完成與服務(wù)器的連接。連接成功后,系統(tǒng)調(diào)用網(wǎng)絡(luò)通信模塊實(shí)現(xiàn)服務(wù)器端玩家和客戶端玩家間操作信息的交互,并通過(guò)游戲界面繪制模塊繪制游戲開始后的主界面。游戲結(jié)束后,系統(tǒng)將玩家戰(zhàn)績(jī)信息更新到配置文件中。</p><p>  圖2-8 系統(tǒng)層次圖</p><p><b>  3 詳細(xì)設(shè)計(jì)</b></p>

44、<p>  3.1 系統(tǒng)組成及功能描述</p><p>  本游戲軟件是在傳統(tǒng)的單機(jī)版俄羅斯方塊游戲的基礎(chǔ)上增加了網(wǎng)絡(luò)多人分組對(duì)抗對(duì)戰(zhàn)模式。增加了人與人間的交流和各種道具的使用,增強(qiáng)了俄羅斯方塊的趣味性和可玩性。</p><p>  本游戲的主要功能是:通過(guò)客戶端登錄到服務(wù)器的各個(gè)玩家可以自己選擇同伴和對(duì)手,因?yàn)楸居螒蛟O(shè)計(jì)的目的就是進(jìn)行網(wǎng)絡(luò)多人分組對(duì)抗,需要至少有兩支隊(duì)伍才可

45、以進(jìn)行游戲。在游戲過(guò)程的中,各個(gè)玩家通過(guò)消去方塊可以隨機(jī)獲得某個(gè)道具,這些道具有的可以增加游戲的難度,如在底部添加幾行。也有降低游戲難度的,如減少當(dāng)前玩家底部的行數(shù),玩家們可以通過(guò)自己的需求給己對(duì)或?qū)Ψ绞褂玫谰邅?lái)降低己方游戲的難度或增加對(duì)方的游戲難度。另外,為了增強(qiáng)俄羅斯方塊的競(jìng)爭(zhēng)、可玩性和趣味性,同時(shí)使用網(wǎng)絡(luò)的優(yōu)勢(shì),玩家和玩家之間可以通過(guò)對(duì)話框進(jìn)行聊天,溝通。</p><p>  本軟件的組成:本軟件為C/S軟

46、件模型,主要由軟件初始化模塊、游戲算法模塊、網(wǎng)絡(luò)通信模塊、界面繪制模塊四部分組成。</p><p>  3.2 系統(tǒng)初始化模塊設(shè)計(jì)</p><p>  軟件初始化模塊是從配置文件中讀取玩家的信息完成游戲初始化的過(guò)程。</p><p>  在游戲結(jié)束后該模塊會(huì)自動(dòng)保存玩家戰(zhàn)績(jī)信息到配置文件中。</p><p>  用戶初始化登錄信息如圖3-1所

47、示。</p><p>  圖3-1 用戶登錄信息</p><p>  登錄以后玩家的狀態(tài)顯示為未準(zhǔn)備狀態(tài),如圖3-2(a)所示:頭像為黑白狀態(tài),該狀態(tài)下,游戲不能開始。</p><p>  圖3-2(a) 圖3-2(b)</p><p>  當(dāng)玩家點(diǎn)擊準(zhǔn)備時(shí),頭像就變?yōu)椴噬?,如圖3-2(b)。這時(shí)

48、,如果至少有兩組玩家準(zhǔn)備號(hào),就可以開始游戲。</p><p>  3.3 游戲算法實(shí)現(xiàn)模塊</p><p>  本俄羅斯方塊游戲中,有相當(dāng)大的篇幅是算法的實(shí)現(xiàn)模塊部分。無(wú)論是傳統(tǒng)版單機(jī)俄羅斯方塊,還是本網(wǎng)絡(luò)多人分組對(duì)戰(zhàn)模式的俄羅斯方塊都離不開算法的支持。接下來(lái)詳細(xì)介紹本軟件的算法。圖3-3為游戲主要函數(shù)調(diào)用流程圖。首先從一個(gè)方塊random()的隨機(jī)產(chǎn)生開始,判斷是否能產(chǎn)生方塊。如果不能,

49、則直接在massagebox中顯示游戲結(jié)束;如果能,則刷新容器內(nèi)的的圖,接下來(lái)判斷方塊能否下落和鍵盤事件,根據(jù)相應(yīng)的鍵盤事件進(jìn)行相關(guān)判斷,如,按上旋轉(zhuǎn)鍵,則判斷方塊能否進(jìn)行旋轉(zhuǎn),左右移動(dòng)也是類似。方塊落下后,進(jìn)行一次判斷,看游戲是否失敗,失敗則提示游戲結(jié)束,否則,繼續(xù)產(chǎn)生新的方塊。調(diào)用流程如圖3-3。</p><p>  圖3-3 方塊產(chǎn)生后函數(shù)調(diào)用流程圖</p><p>  主要的游戲過(guò)

50、程如下:游戲開始隨機(jī)產(chǎn)生一個(gè)方塊,接下來(lái)判斷方塊是否已經(jīng)到達(dá)底部,如果不是,則執(zhí)行自動(dòng)下降或根據(jù)鍵盤事件快速下降,直到下降到底部,并進(jìn)行判斷是否滿足消行條件進(jìn)行消行操作。否則,繼續(xù)隨機(jī)生成下一個(gè)下落方塊,在下一個(gè)方塊的提示框中用新生成的方塊代替先前在該方框顯示的方塊,并用先前在該方框里方塊作為當(dāng)前下落的方塊,當(dāng)方塊產(chǎn)生時(shí)就已經(jīng)在底部(即在游戲區(qū)域的頂端),則游戲結(jié)束。否則,繼續(xù)循環(huán)該流程。流程圖如圖3-4所示。</p>&

51、lt;p>  圖3-4 游戲流程圖</p><p><b>  3.3.1方塊實(shí)現(xiàn)</b></p><p>  所有的部件及已停止的部件均用小方格來(lái)表示。整個(gè)游戲區(qū)域?qū)?yīng)一個(gè)二維數(shù)組,數(shù)組元素為0時(shí),表示空白;為1時(shí),表示已有方格。該數(shù)組存儲(chǔ)所有已經(jīng)不能移動(dòng)的部件。部件采用一維數(shù)組表示,這些一維數(shù)組實(shí)際表是一個(gè)n×n的矩陣。如表示一個(gè)方塊使用一個(gè)2&#

52、215;2的矩陣,實(shí)際存儲(chǔ){1,1,1,1};如表示一個(gè)長(zhǎng)條使用一個(gè)4×4的矩陣,實(shí)際存儲(chǔ){0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}。</p><p>  實(shí)際顯示的時(shí)候,先畫出已停止的方塊,然后計(jì)算出正在下落的部件的正確坐標(biāo)位置并其將畫出,同時(shí)在固定位置畫出預(yù)覽方塊。</p><p>  旋轉(zhuǎn)部件時(shí),只需變換存儲(chǔ)部件的矩陣即矩陣的轉(zhuǎn)置,使其對(duì)應(yīng)為轉(zhuǎn)換后的

53、形態(tài),并將其顯示出即可。</p><p>  判斷部件是否可以下落、旋轉(zhuǎn)、左移、右移時(shí),將表示部件的數(shù)組對(duì)應(yīng)到游戲區(qū)域的二維數(shù)組中,再判斷是否允許操作。當(dāng)部件無(wú)法再操作時(shí),將部件數(shù)組中對(duì)應(yīng)填入游戲區(qū)域中對(duì)應(yīng)的二維數(shù)組。</p><p>  使一層消失可以通過(guò)判斷游戲區(qū)域中的二維數(shù)組是否某一行全為1;如果該數(shù)組的第一行全為1或已沒(méi)有足夠的空白使新的部件可以加入到游戲區(qū)域中,則游戲結(jié)束。<

54、;/p><p>  3.3.2數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)</p><p>  游戲方塊Componet結(jié)構(gòu)體</p><p>  typedef struct tagComponet</p><p>  {int intComID; //部件的ID號(hào)</p><p>  int ntDimension; //存儲(chǔ)該部件所

55、需的數(shù)組維數(shù)</p><p>  int* pintArray; //指向存儲(chǔ)該部件的數(shù)組 </p><p>  }Componet;</p><p>  Componet結(jié)構(gòu)體表示某個(gè)游戲方塊具體的屬性,每個(gè)游戲方塊對(duì)應(yīng)有一個(gè)編號(hào),且有對(duì)應(yīng)存儲(chǔ)該部件的數(shù)組,用指針指向該數(shù)組,并設(shè)定存儲(chǔ)該部件所需數(shù)組(n×n)的維數(shù)。</p><

56、p>  Componet結(jié)構(gòu)體數(shù)組</p><p>  初始化游戲方塊,即定義MAXCOM個(gè)Componet類型的結(jié)構(gòu)體,并初始化(MAXCOM為7)。例如</p><p>  m_Componets[6].intComID=6;</p><p>  m_Componets[6].intDimension=4;</p><p>  m_

57、Componets[6].pintArray=new int[16];</p><p>  m_Componets[6].pintArray[0]=0;</p><p>  m_Componets[6].pintArray[1]=1;</p><p>  m_Componets[6].pintArray[2]=0;</p><p>  m_C

58、omponets[6].pintArray[3]=0; //0 1 0 0</p><p>  m_Componets[6].pintArray[4]=0; //0 1 0 0</p><p>  m_Componets[6].pintArray[5]=1; //0 1 0 0</p><p>  m_Componets[6].pintArray[6]=0;

59、 //0 1 0 0</p><p>  m_Componets[6].pintArray[7]=0;</p><p>  m_Componets[6].pintArray[8]=0;</p><p>  m_Componets[6].pintArray[9]=1;</p><p>  m_Componets[6].pintArray[10]

60、=0;</p><p>  m_Componets[6].pintArray[11]=0;</p><p>  m_Componets[6].pintArray[12]=0; </p><p>  m_Componets[6].pintArray[13]=1; </p><p>  m_Componets[6].pintArray[14]

61、=0; </p><p>  m_Componets[6].pintArray[15]=0;</p><p>  以上代碼是對(duì)長(zhǎng)條這個(gè)方塊的定義和初始化。其余形狀的6種方塊的定義不在此贅述。</p><p>  3.3.3游戲功能實(shí)現(xiàn)</p><p><b>  1、游戲方塊預(yù)覽</b></p><

62、p>  游戲中的方塊將在4*4的正方形小方塊中預(yù)覽,如圖4所示。使用隨機(jī)函數(shù)rand( )來(lái)產(chǎn)生0~6之間的游戲方塊編號(hào),其中的正方形小方塊的大小為SIZE*SIZE。SIZE為所設(shè)定的方塊像素大小。</p><p><b>  2、游戲方塊控制</b></p><p>  (1)左移的實(shí)現(xiàn)過(guò)程:</p><p>  a.首先判斷方塊在矩

63、形“容器”中能否能左移。要想左移必須滿足以下兩個(gè)條件:(1)如果正在下落的方塊整體左移一位后,該方塊不超越“矩形”容器的左邊線,否則出界,不能執(zhí)行該操作;(2)在該4*4方塊有值(值為1)的位置,“矩形”容器內(nèi)在這時(shí)必須是沒(méi)有被占用的(占用時(shí),值為1),否則,不能執(zhí)行該操作。如果能同時(shí)滿足上述這兩個(gè)條件,則執(zhí)行左移操作,否則不執(zhí)行左移操作。</p><p>  b.清除執(zhí)行左移操作前的方塊。</p>

64、<p>  c.該方塊左移后,在左移一位后的位置,重新顯示此游戲方塊。(b、c操作步驟中涉及到的如何清除和顯示方塊的函數(shù)在第四章中的功能函數(shù)設(shè)計(jì)中將會(huì)詳細(xì)進(jìn)行闡述)。</p><p>  (2)右移的實(shí)現(xiàn)過(guò)程:</p><p>  a. .首先判斷方塊在矩形“容器”中能否能右移。要想右移必須滿足以下兩個(gè)條件:(1)如果正在下落的方塊整體右移一位后,該方塊不超越“矩形”容器的右邊

65、線,否則出界,不能執(zhí)行該操作;(2)在該4*4方塊有值(值為1)的位置,“矩形”容器內(nèi)在這時(shí)必須是沒(méi)有被占用的(占用時(shí),值為1),否則,不能執(zhí)行該操作。如果能同時(shí)滿足上述這兩個(gè)條件,則執(zhí)行右移操作,否則不執(zhí)行右移操作。</p><p>  b.清除執(zhí)行左移操作前的方塊。</p><p>  c.該方塊右移后,在右移一位后的位置,重新顯示此游戲方塊。(b、c操作步驟中涉及到的如何清除和顯示方

66、塊的函數(shù)在第四章中的功能函數(shù)設(shè)計(jì)中將會(huì)詳細(xì)進(jìn)行闡述)。</p><p>  (3)向下加速下落(下移)的實(shí)現(xiàn)過(guò)程:</p><p>  a. 首先判斷方塊在矩形“容器”中能否能右移。要想右移必須滿足以下兩個(gè)條件:(1)如果正在下落的方塊整體右移一位后,該方塊不超越“矩形”容器的底邊線,否則出界,不能執(zhí)行該操作;(2)在該4*4方塊有值(值為1)的位置,“矩形”容器內(nèi)在這時(shí)必須是沒(méi)有被占用的

67、(占用時(shí),值為1),否則,不能執(zhí)行該操作。如果能同時(shí)滿足上述這兩個(gè)條件,則執(zhí)行下移操作,否則不執(zhí)行下移操作。</p><p>  b.清除執(zhí)行右移操作前的方塊。</p><p>  c.該方塊右移后,在右移一位后的位置,重新顯示此游戲方塊。</p><p>  (4)旋轉(zhuǎn)的實(shí)現(xiàn)過(guò)程:</p><p>  a. 首先判斷方塊在矩形“容器”中能否

68、旋轉(zhuǎn)。要想旋轉(zhuǎn)必須滿足以下兩個(gè)條件:(1)如果游戲方塊整體旋轉(zhuǎn)后,游戲方塊不能超過(guò)“矩形”容器的左邊線、右邊線、底邊線,否則越界,不能執(zhí)行該操作;(2)在該4*4方塊有值(值為1)的位置,“矩形”容器內(nèi)在這時(shí)必須是沒(méi)有被占用的(占用時(shí),值為1),否則,不能執(zhí)行該操作。如果能同時(shí)滿足上述這兩個(gè)條件,則執(zhí)行下移操作,否則不執(zhí)行下移操作。</p><p>  b.清除執(zhí)行旋轉(zhuǎn)操作前的游戲方塊。</p>&

69、lt;p>  c.在“矩形”容器中顯示區(qū)域不變的位置,顯示旋轉(zhuǎn)后的游戲方塊。</p><p><b>  3、游戲顯示更新</b></p><p>  a.當(dāng)游戲方塊執(zhí)行左右移動(dòng)、下落、旋轉(zhuǎn)操作時(shí),首先要清除先前位置的游戲方塊,再根據(jù)操作向左一位、向右一位、向下一位或在顯示區(qū)域不變的位置重新繪制游戲方塊。</p><p>  b.當(dāng)某一行

70、或幾行填滿方塊消去時(shí),上方不能移動(dòng)的方塊下移后,進(jìn)行重新繪制。</p><p>  清除游戲方塊的過(guò)程為:首先用刷新函數(shù)刷新相應(yīng)的游戲區(qū)域,清除執(zhí)行操作前顯示的方塊,執(zhí)行相應(yīng)的操作后,再次調(diào)用刷新函數(shù)刷新此區(qū)域,顯示將要顯示的游戲方塊。</p><p><b>  4、游戲幫助功能</b></p><p>  在幫助的功能選項(xiàng)中直接添加靜態(tài)文本

71、即可。</p><p>  3.4 網(wǎng)絡(luò)通信模塊</p><p>  網(wǎng)絡(luò)通信模塊是各個(gè)玩家實(shí)體之間連接。它的主要作用是將兩個(gè)以上的玩家進(jìn)行交流和溝通,通過(guò)聊天對(duì)話框?qū)崿F(xiàn)人與人之間的交互。進(jìn)而提高俄羅斯方塊的趣味性、交互性、可玩性。具體來(lái)說(shuō)本游戲的網(wǎng)絡(luò)通信模塊主要包括服務(wù)器端和客戶端兩個(gè)模塊。服務(wù)器端模塊創(chuàng)建服務(wù)器為客戶端提供服務(wù),接受客戶端的連接??蛻舳四K主要用于將客戶端連接到服務(wù)器端

72、,建立連接之后,服務(wù)器和客戶端分別將玩家的操作情況以消息的形式進(jìn)行交互,并根據(jù)消息更新容器內(nèi)玩家進(jìn)度以及響應(yīng)各種請(qǐng)求。</p><p>  套接字建立:系統(tǒng)繼承CAsyncSocket類生成派生類CFiveSocket,并在CFiveSocket類中重載了OnAccept、OnConnect、OnReceive、OnClose消息。服務(wù)器的建立遵循CSocket編程的一般步驟,首先創(chuàng)建監(jiān)聽套接字,調(diào)用Listen

73、()監(jiān)聽客戶端的連接。有客戶端請(qǐng)求連接時(shí),調(diào)用Accept()接受客戶端的連接。連接成功后,就可以調(diào)用ReceiveData()接收已連接客戶端發(fā)送來(lái)的消息??蛻舳朔庋bCSocket類生成了CMysocket類,并重載了OnReceive消息。此后新的游戲?qū)嵗鳛榭蛻舳顺绦騽?chuàng)建客戶端套接字,然后調(diào)用Connect()連接到指定的服務(wù)器,連接成功后,調(diào)用Send()將該玩家的游戲基礎(chǔ)信息發(fā)送到服務(wù)器。</p><p&g

74、t;  服務(wù)器端和客戶端消息的收發(fā):服務(wù)器建立成功,客戶端連接到服務(wù)器后,客戶端就可以向服務(wù)器發(fā)送消息。服務(wù)器重載ReceiveData()來(lái)接收客戶端發(fā)送的消息,利用Send()來(lái)發(fā)送消息。客戶端也重載了ReceiveData()來(lái)接收服務(wù)器發(fā)送來(lái)的消息。由于本系統(tǒng)中發(fā)送和接收的數(shù)據(jù)樣式各不相同,因此本系統(tǒng)自定義消息格式,統(tǒng)一數(shù)據(jù)的發(fā)送方式。</p><p>  3.5 游戲界面繪制模塊</p>

75、<p>  設(shè)計(jì)游戲的良好的游戲界面目的是能給游戲玩家提供良好的視覺(jué)感受。所以,游戲界面的回執(zhí)非常重要。前面各模塊的功能主要集中在游戲邏輯的實(shí)現(xiàn),那么游戲界面繪制模塊就是將看不見的游戲邏輯讓游戲玩家能夠看見,從而幫助玩家正確的完成操作。該模塊貫穿整個(gè)游戲系統(tǒng),從進(jìn)入游戲到最后退出游戲都將用到該模塊來(lái)繪制游戲界面,顯示游戲進(jìn)行情況。游戲界面繪制模塊實(shí)現(xiàn)較復(fù)雜,提供的函數(shù)接口比較煩瑣。從游戲進(jìn)行的階段可以將該模塊分為游戲初始界面繪

76、制和游戲開始界面繪制。</p><p>  3.5.1 游戲初始界面</p><p>  該界面是登錄成功后,玩家第一次看見的游戲界面,此時(shí),游戲玩家沒(méi)有作出任何操作。但圖中昵稱為456的玩家已經(jīng)準(zhǔn)備游戲,123尚未準(zhǔn)備,界面效果圖如圖3-5所示。</p><p>  圖3-5 游戲初始界面</p><p>  初始界面繪制原理是:由重繪消息

77、WM_PAINT消息觸發(fā)CBoard類中的OnPaint()函數(shù)對(duì)界面進(jìn)行重繪制。系統(tǒng)先創(chuàng)建內(nèi)存DC,在內(nèi)存中先繪制好主界面和根據(jù)保存當(dāng)前界面情況數(shù)據(jù)的二維數(shù)組m_data繪制方塊,最后再將內(nèi)存中的界面數(shù)據(jù)直接拷貝到設(shè)備當(dāng)中,這樣就很好地解決了在游戲過(guò)程中由于不斷刷新界面數(shù)據(jù)而導(dǎo)致屏幕閃爍的問(wèn)題。</p><p>  3.5.2 游戲開始界面</p><p>  游戲開始界面是指兩個(gè)玩家已

78、經(jīng)建立連接,游戲開始后的游戲界面。此時(shí)的游戲界面是最復(fù)雜的,游戲界面時(shí)刻都在變化,它動(dòng)態(tài)的顯示了玩家游戲進(jìn)行的情況。游戲效果圖如圖3-6所示。</p><p>  圖3-6 游戲開始界面 </p><p>  從上面圖形可以看到本階段的界面顯示變化較快,變化的方式較多,但是它的繪制原理并沒(méi)有太大的變化,只是系統(tǒng)操作變得更多,收發(fā)的消息更多而已。</p><p>  

79、總之,游戲界面的繪制都是以系統(tǒng)消息為主導(dǎo)的,收到什么消息就會(huì)繪制相應(yīng)的游戲界面。</p><p>  4 俄羅斯方塊游戲的實(shí)現(xiàn)</p><p>  4.1 實(shí)現(xiàn)原理和主要機(jī)制 </p><p><b> ?。?)定時(shí)制機(jī)制</b></p><p>  從分析俄羅斯方塊游戲的特點(diǎn)而得,在游戲開始時(shí)定時(shí)器就應(yīng)該產(chǎn)生并生

80、效,而在游戲暫停時(shí)使已經(jīng)制定的定時(shí)器失效,當(dāng)游戲從暫停狀態(tài)回到游戲狀態(tài)時(shí),系統(tǒng)再重新創(chuàng)建一個(gè)定時(shí)器并激活使其正常工作;當(dāng)游戲結(jié)束時(shí),則將制定的定時(shí)器銷毀。經(jīng)上所述所以在游戲的開始、暫停、結(jié)束分別對(duì)應(yīng)的游戲開始函數(shù)、暫停函數(shù)、結(jié)束函數(shù)中進(jìn)行定時(shí)器的控制,對(duì)定時(shí)器進(jìn)行創(chuàng)建激活、失效與銷毀處理。所以,先在VC6.0資源編輯器菜單資源選項(xiàng)里面新添加三個(gè)菜單選項(xiàng),然后通過(guò)時(shí)類圖實(shí)現(xiàn)即分別是游戲的“開始”、“暫?!?、和“結(jié)束”,然后利用ClassW

81、izard直接在視圖類對(duì)象Cskyblue_RectView中分別為它們添加空白的處理函數(shù),具體函數(shù)添加如表4-1所示。</p><p>  表4-1 菜單選項(xiàng)功能對(duì)應(yīng)表</p><p><b> ?。?)定時(shí)處理</b></p><p>  經(jīng)過(guò)定時(shí)器的設(shè)置后,這里通過(guò)利用類向?qū)В–lassWizard)跳到定時(shí)器到時(shí)候所處的處理函數(shù)OnTi

82、mer()去實(shí)現(xiàn),當(dāng)系統(tǒng)所設(shè)置的固定時(shí)間片間隔到時(shí)后,首先先檢測(cè)當(dāng)前所下落的方塊是否已經(jīng)到達(dá)了底部,如果否則繼續(xù)進(jìn)行RectDown(),即方塊繼續(xù)向下一個(gè)單位移動(dòng)的操作;如果是則方塊下落到底后,并隨機(jī)產(chǎn)生一個(gè)新的“下一個(gè)方塊”,并代替舊的,將先前所產(chǎn)生的舊的“下一個(gè)方塊”作為當(dāng)前定時(shí)器激活狀態(tài)下所正在使用的方塊,并對(duì)使用后的游戲當(dāng)前的狀態(tài)進(jìn)行檢測(cè):</p><p>  方塊到達(dá)當(dāng)前游戲狀態(tài)的底部,并滿足某一行或

83、幾行填充滿的情況下消去該一行或幾行。</p><p>  (2)方塊到達(dá)當(dāng)前游戲狀態(tài)的底部的同時(shí)到達(dá)游戲區(qū)域的頂部,而且不滿足消行的條件,進(jìn)而判斷該玩家所參與的游戲是否因?yàn)檫`反規(guī)則而結(jié)束游戲。</p><p>  本游戲使用視圖類所創(chuàng)建得m_icurrentStatus和m_inextStatus兩個(gè)成員變量來(lái)記錄七種不同類型的下落方塊。而m_currentRect除了記錄下落方塊的,還要

84、記錄下落方塊在下落過(guò)程中當(dāng)前的變形狀態(tài)。m_icurrentStatus和m_inextStatus以及m_currentRect記錄方塊的狀態(tài)時(shí)最多用兩位表示,第1位用作方塊的類型標(biāo)識(shí)(1~7),第2位用作同種類型的方塊的不同變換形態(tài) (1~4),七種類型的方塊每種類型最多有四種變換形態(tài)。</p><p>  將當(dāng)前方塊的狀態(tài)的記錄和先前的下落方塊保存下來(lái),利用random(小于或等于所指定的正整數(shù)),并根據(jù)這

85、個(gè)正整數(shù)來(lái)確定下一個(gè)下落方塊的類型。接下來(lái)進(jìn)行初始化,在屏幕的左上角根據(jù)上述的產(chǎn)生的方塊狀態(tài)進(jìn)行更新圖。注意在方塊剛開始下落的時(shí)候要保證方塊要全部顯示在所指定的游戲區(qū)域里,所以要進(jìn)行縱坐標(biāo)的根據(jù)方塊的類型狀態(tài)向下進(jìn)行一定的偏移。</p><p>  (3)當(dāng)前方塊底部到達(dá)的判斷與銷行的實(shí)現(xiàn)</p><p>  圖4-1 處理方塊到達(dá)圖</p><p>  當(dāng)新的方塊

86、下落時(shí),要判斷這個(gè)方塊是否已經(jīng)到達(dá)了區(qū)域底部,可以利用數(shù)組InterFace[74][4]所記錄7種不同類型方塊的4種不同形態(tài)的接觸面信息,通過(guò)當(dāng)前下落方塊所對(duì)應(yīng)的接觸面的方塊位置為被占用狀態(tài)(MAP_STATE_NOT_EMPTY=1)來(lái)確定。如果方塊到達(dá)底部,則需判斷情況。如果滿足消行條件,則進(jìn)行消行,如果不滿足,則記錄當(dāng)前方塊下落的位置并加載下一個(gè)方塊繼續(xù)游戲,最后改變數(shù)據(jù)狀態(tài)。</p><p>  統(tǒng)計(jì)分

87、數(shù):在消行處理里面有一個(gè)專門用來(lái)統(tǒng)計(jì)消行數(shù)的變量,然后根據(jù)變量的值(即小區(qū)的行數(shù))決定分?jǐn)?shù)的多少,統(tǒng)計(jì)分?jǐn)?shù)的規(guī)則:x*(x*100),x為同時(shí)小區(qū)的行數(shù),x是大于等于1且小于等于四的正整數(shù)。即消一行得100分,同時(shí)消2行得400分。如果沒(méi)有滿行,則加載下一個(gè)方塊繼續(xù)游戲。</p><p>  圖4-2 判斷滿行及銷行圖</p><p>  檢測(cè)游戲區(qū)域中的所有行,,并對(duì)每行的所有縱列狀態(tài)進(jìn)

88、行檢測(cè),如果其中有一列是空閑狀態(tài)則不可以銷行。如果可以某行或某幾行滿足銷行的話,改變統(tǒng)計(jì)分?jǐn)?shù),并且將該行或幾行清空,再將該行或幾行上面的所有方塊都向下偏移一個(gè)或幾個(gè)單位,以填充該行或幾行的空缺。</p><p>  if (m_isBottom)</p><p>  {//判斷是否已得分</p><p>  for (i=0;i<m_iRow;i++)<

89、/p><p>  {m_bIsSucced = TRUE;</p><p>  for (j=0;j<m_iCol;j++)</p><p>  if (GameStatus[i][j]==MAP_STATE_EMPTY)</p><p>  m_bIsSucced = FALSE;//如果得分,則銷掉此行</p><p

90、>  if (m_bIsSucced)</p><p>  {for (k=i;k>0;k--)</p><p>  for (j=0;j<m_iCol;j++)</p><p>  GameStatus[k][j] = GameStatus[k-1][j];//第1行清零</p><p>  for (j=0;j<m

91、_iCol;j++)</p><p>  GameStatus[0][j]=MAP_STATE_EMPTY;</p><p>  m_iMuch += 1;}}</p><p>  在視圖類對(duì)象中增加了m_iStartX和m_iStartY兩個(gè)成員變量,它們分別為視圖窗口的左上角起點(diǎn)的坐標(biāo)偏移值。如果該函數(shù)檢測(cè)到有消行的操作,經(jīng)過(guò)數(shù)據(jù)的修改后,將消行行后的區(qū)域空白出

92、來(lái)以及分?jǐn)?shù)顯示區(qū)域的部分進(jìn)行修改即進(jìn)行重繪。所以函數(shù)體分別先計(jì)算出這兩個(gè)小矩形區(qū)域的位置,然后再調(diào)用InvalidateRect()函數(shù)對(duì)這兩個(gè)區(qū)域宣布重繪,從而觸發(fā)視圖的重繪。</p><p>  4.2 主要的功能函數(shù)</p><p>  在MFC視圖類中添加功能構(gòu)造函數(shù),主要的功能函數(shù)設(shè)計(jì)如下:</p><p>  CELSblockView():</p

93、><p>  函數(shù)原型:CELSblockView::CELSblockView()</p><p>  CELSblockView()初始化游戲的各項(xiàng)數(shù)據(jù),“矩形”容器(游戲地圖)、游戲級(jí)別、當(dāng)前部件的ID、游戲分?jǐn)?shù)、隨機(jī)函數(shù)。定義并初始化MAXCOM個(gè)方塊部件信息(MAXCOM為7),且在對(duì)應(yīng)的析構(gòu)函數(shù)中釋放回收內(nèi)存。</p><p><b>  OnDr

94、aw():</b></p><p>  函數(shù)原型:void CELSblockView::OnDraw(CDC* pDC)</p><p>  OnDraw()導(dǎo)入背景圖片,畫游戲區(qū)域、不能移動(dòng)的方塊、下落的部件,顯示得分、級(jí)別、下一個(gè)方塊。</p><p>  OnKeyDown():</p><p>  函數(shù)原型:void C

95、ELSblockView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)</p><p>  OnKeyDown()對(duì)鍵盤信息處理,讀取鍵盤操作值,對(duì)當(dāng)前部件,調(diào)用CanLeft()、CanRight()、CanRotate()、CanDown(),并實(shí)現(xiàn)左移、右移、旋轉(zhuǎn)、加速下落。</p><p>  OnTimer():</p&

96、gt;<p>  函數(shù)原型:void CELSblockView::OnTimer(UINT nIDEvent)</p><p>  OnTimer()是定時(shí)器消息處理函數(shù),顯示預(yù)覽部件,調(diào)用CanDown()判斷能否下移,實(shí)現(xiàn)方塊自由下落,調(diào)用Disappear()消去滿行,調(diào)用CheckFail()判斷游戲是否結(jié)束,調(diào)用NewComponet()產(chǎn)生新部件。</p><p&g

97、t;  NewComponet():</p><p>  函數(shù)原型:void CELSblockView::NewComponet(void)</p><p>  NewComponet()產(chǎn)生新部件的函數(shù),并將新部件的信息拷貝到當(dāng)前部件的結(jié)構(gòu)體m_CurrentCom中。</p><p>  CanDown():</p><p>  函數(shù)原

98、型:bool CELSblockView::CanDown(void)或false。</p><p>  CanLeft() :</p><p>  函數(shù)原型:bool CELSblockView::CanLeft(void)</p><p>  CanLeft()判斷游戲方塊是否可以左移,并返回值true或false。</p><p>  

99、CanRight():</p><p>  函數(shù)原型:bool CELSblockView::CanRight(void)</p><p>  CanRight()判斷游戲方塊是否可以右移,并返回值true或false。</p><p>  CanRotate():</p><p>  函數(shù)原型:bool CELSblockView::Can

100、Rotate(void)</p><p>  CanRotate()判斷游戲方塊是否可以旋轉(zhuǎn),并返回值true或false。</p><p><b>  CanNew():</b></p><p>  函數(shù)原型:bool CELSblockView::CanNew(void)</p><p>  CanNew()判斷是否

101、可以在“矩形”容器中產(chǎn)生新的游戲方塊,并返回值true或false。</p><p>  CheckFail():</p><p>  函數(shù)原型:bool CELSblockView::CheckFail(void)</p><p>  CheckFail()判斷游戲是否結(jié)束,并返回值true或false。</p><p>  Disappe

102、ar():</p><p>  函數(shù)原型:CELSblockView::Disappear(void)</p><p>  Disappear()判斷是否有滿行,且消去滿行,記錄消去行數(shù),并按規(guī)則增加和顯示游戲分?jǐn)?shù)。</p><p>  MyInvalidateRect():</p><p>  函數(shù)原型:Void CELSblockView

103、::MyInvalidateRect(POINT ptStart,int intDimension)</p><p>  MyInvalidateRect()刷新了一個(gè)以ptStart為坐上角,長(zhǎng)度為intDimension且不超出游戲區(qū)域的正方形區(qū)域。</p><p>  OnGameStart():</p><p>  函數(shù)原型:void CELSblockVi

104、ew::OnGameStart()</p><p>  OnGameStart()游戲開始的菜單和工具欄消息函數(shù)。</p><p>  OnGameEnd( ):</p><p>  函數(shù)原型:void CELSblockView::OnGameEnd()</p><p>  OnGameEnd( )游戲結(jié)束的菜單和工具欄消息函數(shù)。</

105、p><p>  其他相關(guān)的功能實(shí)現(xiàn)函數(shù):</p><p>  PreCreateWindow( )</p><p>  函數(shù)原型:BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)</p><p>  PreCreateWindow( )設(shè)置生成主窗體的大小、風(fēng)格。</p>

106、<p>  4.3 響應(yīng)事件原理</p><p><b> ?。?)處理鍵盤事件</b></p><p>  關(guān)于按鍵命令消息的響應(yīng),可以通過(guò)對(duì)WM_KEYDOWN消息的處理函數(shù)進(jìn)行截獲并重寫來(lái)實(shí)現(xiàn),下面是對(duì)該處理函數(shù)OnKeyDown()的重寫。</p><p>  功能:處理用戶的輸入,方塊的左,右移,加速及變形</p>

107、;<p>  void CSkyblue_RectView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) </p><p>  {switch(nChar)</p><p>  {case VK_LEFT:</p><p>  RectArrow(LEFT);</p><p&

108、gt;<b>  break;</b></p><p>  case VK_RIGHT:</p><p>  RectArrow(RIGHT);</p><p><b>  break;</b></p><p>  case VK_UP:</p><p>  RectChan

109、ge();</p><p><b>  break;</b></p><p>  case VK_DOWN:</p><p>  RectArrow(DOWN);</p><p><b>  break;}</b></p><p>  CView::OnKeyDown(nCh

110、ar, nRepCnt, nFlags);}</p><p>  圖4-3 圖鍵盤事件功能圖</p><p>  當(dāng)方塊要進(jìn)行變形或向左、右、下移動(dòng)時(shí),首先要對(duì)方塊將要移動(dòng)到的位置進(jìn)行判斷,判斷是否有障礙,如果有該操作不被執(zhí)行,方塊則仍然保持到原來(lái)的位置不變;如果沒(méi)有則根據(jù)玩家所按的鍵執(zhí)行相關(guān)的操作。并把該方塊的位置顯示出來(lái)。其實(shí)方塊的各個(gè)方向的移動(dòng)知識(shí)對(duì)方塊所處的坐標(biāo)的變化。</p

111、><p><b> ?。?)變形的實(shí)現(xiàn)</b></p><p><b>  圖4-4圖方塊變化</b></p><p>  本游戲通過(guò)鍵盤的向上鍵來(lái)控制方塊的變形。即當(dāng)玩家按下向上鍵時(shí),程序就會(huì)執(zhí)行方塊變化change()函數(shù)。方塊的類型有七種(長(zhǎng)條形、Z字形、反Z形、田字形、7字形、反7形、T字型),而每個(gè)隨機(jī)產(chǎn)生的方塊都有

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論