C++設(shè)計掃雷游戲報告_第1頁
C++設(shè)計掃雷游戲報告_第2頁
C++設(shè)計掃雷游戲報告_第3頁
C++設(shè)計掃雷游戲報告_第4頁
C++設(shè)計掃雷游戲報告_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGE.PAGE.....電氣信息學(xué)院實訓(xùn)報告課程名稱:軟件項目實訓(xùn)實訓(xùn)題目:掃雷游戲 年級/專業(yè)/班:*****************學(xué)生姓名:****學(xué)號:**********實訓(xùn)成績:學(xué)習(xí)態(tài)度及平時成績〔30技術(shù)水平與實際能力〔20創(chuàng)新〔5報告撰寫質(zhì)量〔45總分〔100指導(dǎo)教師簽名:年月日實訓(xùn)時間地點L4B305實訓(xùn)學(xué)時2周實訓(xùn)目的提高面向?qū)ο蟮目梢暬幊棠芰μ岣吆献鲄f(xié)調(diào)能力掌握VisualC++可視化程序界面設(shè)計的基本方法實訓(xùn)內(nèi)容掃雷游戲,是Windows操作系統(tǒng)自帶的一款經(jīng)典游戲。其規(guī)則簡單,上手容易,不論男女老少皆可娛樂。掃雷的目的就是要把所有非地雷的格子揭開即勝利。踩到地雷格子就算失敗。設(shè)計的掃雷游戲應(yīng)包含以下功能:能夠顯示主菜單和界面;能夠接收鼠標(biāo)輸入功能;能夠根據(jù)規(guī)則翻轉(zhuǎn)相應(yīng)的格子;能夠標(biāo)記指定格子的功能;游戲勝負(fù)判斷功能;英雄榜記錄更新;游戲支持背景音樂功能;游戲提供幫助說明。實訓(xùn)分工安排本程序由兩人共同完成其中**同學(xué)主要負(fù)責(zé)程序代碼編寫調(diào)試的工作;***同學(xué)主要負(fù)責(zé)游戲界面設(shè)計的工作;實訓(xùn)要求兩人合作完成同一項目分工合作后匯總進(jìn)行統(tǒng)一測試與更正使用VisualC++6.0實現(xiàn)用戶界面使用實訓(xùn)室及主要設(shè)施設(shè)備L4B305聯(lián)想商用電腦D2527聯(lián)想Y460實訓(xùn)成果1完成了此次實訓(xùn)內(nèi)容2完成了實訓(xùn)報告3提高了自己的合作能力以及編程能力..摘要游戲業(yè)發(fā)展一日千里,該行業(yè)極大的影響和改變了人們的生活和娛樂方式,游戲為消費者提供豐富多彩的虛擬空間,使消費者可以自由自在的享受虛擬世界的樂趣,實現(xiàn)自己在現(xiàn)實生活著那個可能永遠(yuǎn)不能實現(xiàn)的夢想,滿足了消費者的心理和精神需求。掃雷游戲是Windows操作系統(tǒng)自帶的一個小游戲,過去的幾年里Windows操作系統(tǒng)歷經(jīng)數(shù)次換代,變得越來越龐大、復(fù)雜,但這個可愛的小游戲在任何版本的Windows操作系統(tǒng)里去卻依然保持著原貌。但幾乎每個電腦使用者都接觸過它,并且深愛著這款小游戲。掃雷游戲是比較經(jīng)典的一款小游戲,實現(xiàn)它的方法很多,可以用很多不同算法和語言實現(xiàn),如C,C++,VB,JAVA等。本論文研究的是以VisualC++6.0為開發(fā)環(huán)境,設(shè)計并開發(fā)一款掃雷游戲,其功能類似于Windows操作系統(tǒng)自帶的掃雷游戲。論文首先介紹了制作游戲的整體思路及整個游戲設(shè)計的流程規(guī)劃,然后介紹了雷區(qū)的布置及地雷隨機(jī)產(chǎn)生的實現(xiàn)方法;重點介紹了在游戲過程中各事件的處理,其中又以鼠標(biāo)事件和清除未靠近地雷區(qū)方塊這兩方面最為最要,鼠標(biāo)事件是利用鼠標(biāo)所發(fā)出的信息了解使用者的意圖,進(jìn)而做出相對應(yīng)的動作,而清除未靠近地雷區(qū)方塊由于引進(jìn)了"遞歸"這個概念而使其簡單化。關(guān)鍵字:掃雷;VisualC++6.0;事件;遞歸IIAbstractGameindustrydevelopsbyleapsandbounds,andithasagreatimpactonthewaypeopleliveandentertainment,gamesprovideconsumerswithavarietyofvirtualspace,sothatconsumerscanenjoythefreefunofthevirtualworld,achievethedreamthatmayneverachieveinreallife,andsatisfythepsychologicalandspiritualneedsconsumer.TheSweepMineGameisasmallgamethattheWindowsoperatingsystemhave.OverthepastfewyearstheWindowsoperatingsystemhasexperiencedanumberofchang,andbecomemuchlargerandmorecomplexed.However,thislovelygameinanyversionoftheWindowsoperatingsystemhaskeeptheoriginalappearance.Almosteverycomputerusershavecomeintocontactwithit,andlovethisgame.TheSweepMineGameisanclassicallittlegame,andtherearemanywayscanachieveit,wecanusemanydifferentalgorithmsandlanguages,suchasC,C++,VB,JAVAandsoon.ThisstudyisbasedonVisualC++6.0todesignedandmadethesweepminegame,it’sfunctionissimilartothegamethattheWindowsoperatingsystemhas.Firstweintroducedthewholeideaofmakingthegameandtheprocessplanningofthegamedesign,thenintroducedthemethodofthelayoutofminefieldsandminesrandomlygenerated.Andfocusesontheprocessofdealingwiththeincidentinthegame,amongthem,themouseeventsandclearanceofunexplodedlandminesaroundtheboxarethetwomostimportantthing,themouseeventsistousethemessagethatthemousegivetounderstandthetheuser'sintent,thenmakethecorrespondingaction,andclearanceofunexplodedlandminesaroundtheboxhasbecamesimplywiththeintroductionofthe"recursive".Keywords:SweepMine,;VisualC++6.0;Affairs,;RecursionⅡⅡ..目錄摘要········································································IAbstract····································································ⅡTOC\o"1-2"\h\u292121引言169521.1系統(tǒng)概述1247831.2需求分析1227561.3運行環(huán)境1131072概要設(shè)計2172972.1設(shè)計思路2163312.2模塊功能介紹2249742.3模塊結(jié)構(gòu)圖375852.4程序流程圖359562.5功能設(shè)計分工4109973詳細(xì)設(shè)計439723.1游戲菜單的實現(xiàn)4242213.2游戲幫助對話框的實現(xiàn)8102233.3游戲英雄榜對話框的實現(xiàn)10249173.4游戲播放背景音樂的實現(xiàn)1524363.5新游戲處理模塊的設(shè)計與實現(xiàn)1557643.6地雷格子模塊的設(shè)計與實現(xiàn)1858373.7游戲規(guī)則模塊的設(shè)計與實現(xiàn)22144093.8游戲繪圖模塊的設(shè)計與實現(xiàn)25256643.9玩家輸入模塊的設(shè)計與實現(xiàn)2822514調(diào)試分析32217065測試32274205.1主菜單和界面顯示功能的測試演示329345.2鼠標(biāo)輸入功能的測試演示3321035.3標(biāo)示指定格子功能的測試演示33117525.4游戲勝負(fù)判斷功能的測試演示3422665.5游戲幫助功能的測試演示348548心得與體會3529520參考文獻(xiàn)37..1引言1.1系統(tǒng)概述掃雷游戲,是Windows操作系統(tǒng)自帶的一款經(jīng)典游戲。其規(guī)則簡單,上手容易,不論男女老少皆可娛樂。掃雷的目的就是要把所有非地雷的格子揭開即勝利。踩到地雷格子就算失敗。我所設(shè)計的掃雷游戲包含以下功能:能夠顯示主菜單和界面;能夠接收鼠標(biāo)輸入功能;能夠根據(jù)規(guī)則翻轉(zhuǎn)相應(yīng)的格子;能夠標(biāo)記指定格子的功能;游戲勝負(fù)判斷功能;英雄榜記錄更新;游戲支持背景音樂功能;游戲提供幫助說明。1.2需求分析隨著世界經(jīng)濟(jì)的長足發(fā)展和計算機(jī)技術(shù)的日益成熟,計算機(jī)被應(yīng)用到人類活動的各個領(lǐng)域,各種應(yīng)用軟件也相繼問世,這其中有相當(dāng)一部分是游戲軟件。使用游戲軟件自然是為了滿足人們對娛樂性的要求,而有些軟件大都采用3D設(shè)計對系統(tǒng)配置的要求較高。在眾多游戲軟件中,也不乏一些小游戲的身影,它們對系統(tǒng)的配置要求較低。能夠滿足人們對娛樂性的需求,是人們在完成工作娛樂時候的最好選擇。在各種操作系統(tǒng)中都附帶了一些小的游戲,而這些游戲也成為電腦用戶軟件中不可或缺的一部分。掃雷游戲是比較經(jīng)典的一款小游戲,過去的幾年里Windows操作系統(tǒng)歷經(jīng)數(shù)次換代,變得越來越龐大、復(fù)雜,但這個可愛的小游戲在任何版本的Windows操作系統(tǒng)里去卻依然保持著原貌。但幾乎每個電腦使用者都接觸過它,并且深愛著這款小游戲。作為本系統(tǒng)的開發(fā)工具,MicrosoftVisualC++6.0成為首選。它具有可視化的編程界面、詳細(xì)的提示、以及完善的幫助文檔,使得軟件開發(fā)人員感到無比的親切感。1.3運行環(huán)境Intel?Pentium?2及以上的處理器,32M以上內(nèi)存,20M以上硬盤空間。Microsoft?WindowsTM22000或XP以上操作系統(tǒng)。800×600或以上的屏幕分辨率。2概要設(shè)計2.1設(shè)計思路在設(shè)計之前,我們先來了解這款游戲的規(guī)則:在不打開任何藏有地雷的格子情況下,以最快的速度找出所有的地雷。如果在打開格子的過程中,不小心翻開〔踩到藏有地雷的格子,則宣告失敗〔游戲結(jié)束,惟有將所有不含地雷的格子打開,游戲才算成功。游戲的操作方面主要以鼠標(biāo)為主,當(dāng)鼠標(biāo)指針對準(zhǔn)未翻開的格子按下左鍵時即表示翻開格子,當(dāng)鼠標(biāo)指針對準(zhǔn)未翻開的方塊按下右鍵時即表示標(biāo)示或疑示地雷,反復(fù)按下右鍵則格子會以未標(biāo)示→標(biāo)示→疑似三者關(guān)系不斷循環(huán)。游戲者可以通過地雷區(qū)內(nèi)的數(shù)字提示了解以數(shù)字為中心的其周邊八個格子內(nèi)所含的地雷數(shù),假若翻開的格子顯示數(shù)字"3",則表示以其為中心的周邊格子內(nèi)藏有3個地雷。當(dāng)按下的格子不是地雷,且周邊八個格子也都沒有地雷時,格子會以被翻開格子的八個方向?qū)⒖瞻赘褡臃_。2.2模塊功能介紹游戲共由四個類和一個模塊組成,如圖1所示。主界面對話框類:主要負(fù)責(zé)主界面、菜單及各個窗口類對象的創(chuàng)建和調(diào)用等處理。掃雷窗口類:主要負(fù)責(zé)接收玩家鼠標(biāo)輸入的打開格子位置、格子變換、花費時間及地雷格子的顯示等處理。英雄榜對話框類:主要負(fù)責(zé)游戲等級記錄的更新。背景音樂播放模塊:主要負(fù)責(zé)游戲中背景音樂的播放。幫組對話框類:主要負(fù)責(zé)幫助提示的顯示及其它顯示功能。圖1游戲主要類結(jié)構(gòu)2.3模塊結(jié)構(gòu)圖2.3.1游戲主界面的設(shè)計掃雷的游戲主界面設(shè)計,如圖2所示。圖2設(shè)計的游戲主界面2.3.2游戲主菜單結(jié)構(gòu)的設(shè)計掃雷的游戲菜單設(shè)計,如圖3所示。圖3設(shè)計的游戲菜單結(jié)構(gòu)2.4程序流程圖掃雷游戲程序流程圖,如圖4所示。圖4程序流程圖2.5功能設(shè)計分工我和***同學(xué)一組。我主要負(fù)責(zé)程序代碼的編寫運行和調(diào)試等;***同學(xué)主要負(fù)責(zé)位圖設(shè)計、界面設(shè)計等。3詳細(xì)設(shè)計3.1游戲菜單的實現(xiàn)在掃雷游戲中,通過如下幾個步驟即可實現(xiàn)添加游戲的菜單。在掃雷游戲工程的資源中添加一個菜單資源,其屬性如表1所示。給每個菜單欄添加響應(yīng)函數(shù)到CMineDlg類中。菜單響應(yīng)函數(shù)的實現(xiàn),如代碼1所示。表1主菜單屬性ID類別說明IDR_MAIN_MENU彈出菜單游戲的主菜單IDR_START_GAME菜單欄開始游戲IDR_EXIT_GAME菜單欄退出游戲IDR_PLAY_MUSIC選擇菜單播放音樂IDR_HELP菜單欄幫助IDR_ABOUT菜單欄關(guān)于代碼1菜單響應(yīng)函數(shù)的實現(xiàn)BEGIN_MESSAGE_MAP<CMineDlg,CDialog> ON_WM_SYSCOMMAND<> ON_WM_PAINT<> ON_WM_QUERYDRAGICON<> //菜單資源與函數(shù)映射表 ON_COMMAND<IDR_ABOUT,OnAbout> ON_COMMAND<IDR_EXIT_GAME,OnExitGame> ON_COMMAND<IDR_HELP,OnHelp> ON_COMMAND<IDR_PLAY_MUSIC,OnPlayMusic> ON_COMMAND<IDR_START_GAME,OnStartGame> //}}AFX_MSG_MAPEND_MESSAGE_MAP<>BOOLCMineDlg::OnInitDialog<>//初始化對話框{ CDialog::OnInitDialog<>; m_bStart=1;//設(shè)置游戲狀態(tài) InitMenu<>;//初始化菜單 returnTRUE;//初始化成功}···//省略部分代碼voidCMineDlg::OnOK<>//單擊"確認(rèn)"按鈕響應(yīng)函數(shù){ CDialog::OnOK<>;}voidCMineDlg::OnCancel<>//單擊"退出"按鈕響函數(shù){ CDialog::OnCancel<>;}voidCMineDlg::OnAbout<>//關(guān)于菜單欄響應(yīng)函數(shù){ CAboutDlgdlg;//創(chuàng)建關(guān)于對話框 dlg.DoModal<>;//彈出關(guān)于對話框}voidCMineDlg::OnExitGame<>//退出菜單欄響應(yīng)函數(shù){ CDialog::OnCancel<>; //調(diào)用基類退出函數(shù)}voidCMineDlg::OnHelp<>//幫助菜單欄響應(yīng)函數(shù){ CHelpDlgdlg;//創(chuàng)建幫助對話框 dlg.DoModal<>;//彈出幫助對話框}voidCMineDlg::OnPlayMusic<>//背景音樂菜單欄響應(yīng)函數(shù){ CWnd*pMain=AfxGetMainWnd<>; CMenu*pMenu=pMain->GetMenu<>; //判斷播放音樂菜單當(dāng)前狀態(tài) BOOLbCheck=<BOOL>pMenu->GetMenuState<IDR_PLAY_MUSIC,MF_CHECKED>; if<m_bStart> { if<bCheck> { pMenu->CheckMenuItem<IDR_PLAY_MUSIC, MF_BYCOMMAND|MF_UNCHECKED>; } else { pMenu->CheckMenuItem<IDR_PLAY_MUSIC, MF_BYCOMMAND|MF_CHECKED>; } PlayBackMusic<!bCheck>; //調(diào)用播放背景音樂功能函數(shù) }}voidCMineDlg::OnStartGame<>{ mine.StartGame<>; //調(diào)用游戲開始接口函數(shù)}voidCMineDlg::InitMenu<>//初始化菜單函數(shù){ CWnd*pMain=AfxGetMainWnd<>; CMenu*pMenu=pMain->GetMenu<>; pMenu->CheckMenuItem<IDR_PLAY_MUSIC,MF_BYCOMMAND|MF_UNCHECKED>;}3.2游戲幫助對話框的實現(xiàn)掃雷游戲中的幫助是使用一個對話框來實現(xiàn)的。其實現(xiàn)步驟如下。添加一個對話框資源到工程中,并填寫說明文字,如圖5所示。圖5幫助對話框編寫一個CHelpDlg對話框類,主要是加載IDD_HELP對話框資源。通過資源中的文字說明對游戲操作方法進(jìn)行描述。同時只包含單擊"知道了"按鈕的響應(yīng)函數(shù)。其類聲明如代碼2所示。代碼2CHelpDlg對話框類聲明#if!defined<AFX_HELPDLG_H__>#defineAFX_HELPDLG_H__//HelpDlg.hCHelpDlg類聲明頭文件//CHelpDlgdialog對話框類classCHelpDlg:publicCDialog//公共繼承于CDialog類{public: CHelpDlg<CWnd*pParent=NULL>;//構(gòu)造函數(shù)//對話框資源 enum{IDD=IDD_HELP_DLG};//加載資源//重載函數(shù) protected: virtualvoidDoDataExchange<CDataExchange*pDX>;//DDX/DDVsupportprotected: virtualvoidOnOK<>;//單擊"確定"按鈕響應(yīng)函數(shù)聲明 DECLARE_MESSAGE_MAP<>};#endifCHeroDlg對話框類的實現(xiàn),需要實現(xiàn)對話框類的構(gòu)造函數(shù)、析構(gòu)函數(shù)和"知道了"按鈕響應(yīng)函數(shù),其代碼如代碼3所示。代碼3對話框類的實現(xiàn)//HelpDlg.cpp:implementationfile#include"stdafx.h"http://插入頭函數(shù)#include"Mine.h"#include"HelpDlg.h"http://插入類聲明頭文件//CHelpDlgdialog對話框類實現(xiàn)CHelpDlg::CHelpDlg<CWnd*pParent/*=NULL*/>//構(gòu)造函數(shù) :CDialog<CHelpDlg::IDD,pParent>{}voidCHelpDlg::DoDataExchange<CDataExchange*pDX>{ CDialog::DoDataExchange<pDX>;}BEGIN_MESSAGE_MAP<CHelpDlg,CDialog>END_MESSAGE_MAP<>//CHelpDlgmessagehandlers消息響應(yīng)函數(shù)voidCHelpDlg::OnOK<>//單擊"知道了"按鈕響應(yīng)函數(shù){ CDialog::OnOK<>;}3.3游戲英雄榜對話框的實現(xiàn)掃雷游戲英雄榜的實現(xiàn),分為如下步驟:創(chuàng)建一個資源對話框,并添加響應(yīng)的控件,如圖6所示。圖6英雄榜對話框資源配置〔setup.ini文件格式如下:[HERO]Name=XXXTime=0添加CHeroDlg類,其中需要包含IDD_HERO_DLG對話框資源和"設(shè)置可寫記錄標(biāo)志"接口函數(shù)聲明,用于外部函數(shù)調(diào)用時,設(shè)置是否對配置文件進(jìn)行寫操作。類的聲明如代碼4所示。代碼4CHeroDlg類的聲明#if!defined<AFX_HERODLG_H__>#defineAFX_HERODLG_H__//HeroDlg.h頭文件//CHeroDlgdialogclassCHeroDlg:publicCDialog{public: voidSetWriteFlg<BOOLbflg>;//接口函數(shù),設(shè)置可記錄標(biāo)志變量 CHeroDlg<CWnd*pParent=NULL>;//standardconstructor構(gòu)造函數(shù) enum{IDD=IDD_HERO_LIST};//對話框資源 CString m_name;//保存姓名變量 int m_time;//保存時間變量 public: virtualintDoModal<>;//彈出對話框函數(shù)聲明 protected: virtualvoidDoDataExchange<CDataExchange*pDX>;//DDX/DDVsupportprotected: virtualvoidOnOK<>;//單擊"久仰"按鈕響應(yīng)函數(shù)聲明 DECLARE_MESSAGE_MAP<>private: BOOLm_bWriteflg;//記錄標(biāo)志變量};#endifCHeroDlg類的實現(xiàn)中通過調(diào)用系統(tǒng)API函數(shù),來對配置文件進(jìn)行讀寫操作。而"設(shè)置讀寫標(biāo)志"接口函數(shù),是對類的一個成員變量m_bWrite進(jìn)行賦值操作,達(dá)到寫入或者讀取的區(qū)分。其代碼如代碼5所示。代碼5CHeroDlg類的實現(xiàn)//HeroDlg.cpp:implementationfile源文件#include"stdafx.h"http://插入頭文件#include"Mine.h"#include"HeroDlg.h"http://插入類聲明頭文件//CHeroDlgdialog對話框CHeroDlg::CHeroDlg<CWnd*pParent/*=NULL*/>//構(gòu)造函數(shù) :CDialog<CHeroDlg::IDD,pParent>{ m_bWriteflg=FALSE;//初始化寫標(biāo)志變量為假}voidCHeroDlg::DoDataExchange<CDataExchange*pDX>{ CDialog::DoDataExchange<pDX>;//變量與資源映射 //{{AFX_DATA_MAP<CHeroDlg> DDX_Text<pDX,IDC_NAME_EDIT,m_name>; DDX_Text<pDX,IDC_TIME_EDIT,m_time>; //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP<CHeroDlg,CDialog> //{{AFX_MSG_MAP<CHeroDlg> ON_BN_CLICKED<IDOK_BTN,OnBtn>//按鈕與函數(shù)映射 //}}AFX_MSG_MAPEND_MESSAGE_MAP<>//CHeroDlgmessagehandlers消息句柄voidCHeroDlg::SetWriteFlg<BOOLbflg>//設(shè)置寫入標(biāo)志{ m_bWriteflg=bflg;}intCHeroDlg::DoModal<>//彈出對話框{ charpszTmp[128]={0}; //讀取配置文件 GetPrivateProfileString<"HERO","name","", pszTmp,127,".\\hero.ini">;//讀入姓名 m_name=CString<pszTmp>; if<!m_bWriteflg> { GetPrivateProfileString<"HERO","time","0", pszTmp,127,".\\hero.ini">;//讀入等級 m_time=atoi<pszTmp>; } returnCDialog::DoModal<>;}voidCHeroDlg::OnBtn<>//按鈕響應(yīng){ UpdateData<TRUE>; if<m_bWriteflg> { CStringtmp; //寫入姓名和時間記錄 tmp.Format<"%d",m_time>; WritePrivateProfileString<"HERO","name",m_name,".\\hero.ini">; WritePrivateProfileString<"HERO","time",tmp,".\\hero.ini">; } m_bWriteflg=FALSE; CDialog::OnOK<>;}BOOLCHeroDlg::OnInitDialog<>//初始化對話{ CDialog::OnInitDialog<>; if<m_bWriteflg> {//當(dāng)為寫入時,把按鈕名稱改變 SetDlgItemText<IDOK_BTN,"記錄">; } returnTRUE;}3.4游戲播放背景音樂的實現(xiàn)播放游戲背景音樂,是通過調(diào)用Windows的API函數(shù)sndPlaySound<>來實現(xiàn)的。當(dāng)玩家選擇"游戲設(shè)置"|"播放音樂"命令時,就播放音樂。相反,如果取消,就停止播放音樂。要實現(xiàn)這個功能,需要如下幾步:在工程文件中,添加winmm.lib靜態(tài)庫文件及頭文件。實現(xiàn)CMineDlg類中的PlayBackMusic<>成員函數(shù),其代碼如代碼6所示。代碼6CMineDlg類中的PlayBackMusic<>成員函數(shù)實現(xiàn)#include<mmsystem.h>//插入系統(tǒng)API頭文件···voidCMineDlg::PlayBackMusic<BOOLbCheck>{//指定文件并播放 if<bCheck> { //播放指定音樂文件 sndPlaySound<"music.wav",SND_ASYNC>; } else { //停止播放 sndPlaySound<NULL,SND_PURGE>; }}3.5新游戲處理模塊的設(shè)計與實現(xiàn)新游戲處理模塊主要負(fù)責(zé)游戲中的游戲初始化及開始游戲。其設(shè)計比較簡單,只需要通過如下幾步即可實現(xiàn)。載入圖片資源和配置文件中的數(shù)據(jù)。把所有的游戲參數(shù)進(jìn)行初始化。例如,當(dāng)前消耗時間和狀態(tài)等。初始化表示地雷區(qū)域的二維數(shù)組。讓地雷區(qū)域圖像失效,重新繪制新的圖像。其實現(xiàn)如代碼7所示。代碼7新游戲處理模塊的實現(xiàn)/*配置文件讀取*/voidCMyMine::LoadConfig<>{ charpszTmp[128]={0}; //讀取配置文件中的數(shù)據(jù) GetPrivateProfileString<"HERO","time","0", pszTmp,127,".\\hero.ini">; m_uHighTime=atoi<pszTmp>;//轉(zhuǎn)換數(shù)據(jù) m_uXNum =30; //X坐標(biāo)上的方塊個數(shù) m_uYNum =16; //Y坐標(biāo)上的方塊個數(shù) m_uMineNum =99; //地雷個數(shù) m_bMarkful=TRUE; m_bColorful=TRUE;}/*載入圖片資源*/voidCMyMine::LoadBitmap<>{ if<m_bColorful>{ m_clrDark=COLOR_DARK_GRAY; m_bmpMine.DeleteObject<>; m_bmpMine.LoadBitmap<IDB_MINE_COLOR>; m_bmpNumber.DeleteObject<>; m_bmpNumber.LoadBitmap<IDB_NUM_COLOR>; m_bmpButton.DeleteObject<>; m_bmpButton.LoadBitmap<IDB_BTN_COLOR>; } else{ m_clrDark=COLOR_BLACK; m_bmpMine.DeleteObject<>; m_bmpMine.LoadBitmap<IDB_MINE_GRAY>; m_bmpNumber.DeleteObject<>; m_bmpNumber.LoadBitmap<IDB_NUM_GRAY>; m_bmpButton.DeleteObject<>; m_bmpButton.LoadBitmap<IDB_BTN_GRAY>; }}/*初始化游戲*/voidCMyMine::InitGame<>{ LoadBitmap<>;//加載圖片 LoadConfig<>;//加載配置文件 m_nLeaveNum=m_uMineNum; m_uSpendTime=0; m_uBtnState=BS_NORMAL; //設(shè)置當(dāng)前方塊狀態(tài) m_uGameState=GS_WAIT; //設(shè)置當(dāng)前游戲狀態(tài) if<m_uTimer>{ KillTimer<ID_TIMER_EVENT>; m_uTimer=0; } m_pNewMine=NULL; //清空當(dāng)前選中的小方塊 m_pOldMine=NULL; //清空上次選中的小方塊 //初始化表示雷區(qū)的二維數(shù)組 for<UINTi=0;i<m_uYNum;i++>{ for<UINTj=0;j<m_uXNum;j++>{ m_pMines[i][j].uRow=i; m_pMines[i][j].uCol=j; m_pMines[i][j].uState=STATE_NORMAL; m_pMines[i][j].uAttrib=ATTRIB_EMPTY; m_pMines[i][j].uOldState=STATE_NORMAL; } }}voidCMyMine::StartGame<>//開始新游戲接口函數(shù){ InitGame<>; Invalidate<>;//使主界面失效,重新繪制}3.6地雷格子模塊的設(shè)計與實現(xiàn)地雷格子的處理是掃雷游戲的核心內(nèi)容,包括如下幾個部分。地雷鋪設(shè)模塊。游戲中的地雷是隨機(jī)鋪設(shè)的,可以調(diào)用隨機(jī)數(shù)發(fā)生函數(shù)生成隨機(jī)數(shù)。利用隨機(jī)數(shù)去除最大行數(shù)或者最大列數(shù),得到放置地雷行列坐標(biāo)。然后分別防止地雷到不同的行和列的格子中去。自動打開周圍不是地雷的格子。在游戲中,當(dāng)玩家單擊的格子周圍沒有地雷格子時,就需要程序自動地把周圍的格子自動打開來提高玩家的效率。其實現(xiàn)是通過遞歸的方法不斷地打開周圍格子周圍地雷個數(shù)為0的格子來實現(xiàn)。獲得周圍地雷個數(shù)模塊。在游戲中當(dāng)玩家打開一個格子時,如果當(dāng)前這個格子不是地雷,那么其一定是標(biāo)明周圍的地雷個數(shù)的格子。要實現(xiàn)這個功能主要是通過遍歷當(dāng)前格子周圍的3×3范圍的數(shù)組。當(dāng)找到一個元素狀態(tài)是地雷時,就把記錄增加1,知道九個格子全部找完。這樣就可以得到當(dāng)前格子周圍的地雷個數(shù)。以上講解的相關(guān)函數(shù)的實現(xiàn),如代碼8所示。代碼8地雷格子相關(guān)函數(shù)的實現(xiàn)/*在雷區(qū)鋪設(shè)地雷*/voidCMyMine::LayMines<UINTrow,UINTcol>{ srand<<unsigned>time<NULL>>;//初始化隨機(jī)數(shù)生成種子 UINTi,j; for<UINTindex=0;index<m_uMineNum;>{ i=rand<>%m_uYNum;//根據(jù)生成的隨機(jī)數(shù)得到數(shù)組坐標(biāo) j=rand<>%m_uXNum; if<i==row&&j==col>continue; //設(shè)置地雷 if<m_pMines[i][j].uAttrib!=ATTRIB_MINE>{ m_pMines[i][j].uAttrib=ATTRIB_MINE; index++; } } }/*自動打開相關(guān)不是地雷的格子*/voidCMyMine::ExpandMines<UINTrow,UINTcol>{ UINTi,j; UINTminRow=<row==0>?0:row-1; UINTmaxRow=row+2; UINTminCol=<col==0>?0:col-1; UINTmaxCol=col+2; UINTaround=GetAroundNum<row,col>;//得到周圍地雷數(shù)量 m_pMines[row][col].uState=15-around; m_pMines[row][col].uOldState=15-around; //在指定位置畫出地雷 DrawSpecialMine<row,col>; if<around==0>{ for<i=minRow;i<maxRow;i++>{ for<j=minCol;j<maxCol;j++>{ if<!<i==row&&j==col>&& m_pMines[i][j].uState==STATE_NORMAL &&m_pMines[i][j].uAttrib!=ATTRIB_MINE>{ if<!IsInMineArea<i,j>>continue; ExpandMines<i,j>; } } } }}/*獲得周圍地雷個數(shù)*/UINTCMyMine::GetAroundNum<UINTrow,UINTcol>{ UINTi,j; UINTaround=0;//初始化變量 UINTminRow=<row==0>?0:row-1;//得到最小列 UINTmaxRow=row+2; UINTminCol=<col==0>?0:col-1;//得到最大行 UINTmaxCol=col+2; for<i=minRow;i<maxRow;i++>{ for<j=minCol;j<maxCol;j++>{ if<!IsInMineArea<i,j>>continue;//查找指定位置是否是地雷 if<m_pMines[i][j].uAttrib==ATTRIB_MINE>around++; } } returnaround;//返回周圍地雷個數(shù)}/*得到周圍格子狀態(tài)*/UINTCMyMine::GetAroundFlags<UINTrow,UINTcol>{ UINTi,j; UINTflags=0; UINTminRow=<row==0>?0:row-1; UINTmaxRow=row+2; UINTminCol=<col==0>?0:col-1; UINTmaxCol=col+2; for<i=minRow;i<maxRow;i++>{//遍歷指定格子周圍的數(shù)組數(shù)據(jù) for<j=minCol;j<maxCol;j++>{ if<!IsInMineArea<i,j>>continue; if<m_pMines[i][j].uState==STATE_FLAG>flags++; } } returnflags;}/*地雷判斷*/BOOLCMyMine::IsMine<UINTrow,UINTcol>{//比較指定數(shù)據(jù)是否是地雷 return<m_pMines[row][col].uAttrib==ATTRIB_MINE>;}/*雷區(qū)判斷*/BOOLCMyMine::IsInMineArea<UINTrow,UINTcol>{//判斷是否是在地雷區(qū)以內(nèi) return<row>=0&&row<m_uYNum&&col>=0&&col<m_uXNum>;}3.7游戲規(guī)則模塊的設(shè)計與實現(xiàn)游戲規(guī)則模塊的實現(xiàn),主要由游戲勝利和游戲結(jié)束判斷函數(shù)組成。通過對游戲的結(jié)果進(jìn)行判斷,實現(xiàn)掃雷游戲的規(guī)則。1.游戲勝利的判斷通過遍歷整個地雷數(shù)組,查找是否全部的地雷格子已經(jīng)被標(biāo)記或者找出來。如果已經(jīng)全部被找出來或者標(biāo)示出來,那么說明玩家勝利。反之,說明玩家未勝利,需要繼續(xù)游戲。游戲結(jié)束的判斷當(dāng)玩家打開一個格子時,就對當(dāng)前格子進(jìn)行判斷。如果是地雷,說明玩家不幸踩雷。游戲以失敗結(jié)束。而如果不是地雷,就對玩家選中的格子周圍的標(biāo)示進(jìn)行判斷,如果有判斷錯誤的格子,也說明玩家失敗游戲結(jié)束。游戲規(guī)則模塊的實現(xiàn)函數(shù),如代碼9所示。代碼9游戲勝利和失敗判斷函數(shù)的實現(xiàn)/*游戲結(jié)束*/voidCMyMine::Dead<UINTrow,UINTcol>{ CRectrcBtn<m_uBtnRect[1],15,m_uBtnRect[2],39>; CRectrcMineArea<MINE_AREA_LEFT,MINE_AREA_TOP, MINE_AREA_LEFT+m_uXNum*MINE_WIDTH,MINE_AREA_TOP+m_uYNum*MINE_HEIGHT>; UINTi,j; if<m_pMines[row][col].uAttrib==ATTRIB_MINE>{//打開了是地雷的格子 for<i=0;i<m_uYNum;i++>{ for<j=0;j<m_uXNum;j++>{ m_pMines[row][col].uState=STATE_BLAST; m_pMines[row][col].uOldState=STATE_BLAST; if<m_pMines[i][j].uAttrib==ATTRIB_MINE &&m_pMines[i][j].uState!=STATE_FLAG>{ m_pMines[i][j].uState=STATE_MINE; m_pMines[i][j].uOldState=STATE_MINE; } } } } else{ //打開了判斷錯誤的格子 for<i=0;i<m_uYNum;i++>{ for<j=0;j<m_uXNum;j++>{ m_pMines[row][col].uState=STATE_ERROR; m_pMines[row][col].uOldState=STATE_ERROR; if<m_pMines[i][j].uAttrib==ATTRIB_MINE &&m_pMines[i][j].uState!=STATE_FLAG>{ m_pMines[i][j].uState=STATE_MINE; m_pMines[i][j].uOldState=STATE_MINE; } } } } InvalidateRect<rcMineArea>;//重繪指定區(qū)域圖像 m_uBtnState=BS_DEAD;//設(shè)置按鈕狀態(tài)為結(jié)束 InvalidateRect<rcBtn>; m_uGameState=GS_DEAD;//設(shè)置游戲狀態(tài)為結(jié)束 if<m_uTimer!=0>{ KillTimer<ID_TIMER_EVENT>;//關(guān)閉定時器 m_uTimer=0; } AfxMessageBox<"您踩到地雷了,游戲結(jié)束">;}/*獲得勝利*/BOOLCMyMine::Victory<>{ UINTi,j; CRectrcBtn<m_uBtnRect[1],15,m_uBtnRect[2],39>; for<i=0;i<m_uYNum;i++>{//遍歷整個雷區(qū)數(shù)組是否還有數(shù)據(jù)為地雷標(biāo)志 for<j=0;j<m_uXNum;j++>{ if<m_pMines[i][j].uState==STATE_NORMAL>returnFALSE; if<m_pMines[i][j].uState==STATE_DICEY>returnFALSE; } } m_uBtnState=BS_VICTORY;//設(shè)置按鈕的狀態(tài)為勝利 m_uGameState=GS_VICTORY;//設(shè)置游戲的狀態(tài)為勝利 Invalidate<>; if<m_uTimer!=0>{ KillTimer<ID_TIMER_EVENT>;//關(guān)閉定時器 m_uTimer=0; }3.8游戲繪圖模塊的設(shè)計與實現(xiàn)在掃雷游戲中,通過繪圖模塊要實現(xiàn)地雷、格子、地雷個數(shù)、當(dāng)前時間及控制按鈕等圖片和信息的提示。由如下幾個函數(shù)組成。其代碼如代碼10所示。繪按鈕函數(shù)繪按鈕函數(shù),主要通過在游戲中不斷地得到當(dāng)前游戲的狀態(tài)。根據(jù)這個按鈕,在按鈕圖片中把指定的坐標(biāo)范圍圖片繪制到主界面上。繪數(shù)字區(qū)域函數(shù)剩余地雷個數(shù)和消耗時間的數(shù)字顯示,主要通過一定的算法,得到當(dāng)前地雷剩余個數(shù)和已經(jīng)消耗時間的個位、十位和百位數(shù)字把相應(yīng)的數(shù)字圖片繪制到指定的區(qū)域。繪雷區(qū)函數(shù)繪雷區(qū)函數(shù),是通過遍歷當(dāng)前雷區(qū)數(shù)組,并根據(jù)當(dāng)前元素所代表的類型不同,將不同的圖片繪制到位置。游戲繪圖模塊的實現(xiàn)函數(shù),如代碼10所示。代碼10繪圖模塊的函數(shù)實現(xiàn)voidCMyMine::DrawButton<CPaintDC&dc>{ CDCcdc; cdc.CreateCompatibleDC<&dc>; cdc.SelectObject<m_bmpButton>; //把指定范圍的圖片繪制到界面上 dc.StretchBlt<m_uBtnRect[0],16,24,24,&cdc,0,24*m_uBtnState,24,24,SRCCOPY>; //畫按鈕的3D狀態(tài) dc.Draw3dRect<m_uBtnRect[1],15,26,26,m_clrDark,m_clrDark>;}//畫地雷數(shù)字voidCMyMine::DrawNumber<CPaintDC&dc>{ CDCcdc; cdc.CreateCompatibleDC<&dc>; cdc.SelectObject<m_bmpNumber>; dc.Draw3dRect<16,15,41,25,m_clrDark,COLOR_WHITE>; dc.Draw3dRect<m_uNumRect[0],15,41,25,m_clrDark,COLOR_WHITE>; intnum; //drawremainingminenumbers得到剩余地雷數(shù)的各位、十位和百位數(shù) num=<m_nLeaveNum<0>?11:m_nLeaveNum/100; dc.StretchBlt<17,16,13,23,&cdc,0,276-23*<num+1>,13,23,SRCCOPY>; num=<m_nLeaveNum<0>?-<m_nLeaveNum-num*100>/10:<m_nLeaveNum-num*100>/10; dc.StretchBlt<30,16,13,23,&cdc,0,276-23*<num+1>,13,23,SRCCOPY>; num=<m_nLeaveNum<0>?-m_nLeaveNum%10:m_nLeaveNum%10; dc.StretchBlt<43,16,13,23,&cdc,0,276-23*<num+1>,13,23,SRCCOPY>; //drawtakeseconds得到當(dāng)前消耗的時間的各位、十位和百位數(shù) num=m_uSpendTime/100; dc.StretchBlt<m_uNumRect[0],16,13,23,&cdc,0,276-23*<num+1>,13,23,SRCCOPY>; num=<m_uSpendTime-num*100>/10; dc.StretchBlt<m_uNumRect[0]+13,16,13,23,&cdc,0,276-23*<num+1>,13,23,SRCCOPY>; num=m_uSpendTime%10; dc.StretchBlt<m_uNumRect[0]+26,16,13,23,&cdc,0,276-23*<num+1>,13,23,SRCCOPY>;}/*voidCMyMine::DrawShell<CPaintDC&dc>{ //drawside dc.FillSolidRect<0,0,m_uShellRcX[0],LINE_WIDTH_0,COLOR_WHITE>; dc.FillSolidRect<0,0,LINE_WIDTH_0,m_uShellRcY[0],COLOR_WHITE>; //drawsmallshell dc.Draw3dRect<SHELL_S_START_X,SHELL_S_START_Y, m_uShellRcX[1],SHELL_S_H,m_clrDark,COLOR_WHITE>; dc.Draw3dRect<SHELL_S_START_X+1,SHELL_S_START_Y+1, m_uShellRcX[1]-2,SHELL_S_H-2,m_clrDark,COLOR_WHITE>; //drawlargeshell dc.Draw3dRect<SHELL_L_START_X,SHELL_L_START_Y, m_uShellRcX[1],m_uShellRcY[1],m_clrDark,COLOR_WHITE>; dc.Draw3dRect<SHELL_L_START_X+1,SHELL_L_START_Y+1, m_uShellRcX[1]-2,m_uShellRcY[1]-2,m_clrDark,COLOR_WHITE>; dc.Draw3dRect<SHELL_L_START_X+2,SHELL_L_START_Y+2, m_uShellRcX[1]-4,m_uShellRcY[1]-4,m_clrDark,COLOR_WHITE>;}*///畫地雷區(qū)域voidCMyMine::DrawMineArea<CPaintDC&dc>{ CDCcdc; cdc.CreateCompatibleDC<&dc>; cdc.SelectObject<m_bmpMine>; for<UINTi=0;i<m_uYNum;i++>{ for<UINTj=0;j<m_uXNum;j++>{ //根據(jù)元素類型,繪制不同的圖片 dc.StretchBlt<MINEAREA_FRAME_X+16*j,MINEAREA_FRAME_Y+16*i, 16,16,&cdc,0,16*m_pMines[i][j].uState,16,16,SRCCOPY>; } }}3.9玩家輸入模塊的設(shè)計與實現(xiàn)在掃雷游戲中,用的最多的就是鼠標(biāo)的輸入。而鼠標(biāo)輸入又分為鼠標(biāo)左鍵單擊和右鍵單擊兩種處理類型。鼠標(biāo)左鍵的處理要實現(xiàn)鼠標(biāo)左鍵的處理,需要如下幾個步驟。接收玩家在界面上的鼠標(biāo)左鍵輸入信息。對當(dāng)前鼠標(biāo)的坐標(biāo)進(jìn)行判斷。當(dāng)在按鈕區(qū)時,調(diào)用控制按鈕的處理函數(shù)。當(dāng)在地雷區(qū)時,如果當(dāng)前游戲的狀態(tài)是等待輸入或者正在運行時,就得到當(dāng)前選中的格子指針;反之,不進(jìn)行響應(yīng)。在得到格子指針后,對選中格子的狀態(tài)進(jìn)行判斷。如果是正常的格子,即未被打開過的格子,就轉(zhuǎn)到格子處理函數(shù);如果不是不是能夠的格子,則不進(jìn)行響應(yīng)。鼠標(biāo)右鍵的處理要實現(xiàn)鼠標(biāo)右鍵的處理,需要如下幾個步驟。接收玩家在界面上的鼠標(biāo)右鍵輸入信息。對當(dāng)前鼠標(biāo)的坐標(biāo)進(jìn)行判斷。當(dāng)在地雷區(qū)時,如果當(dāng)前游戲的狀態(tài)是等待輸入或者正在運行時,就得到當(dāng)前選中的格子指針;反之,不進(jìn)行響應(yīng)。根據(jù)當(dāng)前格子的狀態(tài)進(jìn)行變化。其變化規(guī)則為:如果是正常狀態(tài),則變成標(biāo)記〔旗子狀態(tài);如果是標(biāo)記狀態(tài),則變成未知〔?號狀態(tài);如果是未知狀態(tài),則變成正常狀態(tài)。鼠標(biāo)輸入模塊的函數(shù)實現(xiàn)如代碼11所示。代碼11鼠標(biāo)輸入處理函數(shù)實現(xiàn)//鼠標(biāo)左鍵輸入響應(yīng)函數(shù)voidCMyMine::OnLButtonDown<UINTnFlags,CPointpoint>{ CRectrcBtn<m_uBtnRect[1],15,m_uBtnRect[2],39>; CRectrcMineArea<MINE_AREA_LEFT,MINE_AREA_TOP, MINE_AREA_LEFT+m_uXNum*MINE_WIDTH,MINE_AREA_TOP+m_uYNum*MINE_HEIGHT>; SetCapture<>; //捕獲鼠標(biāo)光標(biāo) m_bClickBtn=FALSE; m_bLRBtnDown=FALSE; if<rcBtn.PtInRect<point>>{ //單擊的按鈕區(qū) m_bClickBtn=TRUE; m_uBtnState=BS_DOWN; InvalidateRect<rcBtn>; } elseif<rcMineArea.PtInRect<point>>{ //單擊的地雷區(qū) //changeminestatebygamestate switch<m_uGameState>{ //根據(jù)當(dāng)前游戲狀態(tài)進(jìn)行處理 caseGS_WAIT://游戲狀態(tài)為等待 m_pNewMine=GetMine<point.x,point.y>; if<!m_pNewMine>return; if<m_pNewMine->uState==STATE_NORMAL>{ m_pNewMine->uState=STATE_EMPTY; } if<m_pNewMine->uState==STATE_DICEY>{ m_pNewMine->uState=STATE_DICEY_DOWN; } m_pOldMine=m_pNewMine; break; caseGS_DEAD://游戲狀態(tài)為結(jié)束 return; } m_uBtnState=BS_CLICK;//按鈕為接收按下 InvalidateRect<rcBtn>; //在左右鍵同時按下時進(jìn)行處理 if<nFlags==<MK_LBUTTON|MK_RBUTTON>>{ m_bLRBtnDown=TRUE; OnLRBtnDown<m_pOldMine->uRow,m_pOldMine->uCol>; } InvalidateRect<rcMineArea>; } else{ //單擊的其它區(qū)域 if<m_uGameState==GS_WAIT||m_uGameState==GS_RUN>{ m_uBtnState=BS_CLICK; InvalidateRect<rcBtn>; } } CWnd::OnLButtonDown<nFlags,point>;//調(diào)用窗口類的左鍵響應(yīng)函數(shù)}/*鼠標(biāo)右鍵輸入響應(yīng)函數(shù)*/voidCMyMine::OnRButtonDown<UINTnFlags,CPointpoint>{ CRectrcBtn<m_uBtnRect[1],15,m_uBtnRect[2],39>; CRectrcMineArea<MINE_AREA_LEFT,MINE_AREA_TOP, MINE_AREA_LEFT+m_uXNum*MINE_WIDTH,

溫馨提示

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

評論

0/150

提交評論