C++ 情懷游戲掃雷的實現(xiàn)流程詳解
掃雷最原始的版本可以追溯到1973年一款名為“方塊”的游戲。 不久,“方塊”被改寫成了游戲“Rlogic”。在“Rlogic”里,玩家的任務是作為美國海軍陸戰(zhàn)隊隊員,為指揮中心探出一條沒有地雷的安全路線,如果路全被地雷堵死就算輸。兩年后,湯姆·安德森在“Rlogic”的基礎上又編寫出了游戲“地雷”,由此奠定了現(xiàn)代掃雷游戲的雛形。 1981年,微軟公司的羅伯特·杜爾和卡特·約翰遜兩位工程師在Windows3.1系統(tǒng)上加載了該游戲,掃雷游戲才正式在全世界推廣開來。

這款游戲的玩法是在一個9*9(初級),16*16(中級),16*30(高級),或自定義大小的方塊矩陣中隨機布置一定量的地雷(初級為10個,中級為40個,高級為99個)。由玩家逐個翻開方塊,以找出所有地雷為最終游戲目標。如果玩家翻開的方塊有地雷,則游戲結束。
我們今天就來自己寫《掃雷》 這個項目并不是很難,今天就和大家從頭到尾詳細的講一遍,大家一定要好好看好好學!
行吧,開始了
我們今天用的是Cpp來寫,但不是用Windows來創(chuàng)建窗口,而是用他的遠房表親EasyX圖形庫來創(chuàng)建窗口,因為用圖形庫會簡單很多,剛學C的也可以聽懂,而且C/C++不分家,沒有什么問題,OK,我們現(xiàn)在開始寫代碼,今天我就把頭文件也分享出來了,主要是教大家如何去調用圖形庫。(注:沒有EasyX圖形庫的可以去官網(wǎng)下載,也可以進群直接下載) 首先是我們的頭文件以及一些宏定義
#include<stdio.h> #include<graphics.h>//包含圖形庫頭文件 #define ROW 9 //行 #define COL 9 //列 共81個格子 #define MINE_NUM 18//雷的數(shù)量 #define IMG_SIZE 40
初始化函數(shù),也是我們的老朋友了
void GameInit()
{
//1,創(chuàng)建窗口 一行有九張圖片每張圖片40px,
initgraph(IMG_SIZE*ROW, IMG_SIZE*COL,SHOWCONSOLE);
//加載圖片(賦值) load加載 第一個參數(shù),存儲圖片的變量 錯誤:字符集問題
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; )
{
//排除輔助區(qū)
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;
}
}
}
鼠標信息處理函數(shù)
void MouseEvent()
{
//檢測是否有鼠標消息
if (MouseHit())
{
//獲取鼠標消息,坐標,左鍵還是右鍵
MOUSEMSG msg = GetMouseMsg();
//把坐標轉化成數(shù)組下標
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;
}
}
}
進行遞歸操作,判斷鼠標點擊的地方
//遞歸打開所有空白,以及空白周圍的數(shù)字
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);
}
}
}
}
}
游戲的輸贏判斷函數(shù),注意理清邏輯
void Jude()
{
//判斷輸
if (mine[openr][openc] == 9)
{
int isok = MessageBox(GetHWnd(), "是否繼續(xù)!", "點到雷了", MB_OKCANCEL);
if (isok == IDOK)
{
mine[openr][openc] += 20;
}
else
{
exit(666);
}
}
//判斷贏
if (num == ROW*COL - MINE_NUM)
{
int isok = MessageBox(GetHWnd(), "是否繼續(xù)!", "點到雷了", MB_OKCANCEL);
if (isok == IDOK)
{
num = 0;
GameInit();
}
else
{
exit(666);
}
}
}
最后就是我們的主函數(shù)了
int main()
{
GameInit();
show();
//循環(huán)處理游戲邏輯
while (1)
{
MouseEvent();
GameDraw();
Jude();
}
getchar();
return 0;
}
經(jīng)典游戲《掃雷》完成,OK,簡單總結一下,代碼很簡單,邏輯也不難,重要是大家一定要自己動手去做,這是毋庸置疑的,編程沒有捷徑,只有不斷的學習熟練,加強自己的能力,有條件的話找個老師的話效果會更好,我也特意找了一個朋友叫他把一些關于《掃雷》的教學視頻發(fā)給我,大家可以去我的主頁上查看,我也希望下面的視頻可以更好的幫助同學們掌握這個項目,好了,希望大家可以在這里得到自己想要的知識以及快樂吧,也希望大家可以給UP主一個關注,非常感謝大家了?。?!

點擊下方鏈接觀看詳細視頻講解
C/C++游戲《掃雷》詳細教程
https://www.bilibili.com/video/BV1oF411a7MQ/
到此這篇關于C++ 情懷游戲掃雷的實現(xiàn)流程詳解的文章就介紹到這了,更多相關C語言 掃雷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于C++語言實現(xiàn)機動車違章處罰管理系統(tǒng)
這篇文章主要介紹了基于C++語言實現(xiàn)機動車違章處罰管理系統(tǒng)的相關資料,需要的朋友可以參考下2016-07-07
C++中getline()、gets()等函數(shù)的用法詳解
這篇文章主要介紹了C++中getline()、gets()等函數(shù)的用法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02

