版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 本科生畢業(yè)設(shè)計</b></p><p> 姓 名: 學(xué) 號: </p><p> 學(xué) 院: 計算機科學(xué)與技術(shù)學(xué)院 </p><p> 專 業(yè): 計算機科學(xué)與技術(shù)
2、 </p><p> 設(shè)計題目: 俄羅斯方塊分組對抗游戲的實現(xiàn) </p><p> 專 題: </p><p> 指導(dǎo)教師: 職 稱: </p><p> 2013 年 5
3、 月 </p><p> XXXX大學(xué)畢業(yè)設(shè)計任務(wù)書</p><p> 學(xué)院 計算機科學(xué)與技術(shù)學(xué)院 專業(yè)年級 學(xué)生姓名 </p><p> 任務(wù)下達日期:2013年 1 月 4 日</p><p> 畢業(yè)設(shè)計日期: 2013年 1月 4日至 2013年6月2日</p>
4、<p> 畢業(yè)設(shè)計題目:俄羅斯方塊分組對抗游戲的實現(xiàn)</p><p><b> 畢業(yè)設(shè)計專題題目:</b></p><p> 畢業(yè)設(shè)計主要內(nèi)容和要求:</p><p> 用戶可參與的俄羅斯方塊游戲;具體包括隨機給出不同的形狀下落填充給定的區(qū)域,若填滿一條便消掉,計分。若在游戲中各形狀填滿了給定區(qū)域,則游戲結(jié)束。</p&g
5、t;<p> 在此基礎(chǔ)上實現(xiàn)多人網(wǎng)絡(luò)對戰(zhàn),并且可以進行分組對戰(zhàn),</p><p> 可以分3個組。要求根據(jù)消層情況獲得道具,并能夠使用道具進行攻擊。</p><p> 院長簽字: 指導(dǎo)教師簽字:</p><p> XXXX畢業(yè)設(shè)計評閱教師評閱書</p><p> 評閱教師評語(①選題
6、的意義;②基礎(chǔ)理論及基本技能的掌握;③綜合運用所學(xué)知識解決實際問題的能力;③工作量的大??;④取得的主要成果及創(chuàng)新點;⑤寫作的規(guī)范程度;⑥總體評價及建議成績;⑦存在問題;⑧是否同意答辯等):</p><p> 成 績: 評閱教師簽字:</p><p> 年 月 日</p><p> 中國礦業(yè)大學(xué)畢
7、業(yè)設(shè)計答辯及綜合成績</p><p><b> 摘 要</b></p><p> 俄羅斯方塊(Tetris, 俄文:Тетрис)是一款從1988年起至今都風(fēng)靡全球的電視游戲機和掌上游戲機游戲,是落下型益智游戲的始祖。它是由俄羅斯人阿列克謝·帕基特諾夫發(fā)明的一款能鍛煉人的反應(yīng)能力、動手能力等能力的教育軟件,故得此名。俄羅斯方塊的基本游戲規(guī)則是移動、旋轉(zhuǎn)
8、和擺放游戲自動隨機輸出的各種方塊,當(dāng)某一行或幾行(最多四行)完全充滿時,即消失。由于具有數(shù)學(xué)性、動態(tài)性,知名度,而且上手簡單、老少皆宜,從而家喻戶曉,風(fēng)靡全世界。目前,人們在基于俄羅斯方塊在基于原有的設(shè)計原理上,發(fā)展出了許多新的不同類型的游戲,大大增加了這種游戲的趣味性,界面觀賞性,可玩性。游戲分為單機版、對戰(zhàn)版、分組對戰(zhàn)等多種游戲方式。</p><p> 本軟件在了解俄羅斯方塊設(shè)計原理的基礎(chǔ)之上,借助C/S軟
9、件模型,用CSocket套接字技術(shù)實現(xiàn)了一個網(wǎng)絡(luò)版的能進行分組對抗的俄羅斯方塊游戲。該游戲軟件不僅實現(xiàn)了基本的俄羅斯方塊功能,并能支持俄羅斯方塊服務(wù)器的建立、客戶端接入等功能,在此基礎(chǔ)之上,添加了個性音效、分組對抗功能和道具使用等機制,從而改進了傳統(tǒng)的簡單俄羅斯方塊游戲,大大提高了游戲的趣味性、可玩性,使游戲畫面也更加具有觀賞性,人機交互性更強。本次開發(fā)所使用的開發(fā)工具為VC++ 6.0,使用的編程語言是C++。本文主要闡述了本俄羅斯方
10、塊軟件的開發(fā)方法以及實現(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)粘蕵飞钪胁豢扇笔У囊徊糠?。俄羅斯方塊游戲是其中一種風(fēng)靡全球的電腦類游戲機和掌上型游戲機的游戲,它老少皆宜,而且是可以鍛煉人的反應(yīng)能力、動手能力、全局統(tǒng)籌能力,并具有數(shù)學(xué)性、靈活性和良好的可玩性的一款教育軟件。隨著科技水平的發(fā)展,游戲開發(fā)技術(shù)的提升,由俄羅斯方塊衍生出來的各種經(jīng)典游戲比比皆是。</p><p> 1.2課題研究和發(fā)展?fàn)顩r<
17、/p><p> 俄羅斯方塊最早是在1985年6月由工作于莫斯科科學(xué)計算機中心的阿列克謝·帕基特諾夫在玩過一個拼圖游戲之后受到啟發(fā)而制作的一個以Electronica 60為平臺的游戲,后來,隨著此游戲的熱銷,其版權(quán)問題也一直糾纏不清,官司不斷。也導(dǎo)致幾家公司倒閉,一些公司獲益,并以此賺了很多錢,其中,最受關(guān)注的是1989年的Tengen和任天堂的官司,最終Tengen的權(quán)利被否決,而任天堂的請求或許。因此
18、,Tengen版的俄羅斯方塊不得不停止銷售,撤下貨架。而任天堂NES版Tetris同年在美國發(fā)售。全美銷量大約300萬。與此同時,和GB版Tetris捆綁銷售的Game Boy席卷美國,美利堅大地上刮起一陣方塊旋風(fēng)。 </p><p> 俄羅斯方塊游戲通過在container的頂端產(chǎn)生隨機的一個形狀的方塊,玩家通過選擇左移、右移、旋轉(zhuǎn)、下落等集中操作來使其盡可能整齊的疊在一起,當(dāng)某一行全部充滿時,即消失。由這個
19、游戲過程可以看到,這款游戲不僅能鍛煉人的反應(yīng)能力、動手能力,更能鍛煉我們統(tǒng)籌安排、隨機應(yīng)變的能力,而決不是像很多孩子的家長所有的,能使孩子沉迷其中,降低智力、耽誤身心發(fā)展。</p><p> 1.3本軟件與傳統(tǒng)的俄羅斯方塊的異同</p><p> 俄羅斯方塊本身具有一個區(qū)別于其他很多游戲的特點,就是只能在電子平臺上運行,而不能用實物來進行游戲,傳統(tǒng)的俄羅斯方塊游戲也有很多版本,他支持在
20、手機等工具上的單機模式,也支持在小游戲機上和電腦上的單機雙人對戰(zhàn)模式,本游戲相比傳統(tǒng)的俄羅斯方塊有很多相同之處,但也做了很多改進:</p><p> 相同點:本游戲包含了單機俄羅斯方塊的主題框架,采用2維數(shù)組來表示每個方塊,均由七種方塊組成,分別是L型,反L型,Z型,反Z型,田字型,1型,T型。基本算法是相同的,即隨機產(chǎn)生一個方塊,根據(jù)玩家按鍵來響應(yīng)鍵盤事件和鼠標(biāo)事件,分別進行右移、左移、旋轉(zhuǎn)和下落等操作。對每
21、一行是否充滿的判斷和消去也跟單機版是相似的思路。游戲邏輯相同,游戲從第一個方塊下落開始到游戲結(jié)束,整個流程是相同的。</p><p> 不同點:本游戲在原來的簡單模式的基礎(chǔ)上做了很多改進:</p><p> 1.在雙人對戰(zhàn)的基礎(chǔ)上進行了擴充,采用C/S模式,最多可容納六個人一起游戲,并且可隨意選擇自己的分組,共有A B C和自由人四組供選擇,進入房間后可以選擇準(zhǔn)備游戲,當(dāng)有超過兩個隊伍
22、且所有人都準(zhǔn)備好時,游戲開始。</p><p> 2.游戲在原來單純拼方塊的基礎(chǔ)上,增加了很多道具,玩家在消去多行的時候可隨機獲得道具,主要有消去幾行、增加幾行、全部消去、加速下落、減速下落等功能,玩家可根據(jù)需求對自己、隊友或者對手使用該道具。</p><p> 3.游戲在交互方式上比之前有很大改進,之前的單機游戲或者雙人對戰(zhàn)模式?jīng)]有辦法進行交流,現(xiàn)在的游戲中添加了聊天界面,可以進行溝
23、通,并且在使用相應(yīng)道具或者準(zhǔn)備開始游戲的時候都有音樂,能讓參與游戲的玩家更放松心情,體會游戲的樂趣。</p><p> 2 俄羅斯方塊游戲的分析與設(shè)計</p><p> 2.1 俄羅斯方塊的設(shè)計原理和技術(shù)需求</p><p> 本軟件是基于單機版俄羅斯方塊的程序設(shè)計原理上的擴展,在原來的基礎(chǔ)上加入了網(wǎng)絡(luò)互連,在原來的單機模式和雙人對戰(zhàn)模式上增加了網(wǎng)絡(luò)對戰(zhàn)模式。
24、即與原始的俄羅斯方塊的程序設(shè)計原理基本上是相同的,而方塊的模型建立,游戲的操作流程和游戲的過程中軟件進行各種判斷的原理是相同的,但是與原始的俄羅斯方塊相比,本軟件在原有的基礎(chǔ)上又加入了一些新的理念和新的設(shè)計技術(shù)。比如說:新增加了網(wǎng)絡(luò)多人分組對戰(zhàn)、網(wǎng)絡(luò)聊天功能、新的道具模塊等設(shè)計。</p><p> 本軟件與傳統(tǒng)的單機版或雙人版俄羅斯方塊游戲具有一定的區(qū)別,傳統(tǒng)的俄羅斯方塊的設(shè)計模型如下圖2-1所示,本軟件的設(shè)計
25、模型如圖2-2所示。</p><p> 圖2-1 單機版俄羅斯方塊游戲模型圖</p><p> 圖2-2 本系統(tǒng)游戲模型</p><p> 從上兩圖中可以得出傳統(tǒng)的俄羅斯方塊模型與本軟件的游戲模型具有很大的不同,本軟件支持多人在線同時操作,更加豐富。傳統(tǒng)的俄羅斯方塊注重的是人機交換,而本軟件更注意的是人與人之間通過這個網(wǎng)絡(luò)平臺進行的交互。</p>
26、<p> 本軟件為C/S模型。參與游戲的人的機器都作為客戶端客戶端,而服務(wù)器既可以是上述參與游戲的人的機器,也可以是單獨的一臺機器。首先由服務(wù)器端建立服務(wù)器,接下來準(zhǔn)備參與游戲的人可以打開客戶端通過連接服務(wù)器的IP地址進去服務(wù)器,再服務(wù)器將所接受的用戶信息在返回給用戶。</p><p> 游戲運行的原理如圖2-3所示。</p><p> 圖2-3 本游戲系統(tǒng)原理圖<
27、/p><p> 本軟件主要有以下幾個功能:</p><p> 1.建立服務(wù)器。在安裝了服務(wù)器端的電腦上打開服務(wù)器端輸入IP地址并建立服務(wù)器。</p><p> 2.玩家打開安裝的客戶端,并輸入自己的用戶名,通過特有的IP地址連接到服務(wù)器端所創(chuàng)建的服務(wù)器的房間。 </p><p> 3.連接到本服務(wù)器的所有玩家進行分組并都準(zhǔn)備游戲,當(dāng)該房間
28、有至少兩個組的玩家準(zhǔn)備好了就可以進行對戰(zhàn)了。</p><p> 4.游戲結(jié)束后,本軟件會對本局游戲各組玩家的積分和道具的使用狀況進行統(tǒng)計。</p><p><b> 2.2可行性研究</b></p><p> 2.2.1設(shè)計目的 </p><p> 2.2.2可行性分析</p><p>
29、 管理可行性:本游戲的開發(fā)職位檢測自己大學(xué)四年所學(xué)到的知識,是在基于傳統(tǒng)的俄羅斯方塊設(shè)計原理上新添加了網(wǎng)絡(luò)對戰(zhàn)模塊。便于管理。</p><p> 經(jīng)濟可行性:做這個游戲的背景是畢業(yè)設(shè)計,并不注重開發(fā)出來后的經(jīng)濟效益和以后的發(fā)展方向,重在檢測自身的知識水平,軟件開發(fā)過程中的經(jīng)濟需求也不高,只需要本人和一臺電腦,不需要考慮經(jīng)濟問題。</p><p> 技術(shù)可行性:本游戲為C/S模型,用C
30、++語言編寫,開發(fā)工具是VC6.0。</p><p> 社會可行性:本游戲只為檢測和鞏固自己所學(xué)知識,開發(fā)出來的成品只供自己娛樂和使用,不用考慮對社會的影響,也不用考慮版權(quán)和法律的問題。</p><p> 2.3軟件的開發(fā)技術(shù)和開發(fā)工具的簡介</p><p> 游戲主要基于的技術(shù)原理是socket編程。套接字(socket)是一種網(wǎng)絡(luò)編程接口,它是對通信端點的
31、一種抽象,提供了一個發(fā)送和接收數(shù)據(jù)的機制。套接字技術(shù)最先應(yīng)用于unix系統(tǒng),后來移植到windows系統(tǒng),有了Winsock API。經(jīng)過對Winsock API的低層封裝產(chǎn)生了CAsyncSocket類,經(jīng)過高層次的封裝產(chǎn)生了CSocket類。 CSocket進行通信的過程很簡單。服務(wù)器首先啟動,通過調(diào)用socket函數(shù)建立一個套接口,然后調(diào)用bind函數(shù)將該套接口和本地網(wǎng)絡(luò)地址聯(lián)系在一起,再調(diào)用listen函數(shù)使套接口做好偵聽的準(zhǔn)備
32、,并規(guī)定它的請求隊列的長度,之后就調(diào)用accept函數(shù)來接收連接??蛻舳嗽诮⑻捉涌谥缶涂烧{(diào)用connect函數(shù)來發(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公司推出的一個基于Windows
33、系統(tǒng)平臺、可視化的集成開發(fā)環(huán)境,它的源程序按C++語言的要求編寫,并加入了微軟提供的功能強大的MFC(Microsoft Foundation Class)類庫。MFC中封裝了大部分Windows API函數(shù)和Windows控件,它包含的功能涉及到整個Windows操作系統(tǒng)。MFC不僅給用戶提供了Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)建應(yīng)用程序的組件,這樣,開發(fā)人員不必從頭設(shè)計創(chuàng)建和管理一個標(biāo)準(zhǔn)Windows應(yīng)用程序所需
34、的程序,而是從一個比較高的起點編程,故節(jié)省了大量的時間。使用VC++提供的高度可視化的應(yīng)用程序開發(fā)工具和MFC類庫,可使應(yīng)用程序開發(fā)變得簡單。此外,本程序的開發(fā)人員一直使用VC++6.0進行程序設(shè)計,對此比較熟悉,對其可視化面向?qū)ο蟮木幊烫攸c相對了解,在開發(fā)起來會輕松許多。</p><p><b> 表2-1 硬件需求</b></p><p> 2.4 需求分析
35、 </p><p> 游戲流程需求:7種方塊共有28中狀態(tài)(包含形象重復(fù)的),在屏幕頂端依次隨機下落填充給定的區(qū)域,下落過程中由玩家根據(jù)自己需求的情況下控制方塊的旋轉(zhuǎn)得到自己所需要的圖形,并選擇下落的位置,判斷是否填滿某一行或幾行,若滿消去該行或幾行并獲得積分,在游戲過程中如果某個玩家的區(qū)域在無法放置隨機落下的方塊,則對方獲勝;反之,則對方失敗。游戲的主要功能需求如下:</p><p&g
36、t; 用戶界面需求:7種方塊分別用不同的顏色來顯示,隨機落下的方塊在一定的區(qū)域里根據(jù)玩家的操控進行變形并放在所需的位置上。需要有良好的人機交互和觀賞性的界面,玩家登錄到服務(wù)器房間后可以看到以下模塊:登錄到服務(wù)器的各個玩家的信息、各個玩家在游戲界面中所在的位置、各個玩家是否準(zhǔn)備的畫面、玩家之間進行交流的聊天對話框以及在自己所登錄的界面上在游戲過程中了解到其他玩家的游戲狀況。</p><p> 游戲形狀(方塊)需
37、求:繪制七種常見的基本圖形(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型),各個方塊要能實現(xiàn)它的變形(即旋轉(zhuǎn)),可設(shè)為順時針或逆時針變形,一般為逆時針方向旋轉(zhuǎn)。</p><p> 鍵盤處理事件:方塊隨機下落時,可以通過鍵盤上的方向鍵對方快進行控制。上鍵控制方塊的變形,下鍵控制方塊的加速,左鍵控制方塊向左移動,右鍵控制方塊的向右移動。</p><p> 顯示需求:當(dāng)方塊填滿某一
38、行或幾行時消去該行或幾行,在所消去的行上面的方塊向下移動,并統(tǒng)計所得積分。</p><p><b> 2.3 概要設(shè)計</b></p><p> 2.3.1 功能定義 </p><p> 本系統(tǒng)主要以網(wǎng)絡(luò)通信為基礎(chǔ)實現(xiàn)人與人的交互。它主要包含以下幾大功能模塊:</p><p> (1) 系統(tǒng)初始化模塊<
39、;/p><p> 該模塊主要提供玩家進入游戲時初始化游戲界面的功能。登錄時,玩家需要有一個昵稱,在游戲過程中,玩家能看到其他所有對手的資料。</p><p> (2) 俄羅斯方塊算法模塊</p><p> 該模塊主要實現(xiàn)俄羅斯方塊游戲的控制。其中它主要包括判斷勝負算法模塊和方塊產(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)保證能讓每個玩家看到對手資料。</p><p> 各個模塊主要實現(xiàn)的功能如下:</p><p> 圖2-6 網(wǎng)絡(luò)通信模塊功能圖</p&g
41、t;<p> (4) 游戲界面繪制模塊</p><p> 該模塊是游戲?qū)崿F(xiàn)的核心模塊,它本身并不實現(xiàn)一些游戲控制的功能。但是,它是其他模塊功能的體現(xiàn)。其他模塊都要受它的調(diào)用,從而形成一個游戲系統(tǒng)。該模塊主要由初始化界面繪制和游戲開始界面繪制兩個子模塊組成。它們主要完成界面在不同事件響應(yīng)下游戲界面的繪制和音頻的播放功能。</p><p> 圖2-7 界面繪制模塊圖<
42、/p><p> 以上是游戲功能實現(xiàn)的主要模塊,它們經(jīng)過相互調(diào)用控制,協(xié)作分工最終完成了本游戲系統(tǒng)的設(shè)計。</p><p> 2.3.2 游戲框架設(shè)計</p><p> 本系統(tǒng)采用C/S軟件模型、單線程、阻塞式網(wǎng)絡(luò)通信的設(shè)計方式。系統(tǒng)剛運行的時候都要調(diào)用系統(tǒng)初始化模塊讀取用戶配置信息對游戲主系統(tǒng)進行初始化,之后系統(tǒng)進入游戲主界面。系統(tǒng)通過調(diào)用網(wǎng)絡(luò)通信模塊中的服務(wù)器端
43、模塊完成服務(wù)器的建立,并等待連接。客戶端主界面首先調(diào)用網(wǎng)絡(luò)通信模塊完成與服務(wù)器的連接。連接成功后,系統(tǒng)調(diào)用網(wǎng)絡(luò)通信模塊實現(xiàn)服務(wù)器端玩家和客戶端玩家間操作信息的交互,并通過游戲界面繪制模塊繪制游戲開始后的主界面。游戲結(jié)束后,系統(tǒng)將玩家戰(zhàn)績信息更新到配置文件中。</p><p> 圖2-8 系統(tǒng)層次圖</p><p><b> 3 詳細設(shè)計</b></p>
44、<p> 3.1 系統(tǒng)組成及功能描述</p><p> 本游戲軟件是在傳統(tǒng)的單機版俄羅斯方塊游戲的基礎(chǔ)上增加了網(wǎng)絡(luò)多人分組對抗對戰(zhàn)模式。增加了人與人間的交流和各種道具的使用,增強了俄羅斯方塊的趣味性和可玩性。</p><p> 本游戲的主要功能是:通過客戶端登錄到服務(wù)器的各個玩家可以自己選擇同伴和對手,因為本游戲設(shè)計的目的就是進行網(wǎng)絡(luò)多人分組對抗,需要至少有兩支隊伍才可
45、以進行游戲。在游戲過程的中,各個玩家通過消去方塊可以隨機獲得某個道具,這些道具有的可以增加游戲的難度,如在底部添加幾行。也有降低游戲難度的,如減少當(dāng)前玩家底部的行數(shù),玩家們可以通過自己的需求給己對或?qū)Ψ绞褂玫谰邅斫档图悍接螒虻碾y度或增加對方的游戲難度。另外,為了增強俄羅斯方塊的競爭、可玩性和趣味性,同時使用網(wǎng)絡(luò)的優(yōu)勢,玩家和玩家之間可以通過對話框進行聊天,溝通。</p><p> 本軟件的組成:本軟件為C/S軟
46、件模型,主要由軟件初始化模塊、游戲算法模塊、網(wǎng)絡(luò)通信模塊、界面繪制模塊四部分組成。</p><p> 3.2 系統(tǒng)初始化模塊設(shè)計</p><p> 軟件初始化模塊是從配置文件中讀取玩家的信息完成游戲初始化的過程。</p><p> 在游戲結(jié)束后該模塊會自動保存玩家戰(zhàn)績信息到配置文件中。</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)玩家點擊準(zhǔn)備時,頭像就變?yōu)椴噬?,如圖3-2(b)。這時
48、,如果至少有兩組玩家準(zhǔn)備號,就可以開始游戲。</p><p> 3.3 游戲算法實現(xiàn)模塊</p><p> 本俄羅斯方塊游戲中,有相當(dāng)大的篇幅是算法的實現(xiàn)模塊部分。無論是傳統(tǒng)版單機俄羅斯方塊,還是本網(wǎng)絡(luò)多人分組對戰(zhàn)模式的俄羅斯方塊都離不開算法的支持。接下來詳細介紹本軟件的算法。圖3-3為游戲主要函數(shù)調(diào)用流程圖。首先從一個方塊random()的隨機產(chǎn)生開始,判斷是否能產(chǎn)生方塊。如果不能,
49、則直接在massagebox中顯示游戲結(jié)束;如果能,則刷新容器內(nèi)的的圖,接下來判斷方塊能否下落和鍵盤事件,根據(jù)相應(yīng)的鍵盤事件進行相關(guān)判斷,如,按上旋轉(zhuǎn)鍵,則判斷方塊能否進行旋轉(zhuǎn),左右移動也是類似。方塊落下后,進行一次判斷,看游戲是否失敗,失敗則提示游戲結(jié)束,否則,繼續(xù)產(chǎn)生新的方塊。調(diào)用流程如圖3-3。</p><p> 圖3-3 方塊產(chǎn)生后函數(shù)調(diào)用流程圖</p><p> 主要的游戲過
50、程如下:游戲開始隨機產(chǎn)生一個方塊,接下來判斷方塊是否已經(jīng)到達底部,如果不是,則執(zhí)行自動下降或根據(jù)鍵盤事件快速下降,直到下降到底部,并進行判斷是否滿足消行條件進行消行操作。否則,繼續(xù)隨機生成下一個下落方塊,在下一個方塊的提示框中用新生成的方塊代替先前在該方框顯示的方塊,并用先前在該方框里方塊作為當(dāng)前下落的方塊,當(dāng)方塊產(chǎn)生時就已經(jīng)在底部(即在游戲區(qū)域的頂端),則游戲結(jié)束。否則,繼續(xù)循環(huán)該流程。流程圖如圖3-4所示。</p>&
51、lt;p> 圖3-4 游戲流程圖</p><p><b> 3.3.1方塊實現(xiàn)</b></p><p> 所有的部件及已停止的部件均用小方格來表示。整個游戲區(qū)域?qū)?yīng)一個二維數(shù)組,數(shù)組元素為0時,表示空白;為1時,表示已有方格。該數(shù)組存儲所有已經(jīng)不能移動的部件。部件采用一維數(shù)組表示,這些一維數(shù)組實際表是一個n×n的矩陣。如表示一個方塊使用一個2
52、215;2的矩陣,實際存儲{1,1,1,1};如表示一個長條使用一個4×4的矩陣,實際存儲{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}。</p><p> 實際顯示的時候,先畫出已停止的方塊,然后計算出正在下落的部件的正確坐標(biāo)位置并其將畫出,同時在固定位置畫出預(yù)覽方塊。</p><p> 旋轉(zhuǎn)部件時,只需變換存儲部件的矩陣即矩陣的轉(zhuǎn)置,使其對應(yīng)為轉(zhuǎn)換后的
53、形態(tài),并將其顯示出即可。</p><p> 判斷部件是否可以下落、旋轉(zhuǎn)、左移、右移時,將表示部件的數(shù)組對應(yīng)到游戲區(qū)域的二維數(shù)組中,再判斷是否允許操作。當(dāng)部件無法再操作時,將部件數(shù)組中對應(yīng)填入游戲區(qū)域中對應(yīng)的二維數(shù)組。</p><p> 使一層消失可以通過判斷游戲區(qū)域中的二維數(shù)組是否某一行全為1;如果該數(shù)組的第一行全為1或已沒有足夠的空白使新的部件可以加入到游戲區(qū)域中,則游戲結(jié)束。<
54、;/p><p> 3.3.2數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)</p><p> 游戲方塊Componet結(jié)構(gòu)體</p><p> typedef struct tagComponet</p><p> {int intComID; //部件的ID號</p><p> int ntDimension; //存儲該部件所
55、需的數(shù)組維數(shù)</p><p> int* pintArray; //指向存儲該部件的數(shù)組 </p><p> }Componet;</p><p> Componet結(jié)構(gòu)體表示某個游戲方塊具體的屬性,每個游戲方塊對應(yīng)有一個編號,且有對應(yīng)存儲該部件的數(shù)組,用指針指向該數(shù)組,并設(shè)定存儲該部件所需數(shù)組(n×n)的維數(shù)。</p><
56、p> Componet結(jié)構(gòu)體數(shù)組</p><p> 初始化游戲方塊,即定義MAXCOM個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> 以上代碼是對長條這個方塊的定義和初始化。其余形狀的6種方塊的定義不在此贅述。</p><p> 3.3.3游戲功能實現(xiàn)</p><p><b> 1、游戲方塊預(yù)覽</b></p><
62、p> 游戲中的方塊將在4*4的正方形小方塊中預(yù)覽,如圖4所示。使用隨機函數(shù)rand( )來產(chǎn)生0~6之間的游戲方塊編號,其中的正方形小方塊的大小為SIZE*SIZE。SIZE為所設(shè)定的方塊像素大小。</p><p><b> 2、游戲方塊控制</b></p><p> (1)左移的實現(xiàn)過程:</p><p> a.首先判斷方塊在矩
63、形“容器”中能否能左移。要想左移必須滿足以下兩個條件:(1)如果正在下落的方塊整體左移一位后,該方塊不超越“矩形”容器的左邊線,否則出界,不能執(zhí)行該操作;(2)在該4*4方塊有值(值為1)的位置,“矩形”容器內(nèi)在這時必須是沒有被占用的(占用時,值為1),否則,不能執(zhí)行該操作。如果能同時滿足上述這兩個條件,則執(zhí)行左移操作,否則不執(zhí)行左移操作。</p><p> b.清除執(zhí)行左移操作前的方塊。</p>
64、<p> c.該方塊左移后,在左移一位后的位置,重新顯示此游戲方塊。(b、c操作步驟中涉及到的如何清除和顯示方塊的函數(shù)在第四章中的功能函數(shù)設(shè)計中將會詳細進行闡述)。</p><p> (2)右移的實現(xiàn)過程:</p><p> a. .首先判斷方塊在矩形“容器”中能否能右移。要想右移必須滿足以下兩個條件:(1)如果正在下落的方塊整體右移一位后,該方塊不超越“矩形”容器的右邊
65、線,否則出界,不能執(zhí)行該操作;(2)在該4*4方塊有值(值為1)的位置,“矩形”容器內(nèi)在這時必須是沒有被占用的(占用時,值為1),否則,不能執(zhí)行該操作。如果能同時滿足上述這兩個條件,則執(zhí)行右移操作,否則不執(zhí)行右移操作。</p><p> b.清除執(zhí)行左移操作前的方塊。</p><p> c.該方塊右移后,在右移一位后的位置,重新顯示此游戲方塊。(b、c操作步驟中涉及到的如何清除和顯示方
66、塊的函數(shù)在第四章中的功能函數(shù)設(shè)計中將會詳細進行闡述)。</p><p> (3)向下加速下落(下移)的實現(xiàn)過程:</p><p> a. 首先判斷方塊在矩形“容器”中能否能右移。要想右移必須滿足以下兩個條件:(1)如果正在下落的方塊整體右移一位后,該方塊不超越“矩形”容器的底邊線,否則出界,不能執(zhí)行該操作;(2)在該4*4方塊有值(值為1)的位置,“矩形”容器內(nèi)在這時必須是沒有被占用的
67、(占用時,值為1),否則,不能執(zhí)行該操作。如果能同時滿足上述這兩個條件,則執(zhí)行下移操作,否則不執(zhí)行下移操作。</p><p> b.清除執(zhí)行右移操作前的方塊。</p><p> c.該方塊右移后,在右移一位后的位置,重新顯示此游戲方塊。</p><p> (4)旋轉(zhuǎn)的實現(xiàn)過程:</p><p> a. 首先判斷方塊在矩形“容器”中能否
68、旋轉(zhuǎn)。要想旋轉(zhuǎn)必須滿足以下兩個條件:(1)如果游戲方塊整體旋轉(zhuǎn)后,游戲方塊不能超過“矩形”容器的左邊線、右邊線、底邊線,否則越界,不能執(zhí)行該操作;(2)在該4*4方塊有值(值為1)的位置,“矩形”容器內(nèi)在這時必須是沒有被占用的(占用時,值為1),否則,不能執(zhí)行該操作。如果能同時滿足上述這兩個條件,則執(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í)行左右移動、下落、旋轉(zhuǎn)操作時,首先要清除先前位置的游戲方塊,再根據(jù)操作向左一位、向右一位、向下一位或在顯示區(qū)域不變的位置重新繪制游戲方塊。</p><p> b.當(dāng)某一行
70、或幾行填滿方塊消去時,上方不能移動的方塊下移后,進行重新繪制。</p><p> 清除游戲方塊的過程為:首先用刷新函數(shù)刷新相應(yīng)的游戲區(qū)域,清除執(zhí)行操作前顯示的方塊,執(zhí)行相應(yīng)的操作后,再次調(diào)用刷新函數(shù)刷新此區(qū)域,顯示將要顯示的游戲方塊。</p><p><b> 4、游戲幫助功能</b></p><p> 在幫助的功能選項中直接添加靜態(tài)文本
71、即可。</p><p> 3.4 網(wǎng)絡(luò)通信模塊</p><p> 網(wǎng)絡(luò)通信模塊是各個玩家實體之間連接。它的主要作用是將兩個以上的玩家進行交流和溝通,通過聊天對話框?qū)崿F(xiàn)人與人之間的交互。進而提高俄羅斯方塊的趣味性、交互性、可玩性。具體來說本游戲的網(wǎng)絡(luò)通信模塊主要包括服務(wù)器端和客戶端兩個模塊。服務(wù)器端模塊創(chuàng)建服務(wù)器為客戶端提供服務(wù),接受客戶端的連接??蛻舳四K主要用于將客戶端連接到服務(wù)器端
72、,建立連接之后,服務(wù)器和客戶端分別將玩家的操作情況以消息的形式進行交互,并根據(jù)消息更新容器內(nèi)玩家進度以及響應(yīng)各種請求。</p><p> 套接字建立:系統(tǒng)繼承CAsyncSocket類生成派生類CFiveSocket,并在CFiveSocket類中重載了OnAccept、OnConnect、OnReceive、OnClose消息。服務(wù)器的建立遵循CSocket編程的一般步驟,首先創(chuàng)建監(jiān)聽套接字,調(diào)用Listen
73、()監(jiān)聽客戶端的連接。有客戶端請求連接時,調(diào)用Accept()接受客戶端的連接。連接成功后,就可以調(diào)用ReceiveData()接收已連接客戶端發(fā)送來的消息。客戶端封裝CSocket類生成了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()來接收客戶端發(fā)送的消息,利用Send()來發(fā)送消息??蛻舳艘仓剌d了ReceiveData()來接收服務(wù)器發(fā)送來的消息。由于本系統(tǒng)中發(fā)送和接收的數(shù)據(jù)樣式各不相同,因此本系統(tǒng)自定義消息格式,統(tǒng)一數(shù)據(jù)的發(fā)送方式。</p><p> 3.5 游戲界面繪制模塊</p>
75、<p> 設(shè)計游戲的良好的游戲界面目的是能給游戲玩家提供良好的視覺感受。所以,游戲界面的回執(zhí)非常重要。前面各模塊的功能主要集中在游戲邏輯的實現(xiàn),那么游戲界面繪制模塊就是將看不見的游戲邏輯讓游戲玩家能夠看見,從而幫助玩家正確的完成操作。該模塊貫穿整個游戲系統(tǒng),從進入游戲到最后退出游戲都將用到該模塊來繪制游戲界面,顯示游戲進行情況。游戲界面繪制模塊實現(xiàn)較復(fù)雜,提供的函數(shù)接口比較煩瑣。從游戲進行的階段可以將該模塊分為游戲初始界面繪
76、制和游戲開始界面繪制。</p><p> 3.5.1 游戲初始界面</p><p> 該界面是登錄成功后,玩家第一次看見的游戲界面,此時,游戲玩家沒有作出任何操作。但圖中昵稱為456的玩家已經(jīng)準(zhǔn)備游戲,123尚未準(zhǔn)備,界面效果圖如圖3-5所示。</p><p> 圖3-5 游戲初始界面</p><p> 初始界面繪制原理是:由重繪消息
77、WM_PAINT消息觸發(fā)CBoard類中的OnPaint()函數(shù)對界面進行重繪制。系統(tǒng)先創(chuàng)建內(nèi)存DC,在內(nèi)存中先繪制好主界面和根據(jù)保存當(dāng)前界面情況數(shù)據(jù)的二維數(shù)組m_data繪制方塊,最后再將內(nèi)存中的界面數(shù)據(jù)直接拷貝到設(shè)備當(dāng)中,這樣就很好地解決了在游戲過程中由于不斷刷新界面數(shù)據(jù)而導(dǎo)致屏幕閃爍的問題。</p><p> 3.5.2 游戲開始界面</p><p> 游戲開始界面是指兩個玩家已
78、經(jīng)建立連接,游戲開始后的游戲界面。此時的游戲界面是最復(fù)雜的,游戲界面時刻都在變化,它動態(tài)的顯示了玩家游戲進行的情況。游戲效果圖如圖3-6所示。</p><p> 圖3-6 游戲開始界面 </p><p> 從上面圖形可以看到本階段的界面顯示變化較快,變化的方式較多,但是它的繪制原理并沒有太大的變化,只是系統(tǒng)操作變得更多,收發(fā)的消息更多而已。</p><p>
79、總之,游戲界面的繪制都是以系統(tǒng)消息為主導(dǎo)的,收到什么消息就會繪制相應(yīng)的游戲界面。</p><p> 4 俄羅斯方塊游戲的實現(xiàn)</p><p> 4.1 實現(xiàn)原理和主要機制 </p><p><b> ?。?)定時制機制</b></p><p> 從分析俄羅斯方塊游戲的特點而得,在游戲開始時定時器就應(yīng)該產(chǎn)生并生
80、效,而在游戲暫停時使已經(jīng)制定的定時器失效,當(dāng)游戲從暫停狀態(tài)回到游戲狀態(tài)時,系統(tǒng)再重新創(chuàng)建一個定時器并激活使其正常工作;當(dāng)游戲結(jié)束時,則將制定的定時器銷毀。經(jīng)上所述所以在游戲的開始、暫停、結(jié)束分別對應(yīng)的游戲開始函數(shù)、暫停函數(shù)、結(jié)束函數(shù)中進行定時器的控制,對定時器進行創(chuàng)建激活、失效與銷毀處理。所以,先在VC6.0資源編輯器菜單資源選項里面新添加三個菜單選項,然后通過時類圖實現(xiàn)即分別是游戲的“開始”、“暫?!?、和“結(jié)束”,然后利用ClassW
81、izard直接在視圖類對象Cskyblue_RectView中分別為它們添加空白的處理函數(shù),具體函數(shù)添加如表4-1所示。</p><p> 表4-1 菜單選項功能對應(yīng)表</p><p><b> ?。?)定時處理</b></p><p> 經(jīng)過定時器的設(shè)置后,這里通過利用類向?qū)В–lassWizard)跳到定時器到時候所處的處理函數(shù)OnTi
82、mer()去實現(xiàn),當(dāng)系統(tǒng)所設(shè)置的固定時間片間隔到時后,首先先檢測當(dāng)前所下落的方塊是否已經(jīng)到達了底部,如果否則繼續(xù)進行RectDown(),即方塊繼續(xù)向下一個單位移動的操作;如果是則方塊下落到底后,并隨機產(chǎn)生一個新的“下一個方塊”,并代替舊的,將先前所產(chǎn)生的舊的“下一個方塊”作為當(dāng)前定時器激活狀態(tài)下所正在使用的方塊,并對使用后的游戲當(dāng)前的狀態(tài)進行檢測:</p><p> 方塊到達當(dāng)前游戲狀態(tài)的底部,并滿足某一行或
83、幾行填充滿的情況下消去該一行或幾行。</p><p> ?。?)方塊到達當(dāng)前游戲狀態(tài)的底部的同時到達游戲區(qū)域的頂部,而且不滿足消行的條件,進而判斷該玩家所參與的游戲是否因為違反規(guī)則而結(jié)束游戲。</p><p> 本游戲使用視圖類所創(chuàng)建得m_icurrentStatus和m_inextStatus兩個成員變量來記錄七種不同類型的下落方塊。而m_currentRect除了記錄下落方塊的,還要
84、記錄下落方塊在下落過程中當(dāng)前的變形狀態(tài)。m_icurrentStatus和m_inextStatus以及m_currentRect記錄方塊的狀態(tài)時最多用兩位表示,第1位用作方塊的類型標(biāo)識(1~7),第2位用作同種類型的方塊的不同變換形態(tài) (1~4),七種類型的方塊每種類型最多有四種變換形態(tài)。</p><p> 將當(dāng)前方塊的狀態(tài)的記錄和先前的下落方塊保存下來,利用random(小于或等于所指定的正整數(shù)),并根據(jù)這
85、個正整數(shù)來確定下一個下落方塊的類型。接下來進行初始化,在屏幕的左上角根據(jù)上述的產(chǎn)生的方塊狀態(tài)進行更新圖。注意在方塊剛開始下落的時候要保證方塊要全部顯示在所指定的游戲區(qū)域里,所以要進行縱坐標(biāo)的根據(jù)方塊的類型狀態(tài)向下進行一定的偏移。</p><p> ?。?)當(dāng)前方塊底部到達的判斷與銷行的實現(xiàn)</p><p> 圖4-1 處理方塊到達圖</p><p> 當(dāng)新的方塊
86、下落時,要判斷這個方塊是否已經(jīng)到達了區(qū)域底部,可以利用數(shù)組InterFace[74][4]所記錄7種不同類型方塊的4種不同形態(tài)的接觸面信息,通過當(dāng)前下落方塊所對應(yīng)的接觸面的方塊位置為被占用狀態(tài)(MAP_STATE_NOT_EMPTY=1)來確定。如果方塊到達底部,則需判斷情況。如果滿足消行條件,則進行消行,如果不滿足,則記錄當(dāng)前方塊下落的位置并加載下一個方塊繼續(xù)游戲,最后改變數(shù)據(jù)狀態(tài)。</p><p> 統(tǒng)計分
87、數(shù):在消行處理里面有一個專門用來統(tǒng)計消行數(shù)的變量,然后根據(jù)變量的值(即小區(qū)的行數(shù))決定分數(shù)的多少,統(tǒng)計分數(shù)的規(guī)則:x*(x*100),x為同時小區(qū)的行數(shù),x是大于等于1且小于等于四的正整數(shù)。即消一行得100分,同時消2行得400分。如果沒有滿行,則加載下一個方塊繼續(xù)游戲。</p><p> 圖4-2 判斷滿行及銷行圖</p><p> 檢測游戲區(qū)域中的所有行,,并對每行的所有縱列狀態(tài)進
88、行檢測,如果其中有一列是空閑狀態(tài)則不可以銷行。如果可以某行或某幾行滿足銷行的話,改變統(tǒng)計分數(shù),并且將該行或幾行清空,再將該行或幾行上面的所有方塊都向下偏移一個或幾個單位,以填充該行或幾行的空缺。</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> 在視圖類對象中增加了m_iStartX和m_iStartY兩個成員變量,它們分別為視圖窗口的左上角起點的坐標(biāo)偏移值。如果該函數(shù)檢測到有消行的操作,經(jīng)過數(shù)據(jù)的修改后,將消行行后的區(qū)域空白出
92、來以及分數(shù)顯示區(qū)域的部分進行修改即進行重繪。所以函數(shù)體分別先計算出這兩個小矩形區(qū)域的位置,然后再調(diào)用InvalidateRect()函數(shù)對這兩個區(qū)域宣布重繪,從而觸發(fā)視圖的重繪。</p><p> 4.2 主要的功能函數(shù)</p><p> 在MFC視圖類中添加功能構(gòu)造函數(shù),主要的功能函數(shù)設(shè)計如下:</p><p> CELSblockView():</p
93、><p> 函數(shù)原型:CELSblockView::CELSblockView()</p><p> CELSblockView()初始化游戲的各項數(shù)據(jù),“矩形”容器(游戲地圖)、游戲級別、當(dāng)前部件的ID、游戲分數(shù)、隨機函數(shù)。定義并初始化MAXCOM個方塊部件信息(MAXCOM為7),且在對應(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ū)域、不能移動的方塊、下落的部件,顯示得分、級別、下一個方塊。</p><p> OnKeyDown():</p><p> 函數(shù)原型:void C
95、ELSblockView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)</p><p> OnKeyDown()對鍵盤信息處理,讀取鍵盤操作值,對當(dāng)前部件,調(diào)用CanLeft()、CanRight()、CanRotate()、CanDown(),并實現(xiàn)左移、右移、旋轉(zhuǎn)、加速下落。</p><p> OnTimer():</p&
96、gt;<p> 函數(shù)原型:void CELSblockView::OnTimer(UINT nIDEvent)</p><p> OnTimer()是定時器消息處理函數(shù),顯示預(yù)覽部件,調(diào)用CanDown()判斷能否下移,實現(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ī)則增加和顯示游戲分數(shù)。</p><p> MyInvalidateRect():</p><p> 函數(shù)原型:Void CELSblockView
103、::MyInvalidateRect(POINT ptStart,int intDimension)</p><p> MyInvalidateRect()刷新了一個以ptStart為坐上角,長度為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)的功能實現(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),可以通過對WM_KEYDOWN消息的處理函數(shù)進行截獲并重寫來實現(xiàn),下面是對該處理函數(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)方塊要進行變形或向左、右、下移動時,首先要對方塊將要移動到的位置進行判斷,判斷是否有障礙,如果有該操作不被執(zhí)行,方塊則仍然保持到原來的位置不變;如果沒有則根據(jù)玩家所按的鍵執(zhí)行相關(guān)的操作。并把該方塊的位置顯示出來。其實方塊的各個方向的移動知識對方塊所處的坐標(biāo)的變化。</p
111、><p><b> ?。?)變形的實現(xiàn)</b></p><p><b> 圖4-4圖方塊變化</b></p><p> 本游戲通過鍵盤的向上鍵來控制方塊的變形。即當(dāng)玩家按下向上鍵時,程序就會執(zhí)行方塊變化change()函數(shù)。方塊的類型有七種(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型),而每個隨機產(chǎn)生的方塊都有
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 俄羅斯方塊分組對抗游戲的實現(xiàn)畢業(yè)論文
- 俄羅斯方塊游戲畢業(yè)論文
- 俄羅斯方塊游戲java畢業(yè)論文
- 俄羅斯方塊游戲開發(fā)畢業(yè)論文
- 畢業(yè)論文(java游戲俄羅斯方塊)
- 俄羅斯方塊單人游戲的實現(xiàn)畢業(yè)論文
- 俄羅斯方塊畢業(yè)論文
- 畢業(yè)論文俄羅斯方塊的實現(xiàn)系統(tǒng)
- java俄羅斯方塊畢業(yè)論文
- 畢業(yè)論文----java俄羅斯方塊
- 基于單片機實現(xiàn)的俄羅斯方塊游戲畢業(yè)論文
- 畢業(yè)論文-java俄羅斯方塊
- 基于fpga的俄羅斯方塊游戲設(shè)計畢業(yè)論文
- 基于單片機實現(xiàn)的俄羅斯方塊游戲-畢業(yè)論文
- 基于單片機實現(xiàn)的俄羅斯方塊游戲-畢業(yè)論文
- 畢業(yè)論文——基于單片機實現(xiàn)的俄羅斯方塊游戲
- 基于fpga的俄羅斯方塊游戲設(shè)計畢業(yè)論文
- 俄羅斯方塊游戲畢業(yè)設(shè)計
- 畢業(yè)論文范文——俄羅斯方塊游戲課程設(shè)計
- 俄羅斯方塊論文
評論
0/150
提交評論