掃雷——游戲課程--設(shè)計_第1頁
掃雷——游戲課程--設(shè)計_第2頁
掃雷——游戲課程--設(shè)計_第3頁
掃雷——游戲課程--設(shè)計_第4頁
掃雷——游戲課程--設(shè)計_第5頁
已閱讀5頁,還剩38頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、課程設(shè)計任務(wù)書學生姓名: 專業(yè)班級:指導(dǎo)教師: 工作單位:題目:初始條件:要求完成的主要任務(wù):(包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求)時間安排:指導(dǎo)教師簽名:系主任(或責任教師)簽名:經(jīng)典掃雷游戲程序設(shè)計目錄摘要31、引言41課題背景及意義41.2 visual c+ 發(fā)展概況51.3關(guān)于本課題62、游戲的總體分析與設(shè)計72游戲功能簡介72.2設(shè)計構(gòu)想72.3流程規(guī)劃83、掃雷游戲的具體實現(xiàn)過程93掃雷游戲模塊的實現(xiàn)93掃雷游戲主窗體的創(chuàng)建93.2主界而控制菜單的設(shè)計133.2掃雷游戲核心布雷算法設(shè)計133.3掃雷鼠標事件的處理203.4掃雷其它處理273.4.1難度設(shè)置菜

2、單消息處理273.4.2背景音樂菜單消息處理283.4.3其它處理294、掃雷游戲程序的調(diào)試與運行295、掃雷游戲設(shè)計總結(jié)316、致謝317、參考文獻32abstractgame industry develops by leaps and bounds,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

3、 virtual world, achieve the dream that may never achieve in real life, and satisfy the psychological and spiritual needs consumer.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 bec

4、ome much larger and more complexed however, this lovely game in any version of the windows operating system has keep the original 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 ac

5、hieve 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+ 6.0 to designed and made the sweep mine game,it,s function is similar to the game that the windows operating system has. first we introduced the whole idea of making the game a

6、nd the process planning of the game design,then introduced the method of the layout of minefields and mines randomly generated. 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 impo

7、rtant thing, the mouse events is to use the message that the mouse give to understand the the user's intent, then make the corresponding 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

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

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

10、景及意義當前隨著計算機的深入普及,越來越多的人自了個人電腦,人們運用計算機完成許多 重要的工作,計算機在人們的生活中變的越來越來重要。隨著計算機的應(yīng)用和發(fā)展計算機 已經(jīng)不單純是一個工作工具,人們越來越重視計算機的娛樂性了,近年來游戲產(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ā)小組負責研

11、發(fā)游戲,也有如微 軟、美商藝屯這類國際級犬廠負責游戲發(fā)行,其至連“游戲制作人”也被培養(yǎng)成明星一樣成為一種招牌,如任天堂有王牌制作人宮本茂、sega有鈴木裕.konami有小島秀夫、capcom有三上真司、tecmo有板垣伴信.等,明確的游戲產(chǎn)業(yè)分工的確有助丁游戲產(chǎn)業(yè)的規(guī)模發(fā) 展與進化,但也無形屮讓游戲開發(fā)成本大增。為了降低游戲開發(fā)成本,開發(fā)娛樂性強成本 低的游戲就成為當前的主要課題,在這種趨勢下各種小型的低成木的游戲軟件應(yīng)運而生。 在這其中,系統(tǒng)自帶的小游戲也占據(jù)了相當重要的地位,與那些網(wǎng)絡(luò)游戲和3d游戲相比, 它有編寫簡單容易上手等特點,非常適合人們在完成工作的時候適當?shù)膴蕵芬蟆_@些小 游

12、戲大都是以益智和娛樂為目的,不僅給緊張工作的人們以放松,還可以讓人們的大腦得 到開發(fā)。這些小游戲包括掃雷,彈球,紙牌等等。而本課題就是掃雷游戲的設(shè)計。1.2 visual c+發(fā)展概況visual c+是一個功能強大的可視化軟件開發(fā)工具。口 1993年microsoft公司推 ii; visual c+1.0后,隨著其新版木的不斷問visual c+已成為專業(yè)程序員進行 軟件開發(fā)的首選工具。雖然微軟公司推出了 visual c+.net(visual c+7.0),但它的應(yīng)用的很大的局限 性,只適用于windows 2000,windows xp和windows nt4.0。所以實際中,更多的

13、 是以visual c+6.0為平臺。visual c+6.0不僅是一個c+編譯器,而且是一個基于windows操作系統(tǒng)的可 視化集成開發(fā)環(huán)境(integrated development environment,ide)。visual c+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%都是在它 上面完成的,再加上

14、它的標題赫然寫著"microsoft visual c+",所以很多人理所當然 的認為,那就是visual c+ x o其實不然,雖然developer studio提供了一個很好的 編輯器和很多wizard,但實際上它沒有任何編譯和鏈接程序的功能,真止完成這些 工作的幕后英雄后面會介紹。我們也知道,developer studio并不是專門用于vc的, 它也同樣用于vb, vj, vid等visual studio家族的其他同胞兄弟。所以不要把 developer studio當成visual c+,它充其量只是visual c+的一個殼了而已。這一點請切記!2 mfc,

15、從理論上來講,mfc也不是專用于visual c+, borland c+, c+builder和symantec c+同樣可以處理mfc。同時,用visual c+編寫代碼也并 不意味著一定要用mfc,只要愿意,用visual c+來編寫sdk程序,或者使用stl, atl, 一樣沒有限制。不過,visualc+本來就是為mfc打造的,visual c+屮的許 多特征和語言擴展也是為mfc而設(shè)計的,所以用visual c+而不用mfc就等于拋 棄了 visual c+屮很大的一部分功能。但是,visual c+也不等于mfc。3. platform sdko這才是visual c+和整個vi

16、sual studio的精華和靈魂,雖然 我們很少能直接接觸到它。大致說來,platform sdk是以microsoft c/c+編譯器為 核心(不是visual c+,看清楚了),配合masm,輔以其他一些工具和文檔資料。 上面說到developer studio沒有編譯程序的功能,那么這項工作是由誰來完成的呢? 是cl,是nmake,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成 visual studio的基石。visual c+之所以具有如此廣泛的用途是因為它具有以下的特點:(1) 真正的面向?qū)ο缶幊?,使開發(fā)人員不用加入太多的代碼,加快了系統(tǒng)開發(fā)的速度。(2) 可視化的編程方

17、法以及向?qū)У墓δ?,使開發(fā)人員不用加入太多的代碼就可以開發(fā) 出標準的windows程序。(3) 數(shù)據(jù)訪問的特性,允許對包括microsoft sql server和其他企業(yè)數(shù)據(jù)庫在內(nèi)的大部 分數(shù)據(jù)庫格式建立數(shù)據(jù)庫和前端應(yīng)用程序,以及可調(diào)整的服務(wù)器端部件等。(4) 通過activex技術(shù)可使用其他應(yīng)用程序提供的功能,例如microsoft word字處理器、 microsoft excel電子數(shù)據(jù)表及jt他windows應(yīng)用程序,甚至可直接使用visual basic創(chuàng)建 的應(yīng)用程序和對象。(5) internet功能強大,使用戶很容易在應(yīng)用程序內(nèi)通過internet或企業(yè)內(nèi)部網(wǎng)(intranet

18、) 訪問文檔和應(yīng)用程序,或者創(chuàng)建internet服務(wù)器應(yīng)用程序。(6) 已完成的應(yīng)用程序是真正的.exe文件,您可以自由發(fā)布。1.3關(guān)于本課題隨著世界經(jīng)濟的長足發(fā)展和計算機技術(shù)的h益成熟,計算機被應(yīng)用到人類活動的各個 領(lǐng)域,齊種應(yīng)用軟件也相繼問世,這其小有相當一部分是游戲軟件。使用游戲軟件自然是 為了滿足人們對娛樂性的要求,而有些軟件大都采用3d設(shè)計對系統(tǒng)配置的要求較高。在眾多游戲軟件中,也不乏一些小游戲的身影,它們對系統(tǒng)的配置要求較低。能夠滿 足人們對娛樂性的需求,是人們在完成工作娛樂時候的最好選擇。現(xiàn)在越來越多的人投入 到這種小游戲的開發(fā)當中,它已經(jīng)成為一類必不可少的游戲軟件。在各種操作系

19、統(tǒng)屮都附 帶了一些小的游戲,而這些游戲也成為電腦用戶軟件中不可或缺的一部分。作為本系統(tǒng)的開發(fā)工具,microsoft visual c+ 60成為首選。它具有可視化的編程 界面、詳細的提示、以及完善的幫助文檔,使得軟件開發(fā)人員感到無比的親切感。2游戲的總體分析與設(shè)計2. 1游戲功能簡介當而各種游戲軟件層出不窮。因為游戲的開發(fā)成本非常大,所以游戲的開發(fā)具有一定 的風險性,但是一些小游戲的開發(fā)貝有成本小,編寫簡單的優(yōu)勢,所以這些小游戲在游戲 開發(fā)中也占有一席z地。在這類小游戲中包括益智類游戲,它以畫面精美游戲方法簡單等 特點得到大家的認可。成為人們在工作z余不可或缺的好伙伴。針對真種情況我用vb編

20、 寫了掃雷這款小游戲。卜面對該游戲的功能做個簡單的介紹。掃雷游戲的基木功能:點擊鼠標左鍵于未知區(qū)域,如果未知區(qū)域有雷,游戲停止,顯 示所有的地雷。如果沒雷,則顯示周圍雷數(shù),如杲周圍沒雷,則再杳看周圍八個區(qū)域是否有 雷直到有雷為止并顯示,這其實是一個遞歸過程。點擊鼠標右鍵于未知區(qū)域,則將其置為有雷而不管是否真的有雷??蛇x擇初、中、高 三級并可門定義雷數(shù)和區(qū)域大小。雷區(qū)上部左側(cè)顯示總雷數(shù)減被標明有雷區(qū)域的數(shù)no雷區(qū)上部中間位置顯示一按鈕用于開局和顯示鼠標動作的結(jié)杲。雷區(qū)上部右側(cè)顯示掃雷的時間。將雷全部掃清后,則顯示一對話框?qū)⒛愕男彰浫肱判邪瘛?. 2設(shè)計構(gòu)想相信大多數(shù)使用windows操作系統(tǒng)的

21、使用者,對這款游戲都不陌生。這款游戲不止操 作簡單,規(guī)則也不難,再加上游戲速度的控制機制得宜,讓整個游戲在操作過程中充滿了快樂與緊張的氣氛。除了游樂當中能帶給使用者快樂之外,游戲的設(shè)計內(nèi)容無形屮也不斷 訓(xùn)練使用者的邏輯思考能力,對于依靠高度腦力工作的現(xiàn)代人,都可以通過這個游戲,不 時的檢驗一下自己,所以我們不難發(fā)現(xiàn),在各種可攜帶的電子產(chǎn)品上都有這款游戲的蹤影。 在設(shè)計之前,我們先來了解這款游戲的規(guī)則。在不掀開任何藏有地雷的方塊情況下,以最快的速度找出所有的地雷。如果在掀開方 塊的過程中,不小心翻開(踩到)藏有地雷的方塊,則宣告失?。ㄓ螒蚪Y(jié)束),惟有將所 有不含地雷的方塊掀開,游戲才算成功。游戲

22、的操作方面主要以鼠標為主,當鼠標指針對準未翻開的方塊按下左鍵時即表示翻 開方塊,當鼠標指針對準未翻開的方塊按下右鍵時即表示標示或疑示地雷,反復(fù)按下右鍵 則方塊會以未標示f標示f疑似三者關(guān)系不斷循壞。游戲者可以通過地雷區(qū)內(nèi)的數(shù)字提示 了解以數(shù)字為中心的其周邊八個方格內(nèi)所含的地雷數(shù),假若翻開的方塊顯示數(shù)字“3”, 則表示以其為中心的周邊方塊內(nèi)藏有3個地雷。當按下的方塊不是地雷,口周邊八個方塊也都沒有地雷時,方塊會以被翻開方塊的八個方 向?qū)⒖湛诜綁K翻開。2. 3流程規(guī)劃流程規(guī)劃大致上可以分為三個部分,分別為:畫面初始、游戲者按下第一個方塊和為 非地雷方塊時展開。眩面初始時,以游戲者最后一次設(shè)定的地雷

23、區(qū)大小為范圍畫出地雷區(qū),但此吋并未產(chǎn) 生地雷。當游戲者按下第一個方塊時產(chǎn)生地雷資料并啟動定時器,為何在游戲者按下第一 個方塊才產(chǎn)生地雷資料呢?其主要的用意在于不要讓游戲者第一次就踩到地雷,這樣在某 種程度上可以提高游戲者游玩的氣氛。接著就是如何判斷按下的方塊是非地雷時的處理, 這也是整個游戲的技術(shù)核心,我們可以通過遞歸的觀念來檢查周邊的方塊是否含有地雷及 是否繼續(xù)往外翻開?;谝陨纤悸?,繪制功能圖如下:3.掃雷游戲的具體實現(xiàn)過程3.1掃雷游戲模塊的實現(xiàn)掃雷游戲的開發(fā)主要包括兩大部分:一個部分是布雷,該部分主要將雷隨機布置在游 戲區(qū)域內(nèi),以避免出現(xiàn)相同的雷區(qū)布置地圖。另一部分是掃雷,該部分包括判

24、斷鼠標左鍵 點擊某區(qū)域該區(qū)域是否是雷,如果是雷該如何操作,如果不是雷該如何操作,鼠標右鍵點 擊某區(qū)域時如果判斷該區(qū)域是雷則加以標記,如果不是雷也加以標記,以及當鼠標雙擊某 區(qū)域時,判斷與該區(qū)域相鄰的其它8個區(qū)域是否是雷并做一個標記。下面首先介紹第一部 分之一 掃雷主窗體創(chuàng)建。3. 1. 1掃雷游戲主窗體的創(chuàng)建啟動visual c+ 6.0后,選擇新建工程,visual c+ 6. 0提供了用戶可能需要的各 種類型的應(yīng)用程序模板。如果是這種情況,選擇mfc appwizard (exe)項目,輸入工程名稱 和位置,將創(chuàng)建一個新的工程如下:選擇基于dialog based:single docum

25、entmultiple documents dialog based?p document/view architecture supwhat type of application would you like to create?what language would you like your resources in?< 旦acknext >finishcancel中文中國(appwzchs.dll)其它的默認,建立新的工程。卜'而介紹一卜'如何創(chuàng)建窗體界而:首先,轉(zhuǎn)換窗口到資源編程窗口,修改主對話框的caption屈性為“周龍掃雷游戲程 序設(shè)計”,添加2個

26、static控件,1個caption改為"剩余雷數(shù)”,1個caption改為空用來 表示剩余的雷數(shù)。其設(shè)計如下:當然,這只是設(shè)計的初始的界面,我們還需要在程序屮添加其它代碼以初始化和美化 運行的主界面。添加如下代碼:void onpaint ()cdc memdc;cbitmap bk;bk.loadbitmap(idb_back); memdc.createcompatibledc(pdc);pdc->bitblt(0,0,600,600,&m emdc,0,0,srccopy);主要是美化運行界面,如下:接下來要繪制鼠標操作區(qū)域,即游戲區(qū)域。添加繪制棋盤函數(shù)draw

27、chessboard()如下:void cshaoleidlg:drawchessboard()cdc* pdc = getdc();cpen pen(ps_solid,l ,rgb(0,0,0);pdc->selectobject(&pen);for (int i = 0; ivrow+1; i+)pdc->moveto(x+cx* ,y);pdc->lineto(x+cx*(i),y+row*cy);for (int j = 0; j<col+1; j+)pdc->moveto(x,y+(j)*cy);pdc->lineto(x+col*cx,y

28、+(j)*cy);然后的運行結(jié)果如廠3.1.2主界面控制菜單的設(shè)計接下來回到資源編程界面,編寫菜單資源,用來控制掃雷的過程,以及難度選定,和 背景音樂等。(1) “設(shè)置菜單“包含:開始,初級,中級,高級,音樂開,音樂關(guān),退岀其中,音樂開包含默認的音樂和打開本地音樂兩個子菜單項。(2) “幫助“菜單獲取該軟件的版本信息。如下:設(shè)置幫助幫始級級級樂樂uj置開初中高音音2設(shè)幫助:f1f2f3將菜單添加到主界而,至此主窗體基本創(chuàng)建完畢。3. 2掃雷游戲核心布雷算法設(shè)計(1)掃雷游戲是由很多相同大小的格子組成的,一般計算機屮自帶的游戲格子規(guī)格為9*9, 16*15和30*16 (第一個數(shù)字代表函數(shù),第二

29、個數(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ù):int rand (void) 可嘗試(0, rand.max) z間的隨機整數(shù),rand.max為十六 進制的0x7fff可進行一些算術(shù)運算,使z產(chǎn)生所需要的任意隨機數(shù)。(2)掃雷游戲還要求在沒有雷的地方被點擊后就會顯示一個數(shù)字表示它周圍有

30、 兒個雷,這里分析實現(xiàn)這個功能的算法。把整個游戲區(qū)看成一個二維數(shù)組 minefieldij:111213141516171819212223242526272829313233343536373839414243444546474849515253545556575859 要知道m(xù)inefield2周圍有幾個雷,只要去檢測如下8個網(wǎng)格是否有雷即可。minefield 1 5,minefield l6,minefield 17 minefield25,minefield27minefield 35,minefield36,minefield37將上面的8個網(wǎng)格的位置關(guān)系與minefield進行比

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

32、d( (unsigned)time( null);for(int i=0;i<m_num;i+)kl=rand()%row;k2=rand()%col;if(m_nodelistklk2.m_type!=nclei)m_nodelistk 1 k2 .m_type=nclei;elsei-;continue;if(k 1 -l>=0)&&(k2-l>=0)&&(m_nodelistk 1-1 k2-1 .m_type!二nclei)/左上方 m_nodelistk 1 -1 k2-1 .m_type=ncnumber;m_nodelistk 1

33、-ik2-1 .m_around+= 1;if(k 1 -l>=0)&&m_nodelis(k 1-1 k2.m_type!=nclei) 上方m_nodelistk 1 -1 k2 ,m_type=ncnumber;m_nodelistk 1 -1 k2.m_around+= 1;if(k 1 -l>=0)&&(k2+1 <col)&&m_nodelistk 1-ik2+1 .m_type!二nclei)/右上方mlnodelis 二 k 匸=k2+ 二mltyp8ncnumber- mlnodelis 二 k l'=

34、k2+ 二mlaround+h 1 八 if(k2 一 vho)<&<&mlnodelis二 k 1 =k2 二mltype fncledvmd mnodelis 二 k 1=$ 二.mltypeuncnumber; mlnodelis 二 k 1 =k2 二.mlaround+h 1; if(k2+1 acod<&<&mlnodelis 二 k 1 =k2+ 二.mltypellncledva h mlnodelis 二 k 1 =k2+ 二.mltypchncnumber- mlnodelis 二 k 1 =k2+ 二mlaround

35、+h 1 八 ifsk - i arow)知円(k2 一 vho)&<&mlnodelis 二 k 1 +1 =k2 二mltypellnclei)1mf £mlnodelis 二 k 1 +1 =k2 二mltyp8ncnumber- mlnodelis 二 k 1 +1 =k2 二mlaround+h 1 八 if(k 一 + 一 arow)<&<&mlnodelis 二 k 】+1 =k2.mltypellncleiwt 曲 mlnodelis 二 k 1 + 一 =k2.mltypchncnumber- mlnodelis 二

36、 k 1 + 】=k2mlaround+h 1 八 if(k 1 +1 aow)<&<&(k2+1 ac01)&:&mln0delis 二 k 1+1 =k2+ 二.mltypellnclei)、于.bmlnodelis 二 k 1 + 】=k2+ 二.mltypehncnumber- mlnodelis二 k 1+1 =k2+1maround+= 1;當然,還得添加繪圖代碼用來在游戲區(qū)域顯示隨機布置的雷和周邊情況,在onpaint函數(shù)屮添加如下代碼:void onpaint()for(int i=0;i<row;i+)for(int j=0;

37、j<col;j+)if(m_nodelistij.m_type=nclei)memdc.selectobject(&bmp 1); pdc->bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&m emdc,0,0,srccopy);elseif(m_nodelisti j .m_around= 1)memdc.selectobject(&b mp_l); pdc->bitblt(m_nodelisti(j.m_point.x-cx/2,m_nodelisti|j.

38、m_point.y-cy/2,20,20,&memdc,0,0,srccopy);else if(m_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_nodelisti

39、j.m_point.x-cx/2,m_nodelistij. m_point.y-cy/2,20,20,&memdc,0,0,srccopy);else 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

40、_5);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=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

41、=7)memdc.selectobject(&b mp_7);pdc->bitblt(m_nodelistij.m_point.x-cx/2,m_nodelisti|j.m_point.y-cy/2,20,20, &m emdc,0,0,srccopy);else if(m_nodelistij.m_around=8)memdc.selectobject(&b mp_8);pdc->bitblt(m_nodelistij.m_point.x-cx/2,m_nodelistij.m_point.y-cy/2,20,20,&memdc,0,0,srcco

42、py);隨機布雷效果比較如下:第一次運行:-一1221111112*2審 1 1;廠 m*2ll:l n*n1.2112.*.丄,t 4*5*12.22.1*21_l_ 22113 企 2 廠12 211112*2 11335321112322111 112*2>11*“ *2>1i 23*32211321233332111111111t4 03»1- lxx - - l»sl 334.2.2it 1233321 - 111-1234*4*31 .1.1111,..2.1.21. 111審*2*11*11112321廠j10-1jl1

43、1*2112*1匸蔓 2l2a:ll2: 11,1:1*32 llllz* 1.第二次運行:如上看來,隨機彳j雷成功。3. 3掃雷鼠標事件的處理(1) 首先,設(shè)計雷區(qū)和非雷區(qū)的判斷算法。掃雷時需要判斷每個格子的狀態(tài),可事先 為格子設(shè)定一些狀態(tài),使之對應(yīng)不同的bool值或整數(shù)值。在二維、三維游戲里,有一種 簡單的構(gòu)造地圖的方法,即將地圖劃分為的規(guī)格格子,使每一個格子對應(yīng)二維數(shù)組中 的一項,當鼠標單擊時,通過找出鼠標點擊區(qū)域,找到相應(yīng)的格子,判斷格子狀態(tài)來替換 相應(yīng)的位圖。具體算法思想如下:a. 在應(yīng)用程序的客戶區(qū)劃分一塊區(qū)域,將該區(qū)域劃分為相同大小的格子;b. 將每一個格子的狀態(tài)對應(yīng)到二維數(shù)組的

44、相應(yīng)項上;c. 當鼠標點擊某一塊區(qū)域時,首先判斷是否在各種區(qū)域,然后再通過鼠標的坐標找到相 應(yīng)的格子;d. 查詢格子的狀態(tài),從而調(diào)用相應(yīng)的位圖進行位圖替換;說明:windows的消息響應(yīng)機制對于編寫一些小游戲是非常方便的,當編寫大型2d 或3d游戲時,windows api就顯得有些不足,此時應(yīng)使用directx或opengl等大型圖 形庫來進行設(shè)計及編碼。(2) 鼠標左鍵事件的處理。分兩種情況:a. 當相應(yīng)區(qū)域不是雷區(qū)時,挖開區(qū)域,并且若能據(jù)此判斷周圍區(qū)域也不是雷區(qū)則將周圍 相應(yīng)區(qū)域也挖開;b. 當區(qū)域是雷區(qū)時,則界面中所有的雷區(qū)同時“炸開j第一步先顯示一個提示框,第 二部當提示框關(guān)閉時,所

45、有非雷區(qū)顯示出來。c. 鼠標在笑臉圖片上,單擊可以重新開始。(3) 對單擊鼠標右鍵事件處理第一次用右鍵單擊某個區(qū)域時,改區(qū)域上插上一面小紅旗,此時單擊左鍵沒有任何變 化,第二次用右鍵單擊時恢復(fù)原狀。(4) 雙擊左鍵事件處理在展開的區(qū)域,并且已經(jīng)確定了周圍的雷數(shù),雙擊叮以疊加展開非雷區(qū)域,以減少用 戶的單擊操作?;谝陨系乃枷耄趘c+ 6.0中的核心編碼如下:onlbuttonup(uint nflags, cpoint point)/ todo: add your message handler code here and/or call defaultint num;onlei(point

46、);onnumber(point);onblank(point);num=0;for(int a=0;a<row;a+)for(int b=0;bvcol;b+)if(m_nodelistab.msused=false)num+;if(m_shengyu=0&&num >=row*col)m_face=2;invalidate();messagebox(”你真聰明! !丁掃雷”,mbconwarningimb_okcancel);cdialog:onlbuttonup(nflags, point);其屮的 onlei(), onnumber(), onblank()

47、函數(shù)分別如下:void cshaoleidlg:onlei(cpoint point)for (int i = 0 ;i<row;i+)for (int j = 0; j<col;j+)tmp = m_nodelistij.m_point;crect rect(tmp.x-1 otmp.y-10,tmp.x+ 10,tmp.y+10);訐(rect.ptlnrect(point)if(m_nodelistij.m_isused=true&&m_nodelistij. m_i ssign=false) if(m_nodelistij.m_type=nclei)for

48、(int m = 0 ;m<row;m+)for (int n= 0; n<col;n+) if(m_nodelistmn.m_type=nclei)m_nodelistmn.m_isused=false; m_nodelistm n .m _issign=false;elseif(m_nodelistmn.m_isused=true) m_nodelistmn.m_issign=true;if(m_nodelistmn.m_isused=false&& m_nodelistmn.m_issign=true) m_nodelistm n .msused=true;m

49、_face= 1; invalidate(); baozha();messagebox(h你還差了點,不服重來!丁掃雷”,mbconwarningimb_okcancel);void cshaoleidlg:onnumber(cpoint point)cpoint tmp;for (int i = 0 ;i<row;i+)for (int j = 0; j<col;j+)tmp = m_n odeli s t i j . m_poi n t;crect rect(tmp.x-1 otmp.y- 10,tmp.x+ 10,tmp.y+10);訐(rect.ptlnrect(point

50、)if(m_nodelistij.m_isused=true&& m_nodelistij.m _issign=false)if(m_nodelistij.m_type=ncnumber)m_nodelistij.m_isused=false; m_nodelistij.m_issign=false;invalidateq;void cshaoleidlg:onblank(cpoint point)cpoint tmp;for (int i = 0 ;i<row;i+)for (int j = 0; j<col;j+)tmp = m_n odeli st i j .

51、 m_poi n t;crect rect(tmp.x-10.tmp.y-10,tmp.x+ 10?tmp.y+10);if (rect.ptlnrect(point)if(m_nodelistij.m_isused=true&&m_nodelistij.m _issign=false)if(m_nodelistij.m_type=ncblank)m_nodelistij.msused二false; if(i-l>=0)&&(jl>=0)m_nodelisti-lj-l.msused二false; if(m_nodelisti-lj-l .m_typ

52、e=ncblank) if(i-1 -l>=0)&&(jl 1 >=0)&& m_nodelisti-1 -1 j -1 -1 .m_type !=nclei) m_nodelisti-l-lj-l -l.m_isused=false;if(j-l -l>=0)&&m _nodelisti-lj-m .m_type!=nclei) m_nodelisti-1 j-1 -1 .m_isused=fals e if(i-l-l>=0)&&m_nodelisti-l-lj-l .m_type!=nclei)if(

53、i-l -l>=0)&&m_nodelisti-l 1 j .m_type!二nclei)m_nodelisti-l -lj.m_isused=false;if(i-l>=0)m_nodelisti-lj.msused二false;if(i-l>=0)&&(j+lvcol)m_nodelisti-1 j+1 .m_isused=false;if(m_nodelisti-1 j+1 .m_type=ncblank)if(i-1 -l>=0)&&m.nodelist i-1 -1 j+1 .m_type !=nclei) m_

54、nodelisti-1 -1 1 .m_isused=false;if(i-1 -1 >=0)&&(j+1 +1 <col)&&m_nodelist i-1 -1 j+1+1 .m_type !=nclei) m_nodelist i-1 -1 j+1 +1 .m_isused=false;if(j+1 +1 <col)&&m_nodelisti 1 j+1 +1 .m_type!二nclei) m_nodelisti-1 j+1 +1 ,m_isused=false;if(j+1+1 <col)&&m_n

55、odelistij+l + l.m_type!=nclei)m_nodelistij+l + l.msused二false;if(j+l<col)m_nodelistij+l.m_isused=false;if(i+1 <row)&&(j-l>=0)m_nodelisti+ lj-l.m_isused=false;if(i+1 +1 <row)&&m_nodelisti+ lj-l .m_type!=nclei)m_nodelisti+ lj-l.m_isused=false;if(i+1 +1 <row)&&(j 1 -1 >=0)&&m_nodelisti+ l + lj-l-l.m_type!=nclei) m_nodelisti+ l + lj-l-l .m_isused=false;if(j-1 -l>=0)&&m_nodelisti+ lj-l-l.m_type!=nclei)m_nodelisti+1 j-1 -1 .m_isused=false;if(

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論