掃雷最原始的版本可以追溯到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主一個關注,非常感謝大家了!!!
后續UP主還會發布更多的專案原始碼以及學習資料,希望大家可以持續關注,有什么問題可以回帖留言,我盡量回答,想要C/C++學習資料以及其他專案的原始碼的可以加群【1083227756】了解,想要對程式員的未來發展有興趣的也可加群閑聊,也可以關注微信公眾號:【狐貍的編碼時光】,希望和大家一起學習進步!!!
點擊下方鏈接進群更快拿到學習資料以及專案素材
進群領取學習資料以及專案原始碼素材包https://jq.qq.com/?_wv=1027&k=sttR3REF
https://jq.qq.com/?_wv=1027&k=sttR3REF
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356058.html
標籤:其他

