當前位置:編程學習大全網 - 編程語言 - 關於C和C++得編程。想用他們編壹些界面 類似於對話框之類。之前聽說C和C++也可以編,但是圖形功能不是很強

關於C和C++得編程。想用他們編壹些界面 類似於對話框之類。之前聽說C和C++也可以編,但是圖形功能不是很強

用VC++編寫掃雷遊戲

本文從分析windows掃雷遊戲的功能特點開始,應用面向對象的可視化編程語言visual c++給出了個功能模塊的具體實現方法,並提供了編寫小遊戲程序的壹般方法和visual c++的壹些使用技巧。

首先分析掃雷的最基本功能。

點擊鼠標左鍵於未知區域,如果未知區域有雷,遊戲停止,顯示所有的地雷。如果沒雷,則顯示周圍雷數,如果周圍沒雷,則再查看周圍八個區域是否有雷直到有雷為止並顯示,這其實是壹個遞歸過程。

點擊鼠標右鍵於未知區域,則將其置為有雷而不管是否真的有雷。可選擇初、中、高三級並可自定義雷數和區域大小。

雷區上部左側顯示總雷數減被標明有雷區域的數目。

雷區上部中間位置顯示壹按鈕用於開局和顯示鼠標動作的結果。

雷區上部右側顯示掃雷的時間。

將雷全部掃清後,則顯示壹對話框將妳的姓名記入排行榜。以時間排序。

為完成上述功能,應用visual c++的具體技術細節如下:

1. 應用appwizard創建基於sdi的應用程序cbombapp,去除打印和狀態條支持,在資源編輯器中修改菜單和相應的加速鍵,使其與windows掃雷遊戲壹致。具體為開局(id-game-begin)、初級(id-game-junior)、中級(id-game-middle)、高級(id-game-senior)、自定義(id-game-custom)、顏色(id-game-color)、英雄榜(id-game-sort)、退出(id-game-exit)、幫助(id-help)。

2. 在資源編輯器中對應於雷區的每個小區域的13個屬性。用畫筆或其他繪圖工具繪制出相對應的13個10乘10的16色小位圖,三個對應於小人表情的20乘20的16色小位圖,供更換顏色時使用的壹套與前16個對應的單色位圖,顯示時間和雷數的0~9十個數字位圖(底色為黑色)。

定制customer對話框,內含三個靜態文本控件和三個編輯控件,三個編輯控件分別對應成員m_irownum,m_icolumnnum,m_ibombnum。該對話框用於定制雷數,行列數,其相應的mfc類為ccustomer。定制sort對話框,內含九個靜態文本控件,其中六個顯示排行榜的姓名和時間,其對應的mfc類為csort。定制input對話框,內含壹個靜態文本控件和壹個編輯控件,編輯控件用於在遊戲成功結束時輸入姓名,其對應的mfc類為cinput。

3. 定義類bomb,封裝每顆雷的相關屬性。

class bomb

{

public:

int isbomb;//決定初始時是否是雷

bool issel; //判斷區域是否被處理過且周圍有雷

bool isdone;//判斷遞歸時是否被處理過

int num; //周圍雷數

bool findbomb; //排雷者認為是雷時置壹(但是不壹定真是雷)

} ;

4. 重載cmainframe中precreatewindow,並設置相應屬性,使其窗體大小固定,這樣就固定了顯示區域的大小為初始10乘10個雷和外加雷區上部的控制區域,部分代碼如下。

cs.style=ws_overlapped|ws_sysmenu| ws_border|ws_minimizebox;

cs.cy = 10*15+6;

cs.cx = 10*15+60; //6和60分別是橫縱的附加值,用於邊框、菜單、標題條、控制區域。

5. 遊戲的主要工作就是呈現不斷變換的圖形或動畫,並按用戶的輸入交互進行顯示,而windows文檔-----視窗構架中的視窗的功能正是接受用戶輸入並負責顯示,因此由cview類來完成掃雷的大部分工作。在cbombview中定義下列成員變量記錄相關操作的結果或對象的狀態。

bomb m_bomb[30][30]; //最大的地雷區域

cstring m_currenttime; //用於記錄並顯示掃雷時間

ctime m_begintime;//記錄遊戲開始時的時間

bool m_timerbegin;//定時器是否開啟

int m_ibomnum;//雷的數目

int m_irow;//雷的行數

int m_icolumn;//雷的列數

int m_ibombfound;//指示被認為是雷的數目

cbitmapbutton m_bitbutton;//控制區的位圖按鈕

int m_currentlevel;//指示當前遊戲的級別

bool m_biscolor;//指示當前是彩色還是單色

cbitmap m_bmbomb[12];//用於存放12個小位圖

int m_igameover;//遊戲未結束置0,已清除所有的雷置1,被炸死置2。

重載cbombview中oncreate函數創建位圖按鈕,該位圖按鈕的兩幅位圖對應了正常、排雷正確兩種狀態,當要顯示被炸死的狀態時應動態銷毀該按鈕,並重新創建壹位圖對應正常和被炸死兩種狀態,將該位圖按鈕的id號定為id_game_begin,這樣壹來當點擊按鈕時便可重新開始遊戲,部分代碼如下。

crect rcclient;

getclientrect(&rcclient);

crect rect(rcclient.cx/2-8,10,rcclient.cx/2+8,20);

m_button.create("new",bs_defpushbutton|ws_visible|

bs_ownerdraw,rect,this,id_game_begin);

m_button.loadbitmaps(idb_face1, idb_face2);

顯示時間的功能相對比較簡單,在響應第壹個wm_lbuttomdown消息時開啟定時器,並記錄遊戲開始的時間,在wm_time消息響應函數ontimer中獲得當前時間,減去遊戲開始時的時間,在顯示時間的客戶區域顯示得到的時間差(用數字位圖),當遊戲結束時(排完全部雷或被炸死)關閉定時器,停止顯示。

wm_lbuttomdown消息響應函數onlbuttomdown是處理用戶輸入的主要執行者,函數首先判斷點中位置是否是雷,是則關閉定時器,銷毀原位圖按鈕,創建壹對應正常和被炸死兩種狀態的新位圖按鈕,並調用setstate將其設置為pushdown(小人哭的狀態),將m_bgameover,置為true標誌遊戲結束,否則先調用setstate 設置位圖按鈕為pushdown (小人笑的狀態),並在onlbuttomup中設置位圖按鈕為正常狀態,然後調用caculate函數記下周圍雷的數目,最後調用invalidate使客戶區無效,迫使ondraw函數重繪客戶區域,在調用invalidate時不應重畫背景,避免閃爍,這樣就完成了在雷區按下左鍵的響應動作。

wm_rbuttomdown消息響應函數onlbuttomdown將被認為有雷位置的m_ibombnum.findbomb置壹,減少左上角的雷記數,然後判斷是否真正全部排完了雷,是則結束遊戲彈出input對話框,讓掃雷的人輸入姓名,在響應idok通知碼時將其寫入註冊表,沒有全部排完則使客戶區無效,迫使ondraw函數重繪客戶區域完成在雷區按下右鍵的動作。

ondraw函數在每次點擊左鍵或右鍵時都會被調用重雷區和控制區域,因為點擊情況的復雜性和雷屬性的多元化導致ondraw函數需要精心設計。

函數caculate計算某個雷周圍的雷數,根據前面的分析知道,計算某個雷周圍的雷數本身就是壹個遞歸過程,在編制時應註意遞歸的邊界條件,稍不註意會陷入無窮遞歸而耗盡了系統的資源。

6. 菜單命令的響應是遊戲交互的另壹個重要方式,下面的九個命令響應函數分別與九個菜單項相對應,用以完成用戶的更新和設置命令。

ongamebegin完成初始時間清零,隨機布雷,依據顏色指示裝載12幅小位圖,使雷區無效調用ondraw重繪等工作。其中隨機布雷就是多次調用rand(),根據其返回值決定m_bomb[i][j].isbomb的值。

ongamecustom首先彈出ccustomer對話框,在用戶輸入設置後響應idok通知碼時將用戶輸入的雷數、行列數分別賦給cview的數據成員m_ibombnum、m_irow、m_icolumn,得到框架窗口的指針,用其調用movewindow將窗口調至所需大小,銷毀原位置的位圖按鈕,並在x軸坐標為新窗口寬1/2減8處,y軸坐標為新窗口頂部加30的位置創建壹新按鈕。最後調用ongamebegin重新開始遊戲。

ongamejunior、ongamemiddle、ongamesenior三個函數與ongamecustom類似,只不過將分別賦給cview的數據成員m_ibombnum、m_irow、m_icolumn以固定的值,其大小可由編程者自定,筆者定為junior(20,8,8,)、middle(40,13,13)、senior(99,20,25)。

ongamecolor函數銷毀原位圖按鈕,根據重新裝載位圖的標誌m_iscolor來創建新的位圖按鈕,將裝載12幅單色位圖的標誌取反,調用ongamebegin重新開始遊戲。

ongamesort函數根據當前遊戲級別從註冊表中讀出排名並彈出sort對話框顯示結果。到現在為止,壹個自己編制的掃雷遊戲就基本完成了,將數百行代碼編譯壹下,找出小錯誤,最後build壹遍,run壹下,好了,可愛的掃雷遊戲就出現在妳的面前了。怎麽樣,自己的勞動成果並不比microsoft的差吧,而且妳還可以把小位圖畫成各種樣子,當然妳自己要認得出才行了。

  • 上一篇:c語言編萬年歷
  • 下一篇:我國教育目的的實踐中的缺失的表現及原因
  • copyright 2024編程學習大全網