這是一篇遲到了乙個月的掃雷部落格.
掃雷這個遊戲要實現並不會很困難,我們來整理一下完整的思路:
1.搭建棋盤:
圖中用藍色部分畫出來的是我們進行遊戲要使用的棋盤,周圍一圈紅色的是我們在實現關鍵功能時做的保險,這個功能會在後面提到.
我們的遊戲選擇99的棋盤,那麼在建立時就要建立乙個(9+2)(9+2)即1111的二維陣列棋盤.這裡定義四個巨集來分別表示外棋盤和遊戲棋盤.
2.棋盤初始化:掃雷遊戲每進行一步棋盤都會產生更新,周圍雷的個數,有無雷.為了清晰的表示這個功能,我們分別初始化兩個棋盤,乙個是放置地雷的雷盤,乙個是展示資訊的展示盤.
雷盤在初始化時我們要注意,要將外棋盤整個進行初始化,這樣在我們我們判斷遊戲盤每條邊和每個角上的棋子周圍是否有雷時不會發生越界.那麼我們規定』0』為不是雷,『1』是地雷,初始化過程先將外棋盤全部初始化為』0』,然後再在遊戲棋盤當中隨機置雷.
展示盤在初始化的時候,所有格仔都沒有被翻開,所以我們將所有格仔都初始化為』*』,來表示沒有被翻開過的每乙個格仔.
3.列印棋盤:遊戲當中我們看到的就是展示棋盤,雷盤列印了遊戲就沒法玩了,同樣的我們在除錯過程當中可以列印出雷盤來輔助除錯.為了方便座標輸入操作,我們將棋盤座標設定為1,1到9,9.
4.讀取使用者輸入,這一步一定要記得座標非法性判定,越界的座標統統都是錯誤的座標!
5.翻開格仔判定遊戲是否結束,這裡是乙個迴圈
若翻開的格仔是雷,則遊戲直接結束.若翻開的格仔不是雷,進入掃雷最帥的功能!
判斷周圍八個格仔有沒有雷,如果有雷則更新雷的數目,若沒有雷則向外擴張繼續判斷,有雷的時候停下來,這個無比帥氣的功能用遞迴實現,真的不太容易理解.
6.迴圈輸入座標迴圈判斷遊戲是否結束
遊戲功能實現以後加入了一些修飾來調整遊戲邏輯和介面.
**實現:
#include
#include
#include
#include
//建立兩個二維陣列來表示地圖
//(1). show_map 表示給玩家展示的內容(數字表示翻開,表示未翻開)
//(2). mine_map 表示地雷的布局(0不是地雷,!是地雷)
#define max_row 9
#define max_col 9
#define max_rows 11
#define max_cols 11
#define mine_count 10
void
init
(char show_map[max_rows]
[max_cols]
,char mine_map[max_rows]
[max_cols])}
//2.對於mine_map來說,先初始化全為0,在隨機生成若干個地雷
for(
int row =
0; row <= max_rows;
++row)
}int count = mine_count;
while
(count!=0)
mine_map[row]
[col]
='1'
;--count;}}
void
printmap
(char map[max_rows]
[max_cols]
)printf
("\n");
//2.列印一排分割線
printf
("----------------------------\n");
for(
int row =
1; row<= max_row;
++row)
printf
("\n");
}}void
getpos
(char show_map[max_rows]
[max_cols]
,int
*row,
int*col)
if(show_map[
*row]
[*col]
!='*'
)break;}
}//判定當前位置周圍雷的數目
intcal_mine
(char mine_map[max_rows]
[max_cols]
,int row,
int col)
void
expand
(char mine_map[max_cols]
[max_cols]
,char show_map[max_rows]
[max_cols]
,int row,
int col)
if(show_map[row -1]
[col]
=='*')if
(show_map[row -1]
[col +1]
=='*')if
(show_map[row]
[col -1]
=='*')if
(show_map[row]
[col +1]
=='*')if
(show_map[row +1]
[col -1]
=='*')if
(show_map[row +1]
[col]
=='*')if
(show_map[row +1]
[col +1]
=='*')}
else}}
}void
game()
else
int safe_count =0;
for(
int row =
1; row <= max_row;
++row)}}
if(safe_count == mine_count)
//判斷期盼中'*'的個數,如果等於地雷數則判定遊戲獲勝
// 5.迴圈進行 2,while迴圈}}
intmain()
}while
(num)
;game()
;return0;
}
C語言 掃雷
做乙個掃雷的遊戲,首先分析一下掃雷需要實現的功能 1.選擇乙個位置,如果該位置是雷則結束遊戲,並顯示所有雷的位置。如果不是雷則顯示該位置周圍雷的數量。2.如果周圍沒有雷,則該位置顯示空,並且周圍如果也為空則一併展開。3.第一次選擇時必定不是雷 4.當盤上剩餘的位置只有雷了,則遊戲也結束,並且玩家勝利...
C語言掃雷
大家想必都玩過掃雷,無論那個版本都有難度供已選擇,下面來分享乙個自己用c語言編寫的掃雷遊戲吧!編寫語言 c語言 編寫軟體 visual studio 2017 1.首先是將遊戲的測試模組寫好,要有提示玩家進入的選單函式以及選擇函式等各種需要編寫的函式想出乙個整體框架來 測試模組test。c incl...
掃雷(C語言)
1 第一次下子,不炸死。2 座標周圍沒雷,可以實現展開。標頭檔案 mine.h ifndef mine h define mine h include include include include define row 12 define col 12 define mine 20 void me...