當前位置:編程學習大全網 - 編程語言 - 代碼編程惡棍

代碼編程惡棍

用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)。

2.13資源編輯器中雷區每個小區域對應的屬性。用畫刷或其他畫圖工具畫出對應的13 10 16彩色位圖,反派表情對應的20乘20的三個16彩色位圖,換色對應的第壹個16的壹組單色位圖,顯示時間和雷數的0 ~。

自定義客戶對話框,包含三個靜態文本控件和三個編輯控件,三個編輯控件分別對應成員M _ I Rownum、M _ iColumnum和M _ Ibombnum。該對話框用於自定義雷數、行數和列數,其對應的mfc類為ccustomer。自定義排序對話框,包含9個靜態文本控件,其中6個顯示排行榜的名稱和時間,對應的mfc類是csort。自定義輸入對話框,其中包含壹個靜態文本控件和壹個編輯控件。編輯控件用於遊戲成功結束時輸入名字,其對應的mfc類為Qinput。

3.定義炸彈,封裝每個地雷的相關屬性。

班級炸彈

{

公共:

int isbomb//先決定是不是雷。

布爾·伊塞爾;//判斷該區域是否經過處理,周圍是否有雷。

bool isdone//判斷遞歸是否處理過。

int num//周圍的雷數

bool findbomb//當排雷人員認為是地雷時,他們就會是地雷(但不壹定是地雷)。

} ;

4.在cmainframe中重載precreatewindow,設置相應的屬性使其窗體大小固定,從而固定初始大小為10乘以10的顯示區域和雷區上方的控制區域。部分代碼如下。

cs . style = ws _ overlapped | ws _ sysmenu | ws _ border | ws _ minimize box;

cs . cy = 10 * 15+6;

cs . CX = 10 * 15+60;//6和60分別是水平和垂直的附加值,用於邊框、菜單、標題欄和控件區域。

5.遊戲的主要工作是呈現不斷變化的圖形或動畫,並根據用戶的輸入進行交互顯示。windows在Windows document-window框架中的作用是接受用戶的輸入並負責顯示,所以cview類完成了大部分的掃雷工作。在cbombview中定義以下成員變量,以記錄相關操作的結果或對象的狀態。

炸彈m _炸彈[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//指示當前是彩色還是單色。

cbit map m _ BM bomb[12];//用於存儲12小位圖。

int m _ igameover//遊戲結束前設置0。所有的地雷都被清除了。被殺時設置2。

在cbombview中重新加載oncreate函數來創建壹個位圖按鈕。這個位圖按鈕的兩個位圖分別對應正常和掃雷正確狀態。當要顯示被殺狀態時,要動態銷毀按鈕,重新創建壹個正常和被殺狀態對應的位圖,並將這個位圖按鈕的id號設置為id_game_begin,這樣當按鈕被點擊時,就可以重新啟動遊戲。部分代碼如下。

crect rcclient

getclientrect(& amp;RC client);

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 . load bitmaps(IDB _ face 1,IDB _ face 2);

顯示時間的功能比較簡單。當響應第壹條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設置為減少左上角的地雷數量,然後判斷是否已經排完所有地雷。如果是,遊戲結束,彈出輸入對話框,允許掃雷艦在響應idok通知代碼時輸入名字並寫入註冊表。如果不是所有的地雷都被排出,客戶區將無效,迫使ondraw函數重新繪制客戶區,並在雷區中按下右鍵。

每次點擊左鍵或右鍵,ondraw函數將被調用到重雷區和控制區。由於點擊情況的復雜性和地雷屬性的多樣化,需要精心設計ondraw函數。

函數calculate計算某個雷周圍的雷數。根據前面的分析可知,計算某個雷周圍的雷數是壹個遞歸的過程。編譯時要註意遞歸的邊界條件。如果不重視,就會陷入無限遞歸,耗盡系統的資源。

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

Ongamebegin完成清除初始時間、隨機布雷、根據顏色指示加載12小位圖、調用ondraw重繪雷區的工作。隨機礦就是多次調用rand(),確定m_bomb[i][j]的值。is根據其返回值進行裝箱。

Ongamecustom首先彈出ccustomer對話框。當用戶輸入設置並響應idok通知代碼時,將用戶輸入的雷數和行數、列數分別賦給cview的數據成員m_ibombnum、m_irow和m_icolumn,得到框架窗口的指針,用它調用movewindow將窗口調整到需要的大小,破壞原位置的位圖按鈕,在X軸坐標1/2處的新窗口寬度減去8。最後調用ongamebegin重啟遊戲。

ongamejunior、ongamemiddle和ongamesenior三個函數與ongamecustom類似,只是賦給cview的數據成員m_ibombnum、m _ arrow和m_icolumn被賦予了固定值,它們的大小可以由程序員決定。作者把他們定義為初級(20,8,8)和中級(40,65438+。

ongamecolor函數破壞原有的位圖按鈕,根據重新加載位圖的標誌m_iscolor創建新的位圖按鈕,反轉加載12單色位圖的標誌,調用ongamebegin重新啟動遊戲。

ongamesort函數根據當前遊戲級別從註冊表中讀取排名,並彈出排序對話框顯示結果。到現在為止,自己編的壹個掃雷遊戲已經基本完成了。編譯幾百行代碼,找出小錯誤,最後重新構建運行。好了,壹個可愛的掃雷遊戲就會出現在妳面前。反正妳的作品也不比微軟差,還可以用各種方式畫小位圖,當然妳得自己認。

  • 上一篇:啟蒙童話
  • 下一篇:編程技能
  • copyright 2024編程學習大全網