C++ 情懷遊戲掃雷的實現流程詳解
掃雷最原始的版本可以追溯到1973年一款名為“方塊”的遊戲。 不久,“方塊”被改寫成瞭遊戲“Rlogic”。在“Rlogic”裡,玩傢的任務是作為美國海軍陸戰隊隊員,為指揮中心探出一條沒有地雷的安全路線,如果路全被地雷堵死就算輸。兩年後,湯姆·安德森在“Rlogic”的基礎上又編寫出瞭遊戲“地雷”,由此奠定瞭現代掃雷遊戲的雛形。 1981年,微軟公司的羅伯特·杜爾和卡特·約翰遜兩位工程師在Windows3.1系統上加載瞭該遊戲,掃雷遊戲才正式在全世界推廣開來。
這款遊戲的玩法是在一個9*9(初級),16*16(中級),16*30(高級),或自定義大小的方塊矩陣中隨機佈置一定量的地雷(初級為10個,中級為40個,高級為99個)。由玩傢逐個翻開方塊,以找出所有地雷為最終遊戲目標。如果玩傢翻開的方塊有地雷,則遊戲結束。
我們今天就來自己寫《掃雷》 這個項目並不是很難,今天就和大傢從頭到尾詳細的講一遍,大傢一定要好好看好好學!
行吧,開始瞭
我們今天用的是Cpp來寫,但不是用Windows來創建窗口,而是用他的遠房表親EasyX圖形庫來創建窗口,因為用圖形庫會簡單很多,剛學C的也可以聽懂,而且C/C++不分傢,沒有什麼問題,OK,我們現在開始寫代碼,今天我就把頭文件也分享出來瞭,主要是教大傢如何去調用圖形庫。(註:沒有EasyX圖形庫的可以去官網下載,也可以進群直接下載) 首先是我們的頭文件以及一些宏定義
#include<stdio.h> #include<graphics.h>//包含圖形庫頭文件 #define ROW 9 //行 #define COL 9 //列 共81個格子 #define MINE_NUM 18//雷的數量 #define IMG_SIZE 40
初始化函數,也是我們的老朋友瞭
void GameInit() { //1,創建窗口 一行有九張圖片每張圖片40px, initgraph(IMG_SIZE*ROW, IMG_SIZE*COL,SHOWCONSOLE); //加載圖片(賦值) load加載 第一個參數,存儲圖片的變量 錯誤:字符集問題 for (int i = 0; i < 12; i++) { char file[20] = ""; sprintf(file, "./image/%d.jpg", i); loadimage(&img[i], file, IMG_SIZE, IMG_SIZE); } //佈雷 for (int i = 0; i < MINE_NUM; ) { //排除輔助區 int row = rand() % ROW+1;//0-8 1-9 int col = rand() % COL+1; if (mine[row][col] == 0) { mine[row][col] = 9; i++; } } //雷所在的九宮格,要加1(雷除外) for (int i = 1; i < ROW+1; i++) { for (int k = 1; k < COL+1; k++) { if (mine[i][k] == 9) { //遍歷雷的九宮格 細心 for (int a = i - 1; a <= i + 1; a++) { for (int b = k - 1; b <= k + 1; b++) { //非雷的格子加1 if (mine[a][b] != 9) { mine[a][b]++; } } } } } } //加密 開始時全部為掩碼圖 for (int i = 1; i < ROW + 1; i++) { for (int k = 1; k < COL + 1; k++) { mine[i][k] += 20; } } }
鼠標信息處理函數
void MouseEvent() { //檢測是否有鼠標消息 if (MouseHit()) { //獲取鼠標消息,坐標,左鍵還是右鍵 MOUSEMSG msg = GetMouseMsg(); //把坐標轉化成數組下標 openr = msg.y / IMG_SIZE+1; openc = msg.x / IMG_SIZE+1; //判斷是左鍵還是右鍵 switch (msg.uMsg) { case WM_LBUTTONDOWN: //如果格子沒有打開,就打開格子,否則不做處理 if (mine[openr][openc] > 9) { mine[openr][openc] -= 20; OpenNull(openr,openc); num++; } break; case WM_RBUTTONDOWN: //標記 if (mine[openr][openc] > 9 && mine[openr][openc] <= 29) { mine[openr][openc] += 20; } else { mine[openr][openc] -= 20; } break; } } }
進行遞歸操作,判斷鼠標點擊的地方
//遞歸打開所有空白,以及空白周圍的數字 void OpenNull(int row,int col) { //點擊的是空白才能打開 if (mine[row][col] == 0) { for (int i = row - 1; i <= row + 1; i++) { for (size_t k = col-1; k <= col+1; k++) { //如果為空或者不是雷就打開 if ((mine[i][k] == 20 || mine[i][k] != 29)&& mine[i][k]>9) { mine[i][k] -= 20; num++; OpenNull(i, k); } } } } }
遊戲的輸贏判斷函數,註意理清邏輯
void Jude() { //判斷輸 if (mine[openr][openc] == 9) { int isok = MessageBox(GetHWnd(), "是否繼續!", "點到雷瞭", MB_OKCANCEL); if (isok == IDOK) { mine[openr][openc] += 20; } else { exit(666); } } //判斷贏 if (num == ROW*COL - MINE_NUM) { int isok = MessageBox(GetHWnd(), "是否繼續!", "點到雷瞭", MB_OKCANCEL); if (isok == IDOK) { num = 0; GameInit(); } else { exit(666); } } }
最後就是我們的主函數瞭
int main() { GameInit(); show(); //循環處理遊戲邏輯 while (1) { MouseEvent(); GameDraw(); Jude(); } getchar(); return 0; }
經典遊戲《掃雷》完成,OK,簡單總結一下,代碼很簡單,邏輯也不難,重要是大傢一定要自己動手去做,這是毋庸置疑的,編程沒有捷徑,隻有不斷的學習熟練,加強自己的能力,有條件的話找個老師的話效果會更好,我也特意找瞭一個朋友叫他把一些關於《掃雷》的教學視頻發給我,大傢可以去我的主頁上查看,我也希望下面的視頻可以更好的幫助同學們掌握這個項目,好瞭,希望大傢可以在這裡得到自己想要的知識以及快樂吧,也希望大傢可以給UP主一個關註,非常感謝大傢瞭!!!
點擊下方鏈接觀看詳細視頻講解
C/C++遊戲《掃雷》詳細教程
https://www.bilibili.com/video/BV1oF411a7MQ/
到此這篇關於C++ 情懷遊戲掃雷的實現流程詳解的文章就介紹到這瞭,更多相關C語言 掃雷內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!