畢業(yè)論文設計基于C++的掃雷游戲設計與實現(xiàn)38822_第1頁
畢業(yè)論文設計基于C++的掃雷游戲設計與實現(xiàn)38822_第2頁
畢業(yè)論文設計基于C++的掃雷游戲設計與實現(xiàn)38822_第3頁
畢業(yè)論文設計基于C++的掃雷游戲設計與實現(xiàn)38822_第4頁
畢業(yè)論文設計基于C++的掃雷游戲設計與實現(xiàn)38822_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于c+的經(jīng)典掃雷游戲程序設計目錄摘 要31、引言41.1 課題背景及意義41.2 visual c+ 發(fā)展概況5 1.3關(guān)于本課題62、游戲的總體分析與設計72.1 游戲功能簡介72.2設計構(gòu)想72.3流程規(guī)劃83、掃雷游戲的具體實現(xiàn)過程93.1掃雷游戲模塊的實現(xiàn)9 3.1.1 掃雷游戲主窗體的創(chuàng)建9 3.1.2 主界面控制菜單的設計133.2掃雷游戲核心-布雷算法設計133.3 掃雷鼠標事件的處理203.4掃雷其它處理27 3.4.1 難度設置菜單消息處理27 3.4.2 背景音樂菜單消息處理28 3.4.3其它處理294、掃雷游戲程序的調(diào)試與運行295、掃雷游戲設計總結(jié)316、致謝317

2、、參考文獻32摘要游戲業(yè)發(fā)展一日千里,該行業(yè)極大的影響和改變了人們的生活和娛樂方式,游戲為消費者提供豐富多彩的虛擬空間,使消費者可以自由自在的享受虛擬世界的樂趣,實現(xiàn)自己在現(xiàn)實生活著那個可能永遠不能實現(xiàn)的夢想,滿足了消費者的心理和精神需求。掃雷游戲是windows操作系統(tǒng)自帶的一個小游戲,過去的幾年里windows操作系統(tǒng)歷經(jīng)數(shù)次換代,變得越來越龐大、復雜,但這個可愛的小游戲在任何版本的windows操作系統(tǒng)里去卻依然保持著原貌。但幾乎每個電腦使用者都接觸過它,并且深愛著這款小游戲。掃雷游戲是比較經(jīng)典的一款小游戲,實現(xiàn)它的方法很多,可以用很多不同算法和語言實現(xiàn),如c,c+,vb,java等。本

3、論文研究的是以visual c+ 6.0為開發(fā)環(huán)境,設計并開發(fā)一款掃雷游戲,其功能類似于windows操作系統(tǒng)自帶的掃雷游戲。論文首先介紹了制作游戲的整體思路及整個游戲設計的流程規(guī)劃,然后介紹了雷區(qū)的布置及地雷隨機產(chǎn)生的實現(xiàn)方法;重點介紹了在游戲過程中各事件的處理,其中又以鼠標事件和清除未靠近地雷區(qū)方塊這兩方面最為最要,鼠標事件是利用鼠標所發(fā)出的信息了解使用者的意圖,進而做出相對應的動作,而清除未靠近地雷區(qū)方塊由于引進了“遞歸”這個概念而使其簡單化。關(guān)鍵字:掃雷;visual c+ 6.0;事件;遞歸abstractgame industry develops by leaps and bou

4、nds,and it has a great impact on the way people live and entertainment, games provide consumers with a variety of virtual space, so that consumers can enjoy the free fun of the virtual world, achieve the dream that may never achieve in real life, and satisfy the psychological and spiritual needs con

5、sumer.the sweep mine game is a small game that the windows operating system have. over the past few years the windows operating system has experienced a number of chang,and become much larger and more complexed. however, this lovely game in any version of the windows operating system has keep the or

6、iginal appearance. almost every computer users have come into contact with it, and love this game.the sweep mine game is an classical little game, and there are many ways can achieve it,we can use many different algorithms and languages,such as c,c+,vb,java and so on.this study is based on visual c+

7、 6.0 to designed and made the sweep mine game,its function is similar to the game that the windows operating system has. first we introduced the whole idea of making the game and the process planning of the game design,then introduced the method of the layout of minefields and mines randomly generat

8、ed. and focuses on the process of dealing with the incident in the game, among them, the mouse events and clearance of unexploded landmines around the box are the two most important thing, the mouse events is to use the message that the mouse give to understand the the users intent, then make the co

9、rresponding action, and clearance of unexploded landmines around the box has became simply with the introduction of the recursive .key words: sweep mine, visual c+ 6.0, affairs, recursion1 引言1.1 課題背景及意義 當前隨著計算機的深入普及,越來越多的人有了個人電腦,人們運用計算機完成許多重要的工作,計算機在人們的生活中變的越來越來重要。隨著計算機的應用和發(fā)展計算機已經(jīng)不單純是一個工作工具,人們越來越重視計

10、算機的娛樂性了,近年來游戲產(chǎn)業(yè)規(guī)模持續(xù)成長,全球每年游戲業(yè)總產(chǎn)值已經(jīng)突破200億美金,遠遠超越好萊塢電影產(chǎn)業(yè)以及音樂娛樂事業(yè),而成為目前娛樂事業(yè)的最大主流。不過游戲產(chǎn)業(yè)光鮮亮麗的背后,卻也隱含著高風險、高成本的危機,顯示游戲產(chǎn)業(yè)慢慢步入“微利時代”。目前整個游戲產(chǎn)業(yè)的運作模式已經(jīng)跟好萊塢電影產(chǎn)業(yè)的運作模式相同,電影產(chǎn)業(yè)有制片、發(fā)行、宣傳等分工,游戲產(chǎn)業(yè)亦同,由專業(yè)的游戲研發(fā)小組負責研發(fā)游戲,也有如微軟、美商藝電這類國際級大廠負責游戲發(fā)行,甚至連“游戲制作人”也被培養(yǎng)成明星一樣成為一種招牌,如任天堂有王牌制作人宮本茂、sega有鈴木裕、konami有小島秀夫、capcom有三上真司、tecmo有

11、板垣伴信.等,明確的游戲產(chǎn)業(yè)分工的確有助于游戲產(chǎn)業(yè)的規(guī)模發(fā)展與進化,但也無形中讓游戲開發(fā)成本大增。為了降低游戲開發(fā)成本,開發(fā)娛樂性強成本低的游戲就成為當前的主要課題,在這種趨勢下各種小型的低成本的游戲軟件應運而生。在這其中,系統(tǒng)自帶的小游戲也占據(jù)了相當重要的地位,與那些網(wǎng)絡游戲和3d游戲相比,它有編寫簡單容易上手等特點,非常適合人們在完成工作的時候適當?shù)膴蕵芬?。這些小游戲大都是以益智和娛樂為目的,不僅給緊張工作的人們以放松,還可以讓人們的大腦得到開發(fā)。這些小游戲包括掃雷,彈球,紙牌等等。而本課題就是掃雷游戲的設計。1.2 visual c+ 發(fā)展概況visual c+是一個功能強大的可視化軟

12、件開發(fā)工具。自1993年microsoft公司推出visual c+1.0后,隨著其新版本的不斷問世,visual c+已成為專業(yè)程序員進行軟件開發(fā)的首選工具。雖然微軟公司推出了visual c+.net(visual c+7.0),但它的應用的很大的局限性,只適用于windows 2000,windows xp和windows nt4.0。所以實際中,更多的是以visual c+6.0為平臺。visual c+6.0不僅是一個c+編譯器,而且是一個基于windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,ide)。visual c+

13、6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppwizard、類向?qū)lass wizard等開發(fā)工具。 這些組件通過一個名為developer studio的組件集成為和諧的開發(fā)環(huán)境。visual c+它大概可以分成三個主要的部分:1 developer studio,這是一個集成開發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標題赫然寫著“microsoft visual c+”,所以很多人理所當然的認為,那就是visual c+了。其實不然,雖然developer studio提供了一個很好的編輯器和很多wizard,但實際上它沒有任何編譯和鏈接程序的功能,真正完成

14、這些工作的幕后英雄后面會介紹。我們也知道,developer studio并不是專門用于vc的,它也同樣用于vb,vj,vid等visual studio家族的其他同胞兄弟。所以不要把developer studio當成visual c+, 它充其量只是visual c+的一個殼子而已。這一點請切記!2 mfc,從理論上來講,mfc也不是專用于visual c+,borland c+,c+builder和symantec c+同樣可以處理mfc。同時,用visual c+編寫代碼也并不意味著一定要用mfc,只要愿意,用visual c+來編寫sdk程序,或者使用stl,atl,一樣沒有限制。不

15、過,visual c+本來就是為mfc打造的,visual c+中的許多特征和語言擴展也是為mfc而設計的,所以用visual c+而不用mfc就等于拋棄了visual c+中很大的一部分功能。但是,visual c+也不等于mfc。3 platform sdk。這才是visual c+和整個visual studio的精華和靈魂,雖然我們很少能直接接觸到它。大致說來,platform sdk是以microsoft c/c+編譯器為核心(不是visual c+,看清楚了),配合masm,輔以其他一些工具和文檔資料。上面說到developer studio沒有編譯程序的功能,那么這項工作是由誰來

16、完成的呢?是cl,是nmake,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成visual studio的基石。visual c+ 之所以具有如此廣泛的用途是因為它具有以下的特點:(1) 真正的面向?qū)ο缶幊蹋归_發(fā)人員不用加入太多的代碼,加快了系統(tǒng)開發(fā)的速度。(2) 可視化的編程方法以及向?qū)У墓δ?,使開發(fā)人員不用加入太多的代碼就可以開發(fā)出標準的windows程序。(3) 數(shù)據(jù)訪問的特性,允許對包括microsoft sql server和其他企業(yè)數(shù)據(jù)庫在內(nèi)的大部分數(shù)據(jù)庫格式建立數(shù)據(jù)庫和前端應用程序,以及可調(diào)整的服務器端部件等。(4) 通過activex技術(shù)可使用其他應用程序提供的功能,

17、例如microsoft word字處理器、microsoft excel電子數(shù)據(jù)表及其他windows應用程序,甚至可直接使用visual basic創(chuàng)建的應用程序和對象。(5) internet功能強大,使用戶很容易在應用程序內(nèi)通過internet或企業(yè)內(nèi)部網(wǎng)(intranet)訪問文檔和應用程序,或者創(chuàng)建internet服務器應用程序。(6) 已完成的應用程序是真正的.exe文件,您可以自由發(fā)布。1.3關(guān)于本課題隨著世界經(jīng)濟的長足發(fā)展和計算機技術(shù)的日益成熟,計算機被應用到人類活動的各個領(lǐng)域,各種應用軟件也相繼問世,這其中有相當一部分是游戲軟件。使用游戲軟件自然是為了滿足人們對娛樂性的要求,

18、而有些軟件大都采用3d設計對系統(tǒng)配置的要求較高。在眾多游戲軟件中,也不乏一些小游戲的身影,它們對系統(tǒng)的配置要求較低。能夠滿足人們對娛樂性的需求,是人們在完成工作娛樂時候的最好選擇?,F(xiàn)在越來越多的人投入到這種小游戲的開發(fā)當中,它已經(jīng)成為一類必不可少的游戲軟件。在各種操作系統(tǒng)中都附帶了一些小的游戲,而這些游戲也成為電腦用戶軟件中不可或缺的一部分。作為本系統(tǒng)的開發(fā)工具,microsoft visual c+ 6.0成為首選。它具有可視化的編程界面、詳細的提示、以及完善的幫助文檔,使得軟件開發(fā)人員感到無比的親切感。2 游戲的總體分析與設計2.1 游戲功能簡介 當前各種游戲軟件層出不窮。因為游戲的開發(fā)成

19、本非常大,所以游戲的開發(fā)具有一定的風險性,但是一些小游戲的開發(fā)具有成本小,編寫簡單的優(yōu)勢,所以這些小游戲在游戲開發(fā)中也占有一席之地。在這類小游戲中包括益智類游戲,它以畫面精美游戲方法簡單等特點得到大家的認可。成為人們在工作之余不可或缺的好伙伴。針對真種情況我用vb編寫了掃雷這款小游戲。下面對該游戲的功能做個簡單的介紹。掃雷游戲的基本功能 : 點擊鼠標左鍵于未知區(qū)域,如果未知區(qū)域有雷,游戲停止,顯示所有的地雷。如果沒雷,則顯示周圍雷數(shù),如果周圍沒雷,則再查看周圍八個區(qū)域是否有雷直到有雷為止并顯示,這其實是一個遞歸過程。 點擊鼠標右鍵于未知區(qū)域,則將其置為有雷而不管是否真的有雷??蛇x擇初、中、高三

20、級并可自定義雷數(shù)和區(qū)域大小。雷區(qū)上部左側(cè)顯示總雷數(shù)減被標明有雷區(qū)域的數(shù)目。雷區(qū)上部中間位置顯示一按鈕用于開局和顯示鼠標動作的結(jié)果。雷區(qū)上部右側(cè)顯示掃雷的時間。將雷全部掃清后,則顯示一對話框?qū)⒛愕男彰浫肱判邪瘛?.2設計構(gòu)想相信大多數(shù)使用windows操作系統(tǒng)的使用者,對這款游戲都不陌生。這款游戲不止操作簡單,規(guī)則也不難,再加上游戲速度的控制機制得宜,讓整個游戲在操作過程中充滿了快樂與緊張的氣氛。除了游樂當中能帶給使用者快樂之外,游戲的設計內(nèi)容無形中也不斷訓練使用者的邏輯思考能力,對于依靠高度腦力工作的現(xiàn)代人,都可以通過這個游戲,不時的檢驗一下自己,所以我們不難發(fā)現(xiàn),在各種可攜帶的電子產(chǎn)品上都

21、有這款游戲的蹤影。在設計之前,我們先來了解這款游戲的規(guī)則。在不掀開任何藏有地雷的方塊情況下,以最快的速度找出所有的地雷。如果在掀開方塊的過程中,不小心翻開(踩到)藏有地雷的方塊,則宣告失敗(游戲結(jié)束),惟有將所有不含地雷的方塊掀開,游戲才算成功。游戲的操作方面主要以鼠標為主,當鼠標指針對準未翻開的方塊按下左鍵時即表示翻開方塊,當鼠標指針對準未翻開的方塊按下右鍵時即表示標示或疑示地雷,反復按下右鍵則方塊會以未標示標示疑似三者關(guān)系不斷循環(huán)。游戲者可以通過地雷區(qū)內(nèi)的數(shù)字提示了解以數(shù)字為中心的其周邊八個方格內(nèi)所含的地雷數(shù),假若翻開的方塊顯示數(shù)字“3”,則表示以其為中心的周邊方塊內(nèi)藏有3個地雷。當按下的

22、方塊不是地雷,且周邊八個方塊也都沒有地雷時,方塊會以被翻開方塊的八個方向?qū)⒖瞻追綁K翻開。2.3流程規(guī)劃流程規(guī)劃大致上可以分為三個部分,分別為:畫面初始、游戲者按下第一個方塊和為非地雷方塊時展開。畫面初始時,以游戲者最后一次設定的地雷區(qū)大小為范圍畫出地雷區(qū),但此時并未產(chǎn)生地雷。當游戲者按下第一個方塊時產(chǎn)生地雷資料并啟動定時器,為何在游戲者按下第一個方塊才產(chǎn)生地雷資料呢?其主要的用意在于不要讓游戲者第一次就踩到地雷,這樣在某種程度上可以提高游戲者游玩的氣氛。接著就是如何判斷按下的方塊是非地雷時的處理,這也是整個游戲的技術(shù)核心,我們可以通過遞歸的觀念來檢查周邊的方塊是否含有地雷及是否繼續(xù)往外翻開。

23、基于以上思路,繪制功能圖如下: 掃雷游戲窗體類模塊背景音樂鼠標右鍵鼠標左鍵鼠標開始窗體加載鼠標雙擊函數(shù)遞歸函數(shù)重新開始函數(shù)畫圖函數(shù)音樂函數(shù) 3.掃雷游戲的具體實現(xiàn)過程3.1 掃雷游戲模塊的實現(xiàn)掃雷游戲的開發(fā)主要包括兩大部分:一個部分是布雷,該部分主要將雷隨機布置在游戲區(qū)域內(nèi),以避免出現(xiàn)相同的雷區(qū)布置地圖。另一部分是掃雷,該部分包括判斷鼠標左鍵點擊某區(qū)域該區(qū)域是否是雷,如果是雷該如何操作,如果不是雷該如何操作,鼠標右鍵點擊某區(qū)域時如果判斷該區(qū)域是雷則加以標記,如果不是雷也加以標記,以及當鼠標雙擊某區(qū)域時,判斷與該區(qū)域相鄰的其它8個區(qū)域是否是雷并做一個標記。下面首先介紹第一部分之一掃雷主窗體創(chuàng)建。

24、3.1.1 掃雷游戲主窗體的創(chuàng)建啟動visual c+ 6.0后,選擇新建工程,visual c+ 6.0提供了用戶可能需要的各種類型的應用程序模板。如果是這種情況,選擇mfc appwizard(exe)項目,輸入工程名稱和位置,將創(chuàng)建一個新的工程如下:選擇基于dialog based:其它的默認,建立新的工程。下面介紹一下如何創(chuàng)建窗體界面:首先,轉(zhuǎn)換窗口到資源編程窗口,修改主對話框的caption屬性為“周龍掃雷游戲程序設計”,添加2個static控件,1個caption改為“剩余雷數(shù)”,1個caption改為空用來表示剩余的雷數(shù)。其設計如下:當然,這只是設計的初始的界面,我們還需要在程序

25、中添加其它代碼以初始化和美化運行的主界面。添加如下代碼:void onpaint()cdc memdc;cbitmap bk;bk.loadbitmap(idb_back);memdc.createcompatibledc(pdc); pdc-bitblt(0,0,600,600,&memdc,0,0,srccopy);主要是美化運行界面,如下:接下來要繪制鼠標操作區(qū)域,即游戲區(qū)域。添加繪制棋盤函數(shù)drawchessboard()如下:void cshaoleidlg:drawchessboard() cdc* pdc = getdc();cpen pen(ps_solid,1,rgb(0,0

26、,0);pdc-selectobject(&pen);for (int i = 0; imoveto(x+cx*(i),y);pdc-lineto(x+cx*(i),y+row*cy);for (int j = 0; jmoveto(x,y+(j)*cy);pdc-lineto(x+col*cx,y+(j)*cy);然后的運行結(jié)果如下:3.1.2 主界面控制菜單的設計接下來回到資源編程界面,編寫菜單資源,用來控制掃雷的過程,以及難度選定,和背景音樂等。(1) “設置菜單“包含:開始,初級,中級,高級,音樂開,音樂關(guān),退出 其中,音樂開 包含 默認的音樂和打開本地音樂兩個子菜單項。(2)“幫助“

27、菜單獲取該軟件的版本信息。如下:將菜單添加到主界面,至此主窗體基本創(chuàng)建完畢。3.2掃雷游戲核心-布雷算法設計(1) 掃雷游戲是由很多相同大小的格子組成的,一般計算機中自帶的游戲格子規(guī)格為9*9,16*15和30*16(第一個數(shù)字代表函數(shù),第二個數(shù)字代表列數(shù))。規(guī)格不同,需要埋的地雷數(shù)目就 不同,這就會涉及到隨機埋雷算法,最簡單的是一下兩種函數(shù)的結(jié)合:void srand(unsigned int seed);/seed為隨機種子一般這樣使用該函數(shù):srand(unsigned) time(null);/即利用系統(tǒng)時間作為隨機種子,因為系統(tǒng)內(nèi)置的時鐘是在時刻變化的。然后使用如下函數(shù)產(chǎn)生隨機數(shù):i

28、nt rand(void)/可嘗試(0,rand_max)之間的隨機整數(shù),rand_max為十六進制的0x7fff可進行一些算術(shù)運算,使之產(chǎn)生所需要的任意隨機數(shù)。(2) 掃雷游戲還要求在沒有雷的地方被點擊后就會顯示一個數(shù)字表示它周圍有幾個雷,這里分析實現(xiàn)這個功能的算法。把整個游戲區(qū)看成一個二維數(shù)組minefieldij: 要知道m(xù)inefield26周圍有幾個雷,只要去檢測如下8個網(wǎng)格是否有雷即可。minefield15,minefield16,minefield17minefield25,minefield27minefield35,minefield36,minefield37將上面的8個

29、網(wǎng)格的位置關(guān)系與minefield26進行比較,不難發(fā)現(xiàn)它們之間存在一定的數(shù)學關(guān)系,抽象看來就是:minefieldij周圍雷的個數(shù)是由如下8個位置處的雷的總合決定的。minefieldi-1j-1,minefieldi-1j,minefieldi-1j+1minefieldij-1,minefieldij+1minefieldi+1j-1,minefieldi+1j,minefieldi+1j+1上面幾個位置可能超出了邊界,因此需要根據(jù)實際情況給變量i與j設置范圍。根據(jù)以上的分析,設計布雷算法的代碼,添加bulei()函數(shù)用于隨機布雷。void bulei()/隨機布雷 int k1,k2;

30、 srand( (unsigned)time( null ) ); for(int i=0;i=0)&(k2-1=0)&(m_nodelistk1-1k2-1.m_type!=nclei)/左上方m_nodelistk1-1k2-1.m_type=ncnumber; m_nodelistk1-1k2-1.m_around+=1;if(k1-1=0)&m_nodelistk1-1k2.m_type!=nclei)/上方m_nodelistk1-1k2.m_type=ncnumber; m_nodelistk1-1k2.m_around+=1; if(k1-1=0)&(k2+1=0)&m_node

31、listk1k2-1.m_type!=nclei)/左方m_nodelistk1k2-1.m_type=ncnumber; m_nodelistk1k2-1.m_around+=1;if(k2+1col)&m_nodelistk1k2+1.m_type!=nclei)/右方m_nodelistk1k2+1.m_type=ncnumber; m_nodelistk1k2+1.m_around+=1;if(k1+1=0)&m_nodelistk1+1k2-1.m_type!=nclei)/左下方m_nodelistk1+1k2-1.m_type=ncnumber; m_nodelistk1+1k2

32、-1.m_around+=1; if(k1+1row)&m_nodelistk1+1k2.m_type!=nclei)/下方m_nodelistk1+1k2.m_type=ncnumber; m_nodelistk1+1k2.m_around+=1;if(k1+1row)&(k2+1col)&m_nodelistk1+1k2+1.m_type!=nclei)/右下方m_nodelistk1+1k2+1.m_type=ncnumber; m_nodelistk1+1k2+1.m_around+=1; 當然,還得添加繪圖代碼用來在游戲區(qū)域顯示隨機布置的雷和周邊情況,在onpaint函數(shù)中添加如下代

33、碼:void onpaint()for(int i=0;irow;i+)for(int j=0;jbitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memdc,0,0,srccopy);else if(m_nodelistij.m_around=1)memdc.selectobject(&bmp_1); pdc-bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memdc,0,0,srccopy);else if(m

34、_nodelistij.m_around=2) memdc.selectobject(&bmp_2); pdc-bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memdc,0,0,srccopy);else if(m_nodelistij.m_around=3) memdc.selectobject(&bmp_3); pdc-bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memdc,0,0,srccopy);e

35、lse if(m_nodelistij.m_around=4) memdc.selectobject(&bmp_4); pdc-bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memdc,0,0,srccopy);else if(m_nodelistij.m_around=5) memdc.selectobject(&bmp_5); pdc-bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memdc,0,0,sr

36、ccopy);else if(m_nodelistij.m_around=6) memdc.selectobject(&bmp_6); pdc-bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memdc,0,0,srccopy);else if(m_nodelistij.m_around=7) memdc.selectobject(&bmp_7); pdc-bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memd

37、c,0,0,srccopy);else if(m_nodelistij.m_around=8) memdc.selectobject(&bmp_8); pdc-bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memdc,0,0,srccopy);隨機布雷效果比較如下:第一次運行:第二次運行:如上看來,隨機布雷成功。3.3 掃雷鼠標事件的處理(1) 首先,設計雷區(qū)和非雷區(qū)的判斷算法。掃雷時需要判斷每個格子的狀態(tài),可事先為格子設定一些狀態(tài),使之對應不同的bool值或整數(shù)值。在二維、三維游戲里,有一種簡單的構(gòu)

38、造地圖的方法,即將地圖劃分為m*n的規(guī)格格子,使每一個格子對應二維數(shù)組中的一項,當鼠標單擊時,通過找出鼠標點擊區(qū)域,找到相應的格子,判斷格子狀態(tài)來替換相應的位圖。 具體算法思想如下: a. 在應用程序的客戶區(qū)劃分一塊區(qū)域,將該區(qū)域劃分為n*m相同大小的格子;b. 將每一個格子的狀態(tài)對應到二維數(shù)組的相應項上;c. 當鼠標點擊某一塊區(qū)域時,首先判斷是否在各種區(qū)域,然后再通過鼠標的坐標找到相應的格子;d. 查詢格子的狀態(tài),從而調(diào)用相應的位圖進行位圖替換;說明:windows的消息響應機制對于編寫一些小游戲是非常方便的,當編寫大型2d或3d游戲時,windows api 就顯得有些不足,此時應使用di

39、rectx或opengl等大型圖形庫來進行設計及編碼。(2) 鼠標左鍵事件的處理。分兩種情況:a. 當相應區(qū)域不是雷區(qū)時,挖開區(qū)域,并且若能據(jù)此判斷周圍區(qū)域也不是雷區(qū)則將周圍相應區(qū)域也挖開;b. 當區(qū)域是雷區(qū)時,則界面中所有的雷區(qū)同時“炸開“:第一步先顯示一個提示框,第二部當提示框關(guān)閉時,所有非雷區(qū)顯示出來。c. 鼠標在笑臉圖片上,單擊可以重新開始。(3) 對單擊鼠標右鍵事件處理第一次用右鍵單擊某個區(qū)域時,改區(qū)域上插上一面小紅旗,此時單擊左鍵沒有任何變化,第二次用右鍵單擊時恢復原狀。(4) 雙擊左鍵事件處理在展開的區(qū)域,并且已經(jīng)確定了周圍的雷數(shù),雙擊可以疊加展開非雷區(qū)域,以減少用戶的單擊操作。

40、基于以上的思想,在vc+ 6.0中的核心編碼如下:onlbuttonup(uint nflags, cpoint point) / todo: add your message handler code here and/or call defaultint num;onlei(point);onnumber(point);onblank(point);num=0;for(int a=0;arow;a+) for(int b=0;b=row*col) m_face=2; invalidate(); messagebox(你真聰明!,掃雷,mb_iconwarning|mb_okcancel);

41、 cdialog:onlbuttonup(nflags, point);其中的onlei(),onnumber(),onblank()函數(shù)分別如下:void cshaoleidlg:onlei(cpoint point)for (int i = 0 ;irow;i+)for (int j = 0; jcol;j+)tmp = m_nodelistij.m_point;crect rect(tmp.x-10,tmp.y-10,tmp.x+10,tmp.y+10);if (rect.ptinrect(point) if(m_nodelistij.m_isused=true&m_nodelistij

42、.m_issign=false)if(m_nodelistij.m_type=nclei)for (int m = 0 ;mrow;m+) for (int n= 0; ncol;n+)if(m_nodelistmn.m_type=nclei)m_nodelistmn.m_isused=false; m_nodelistmn.m_issign=false;else if(m_nodelistmn.m_isused=true) m_nodelistmn.m_issign=true; if(m_nodelistmn.m_isused=false&m_nodelistmn.m_issign=true) m_nodelistmn.m_isused=true;m_face=1;invalidate();baozha();messagebox(你還差了點,不服重來!,掃雷,mb_iconwarning|mb_okcancel); void cshaoleidlg:onnumber(cpoint point) cpoint tmp; for (int i = 0 ;irow;i+)for (int j = 0; jcol;j+)tmp = m_nodelistij.m_point;crect rect(tmp.x-10,t

溫馨提示

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

評論

0/150

提交評論