前言:
《掃雷》是一款大眾類的益智小遊戲, 于1992年發行。 遊戲目標是在最短的時間內根據點擊格子出現的數字找出所有非雷格子, 同時避免踩雷, 踩到一個雷即全盤皆輸。 掃雷在科技歷史上也扮演了相似的角色。 這個基於數位的邏輯謎題最早來自20實際六七十年代, 當時候Jerimac Ratliff推出的名為“Cube”的遊戲已經非常受人歡迎。 幾十年後的1992年, 掃雷遊戲被加入了Windows3.1, 這並不是為了展示Windows是遊戲作業系統專家, 而是為了訓練使用者的滑鼠左右鍵操作能力, 讓這些動作變得非常自然, 並培養滑鼠移動的速度和準確性。
遊戲效果:
系統學習歡迎長久駐足哦. 8群 491994603
相關素材:
系統學習歡迎長久駐足哦. 8群 491994603
源碼分享:
#include
#include
#include
#define N 10//大小 N*N
#define M 50//圖片 圖元點
void game();
void draw(int map[][N + 2], IMAGE *img);//畫圖
int play(int map[][N + 2],int *pwin);//滑鼠點擊
void loadingplay(int x, int y, int map[][N + 2],int *pwin);//遞迴函數
int main()
{
game();
closegraph();
//getchar();
return 0;
}
void game()
{
while (1)
{
initgraph(N*M, N*M);
HWND hWnd = GetHWnd();
IMAGE img[12];
loadimage(&img[0], L"0.jpg", M, M);
loadimage(&img[1], L"1.jpg", M, M);
loadimage(&img[2], L"2.jpg", M, M);
loadimage(&img[3], L"3.jpg", M, M);
loadimage(&img[4], L"4.jpg", M, M);
loadimage(&img[5], L"5.jpg", M, M);
loadimage(&img[6], L"6.jpg", M, M);
loadimage(&img[7], L"7.jpg", M, M);
loadimage(&img[8], L"8.jpg", M, M);
loadimage(&img[9], L"空.jpg", M, M);
loadimage(&img[10], L"雷.jpg", M, M);
loadimage(&img[11], L"標記.jpg", M, M);
//loadimage(&img[9], L"0.jpg", M, M);
int map[N + 2][N + 2] = { 0 };
//用-1標記雷
srand((unsigned)time(NULL));//生成亂數種子 time.h
int x, y;
//int num = rand() % (N*N);
for (int n = 0; n < N;)
{
x = rand() % N + 1;//獲取1~10
y = rand() % N + 1;
if (map[x][y] == 0)
{
map[x][y] = -1;//埋下一顆雷
n++;
}
}
int win = N*N - N;
int *pwin = &win;
//初步掃描過程 對於一個不為雷的元素 掃描周圍的區域
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
//掃描整個陣列
if (map[i][j] != -1)
{
//不用迴圈 判斷周圍8個元素 一個個判斷
//迴圈判斷周圍9個元素的雷
for (x = i - 1; x <= i + 1; x++)
{
for (y = j - 1; y <= j + 1; y++)
{
if (map[x][y] == -1)
{
//掃描到一個雷
map[i][j]++;
}
}
}
}
}
}
int playgame;
while (1)//遊戲過程
{
//畫圖
draw(map, img);
//滑鼠點擊
//輸贏判斷
if (play(map, pwin) == -1)//用指標修改win也可以
{
//踩到雷就輸了
draw(map, img);
playgame = -1;
//MessageBox(hWnd, L"你輸了", L"Lose", MB_OKCANCEL);
break;
}
if (win == 0)
{
//贏了
draw(map, img);
playgame = 1;
//MessageBox(hWnd, L"你贏了", L"Win", MB_OKCANCEL);
break;
}
}
if (playgame == 1)
{
if (MessageBox(hWnd, L"按下確定重玩", L"Win", MB_OKCANCEL) != IDOK)
//continue;
break;
}
else
if (MessageBox(hWnd, L"按下確定重玩", L"Lose", MB_OKCANCEL) != IDOK)
break;
}
}
void loadingplay(int x, int y, int map[][N + 2], int *pwin)//遞迴函數
{
map[x][y] += 10;
(*pwin)--;
//傳遞為0的座標
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
if (i <= 0 || i >= 11 || j <= 0 || j >= 11) continue;//判斷是否越界
if (map[i][j] <= 8)//沒有翻開
{
if (map[i][j] == 0) //執行遞迴
{
loadingplay(i, j, map,pwin);
}
else if(map[i][j] != -1)
{
map[i][j] += 10;
(*pwin)--;
}
}
}
}
}
int play(int map[][N + 2],int *pwin)
{
MOUSEMSG msg;
while (1)
{
msg = GetMouseMsg();
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
if (map[msg.x / M + 1][msg.y / M + 1] == 0)
{
//翻開一片
//函式呼叫 遞迴
//什麼情況下遞迴 遞迴結束
//遞迴功能
//翻開0周圍一片 ->分割小塊
//翻開0 ->翻開周圍9個(算自己)
loadingplay(msg.x / M + 1, msg.y / M + 1, map, pwin);
}
else if (map[msg.x / M + 1][msg.y / M + 1] <= 8)
{
map[msg.x / M + 1][msg.y / M + 1] += 10;//翻開過程
(*pwin)--;
}
else continue;
if (map[msg.x / M + 1][msg.y / M + 1] == 9) return -1;//翻開一個雷
else return 0;
break;
//return goto exit 直接退出程式
}
}
}
void draw(int map[][N + 2], IMAGE *img)
{
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
switch (map[i][j])
{
//獲取點擊加10
//-1~8 貼空 9~18貼數字圖
case 9:putimage((i - 1)*M, (j - 1)*M, &img[10]); break;//雷
case 10:putimage((i - 1)*M, (j - 1)*M, &img[0]); break;
case 11:putimage((i - 1)*M, (j - 1)*M, &img[1]); break;
case 12:putimage((i - 1)*M, (j - 1)*M, &img[2]); break;
case 13:putimage((i - 1)*M, (j - 1)*M, &img[3]); break;
case 14:putimage((i - 1)*M, (j - 1)*M, &img[4]); break;
case 15:putimage((i - 1)*M, (j - 1)*M, &img[5]); break;
case 16:putimage((i - 1)*M, (j - 1)*M, &img[6]); break;
case 17:putimage((i - 1)*M, (j - 1)*M, &img[7]); break;
case 18:putimage((i - 1)*M, (j - 1)*M, &img[8]); break;
default:putimage((i - 1)*M, (j - 1)*M, &img[9]); break;//空
}
}
}
}
今天分享就到這裡結束了,系統學習歡迎長久駐足哦. 8群 491994603.對C/C++瞭解, 而不只是單單的在課本中學到的那些理論, 平時乏味的課程, 通過自己動手親自編寫, 變的生動有趣.
最後在程式設計的路上還有很多東西要學, 感謝老師的教育, 和一直以來一起學習的同學。 讓我們時刻保持一個對於知識的好奇心。