基于C語言實現(xiàn)簡易的掃雷游戲
對于C語言學習者來說,在完成C語言初級學習之后,掃雷游戲是一個很好的知識的總結(jié)和練習。
掃雷即在一個棋盤中,隨機放入一定數(shù)量的雷,玩家通過輸入坐標,得到坐標上的信息(以此點為中心四周8個格子內(nèi)地雷數(shù)量的總和),來判斷此格子是否有地雷,從而依照此法排查出整個棋盤上所有的地雷。
本項目采用9*9的棋盤,放入地雷的數(shù)量可以依照個人設置。
首先聲明總的頭文件
#ifndef _UTILI_H_ #define _UTILI_H_ ? #include<stdio.h> #include<time.h> ? //后面需要地雷的隨機放置,需要時間函數(shù) ? #endif /* _UTILI_H_ */
接下來我們需要對整個項目所有需要用的函數(shù)進行聲明,放置在一個頭文件中:
#ifndef _GAME_H_ ?//條件編譯 #define _GAME_H_ ? #include"utili.h" ? #define QUIT 0 ? ?//0退出 1 進入游戲 #define GAME 1 ? #define ROW 9 ? ?//定義9*9的掃雷界面 #define COL 9 #define ROWS ROW+2 ?//左右兩邊加1行1列,為了統(tǒng)計周圍雷個數(shù) #define COLS COL+2 ? #define GAME_LEVEL 20 ? void InitBoard(char board[ROWS][COLS], char set); ? ?//設置界面 void DisplayBoard(char board[ROWS][COLS], int row, int col); ? //展示界面 ? void SetMine(char mine[ROWS][COLS], int row, int col); ? //設置雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); ?//找雷 ? void StartGame(); ? #endif /* _GAME_H_ */
整個游戲各個部分功能進行編寫代碼,分別實現(xiàn)不同的功能:
#include"Game.h" ? void InitBoard(char board[ROWS][COLS], char set) ? //初始化棋盤,在后臺執(zhí)行掃雷任務時 { ?? ?for(int i=0; i<ROWS; ++i) ? ? ? ? ? ? ? ? ?//實際上是在11 * 11 的棋盤 上進行的 ? ? ? ? ? ?? ?{ ?? ??? ?for(int j=0; j<COLS; ++j) ?? ??? ?{ ?? ??? ??? ?board[i][j] = set; ?? ??? ?} ?? ?} } ? void DisplayBoard(char board[ROWS][COLS], int row, int col) ? { ?? ?for(int i=0; i<=row; ++i) ? ?//在界面顯示時,我們的棋盤實際展示的時9 * 9的界面 ?? ?{ ?? ??? ?printf("%d ", i); ?? ?} ?? ?printf("\n"); ? ? ?? ?for(int i=1; i<=row; ++i) ?? ?{ ?? ??? ?printf("%d ", i); ?? ??? ?for(int j=1; j<=col; ++j) ?? ??? ?{ ?? ??? ??? ?printf("%c ", board[i][j]); ?? ??? ?} ?? ??? ?printf("\n"); ?? ?} } ? void SetMine(char mine[ROWS][COLS], int row, int col) { ?? ?int count = GAME_LEVEL; ?? ?srand(time(0)); ? ? ? ? ? ? //通過隨機數(shù)獲得棋盤上隨機的地雷放置 ?? ?while(count) ?? ?{ ?? ??? ?int x = rand() % row + 1; //1 ~ ROW ? ? //取余,保證放置在棋盤內(nèi) ?? ??? ?int y = rand() % col + 1; //1 ~ COL ?? ??? ?if(mine[x][y] == '0') ?? ??? ?{ ?? ??? ??? ?mine[x][y] = '1'; ? ? ? ? ? ? //有地雷的格子內(nèi)0被賦值為1,但注意這個1為字符 ?? ??? ??? ?count--; ?? ??? ?} ?? ?} } ? int GetMineCount(char mine[ROWS][COLS], int x, int y) ? //獲得以格子為中心周圍8個格子地雷數(shù) { ?? ?return mine[x-1][y-1] + mine[x-1][y] + mine[x-1][y+1] +? ?? ??? ? ? mine[x][y-1] + mine[x][y+1] +? ?? ??? ? ? mine[x+1][y-1] + mine[x+1][y] + mine[x+1][y+1] ?? ??? ? ? - (8*'0'); ? ?//將字符轉(zhuǎn)換為數(shù)字 } ? void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { ?? ?int win = 0; ?? ?int x, y; ?? ?while(win < row*col-GAME_LEVEL) ? //判斷贏的條件 ?? ?{ ?? ??? ?printf("請輸入要排雷的位置:>"); ?? ??? ?scanf("%d %d", &x, &y); ? ?? ??? ?if(x<1||x>row || y<1 || y>col) ?? ??? ?{ ?? ??? ??? ?printf("輸入的排雷位置非法,請重新輸入.....\n"); ?? ??? ??? ?continue; ?? ??? ?} ? ?? ??? ?if(mine[x][y] == '1') ?? ??? ?{ ?? ??? ??? ?printf("很遺憾,你被Over.\n"); ?? ??? ??? ?DisplayBoard(mine, ROW, COL); ?? ??? ??? ?break; ?? ??? ?} ? ?? ??? ?//統(tǒng)計雷的個數(shù) ?? ??? ?int count = GetMineCount(mine, x, y); ?? ??? ?show[x][y] = count + '0'; ? ?? ??? ?system("cls"); ?? ??? ?DisplayBoard(show, ROW, COL); ? ?? ??? ?win++; ?? ?} ? ?? ?if(win >= ?row*col-GAME_LEVEL) ?? ?{ ?? ??? ?printf("恭喜你,排雷成功.\n"); ?? ?} } ? void StartGame() { ?? ?//定義棋盤 ?? ?char mine[ROWS][COLS]; ?? ?char show[ROWS][COLS]; ? ?? ?//初始化棋盤 ?? ?InitBoard(mine, '0'); ?? ?InitBoard(show, '*'); ? ?? ?//埋雷 ?? ?SetMine(mine, ROW, COL); ? ?? ?//顯示棋盤 ?? ?DisplayBoard(show, ROW, COL); ? ?? ?//掃雷 ?? ?FindMine(mine, show, ROW, COL); }
編寫主函數(shù):
#include"Game.h" ? int main(int argc, char *argv[]) { ?? ?int select = 1; ?? ?while(select) ?? ?{ ?? ??? ?printf("*************************************\n"); ?? ??? ?printf("* ? ? ? ? ?簡 易 掃 雷 游 戲 ? ? ? ?*\n"); ?? ??? ?printf("*************************************\n"); ?? ??? ?printf("* ? ? ? ? ? ? [1] Play ? ? ? ? ? ? ?*\n"); ?? ??? ?printf("* ? ? ? ? ? ? [0] Quit ? ? ? ? ? ? ?*\n"); ?? ??? ?printf("*************************************\n"); ?? ??? ?printf("請選擇:>"); ?? ??? ?scanf("%d", &select); ? ?? ??? ?if(select == QUIT) ?? ??? ??? ?break; ? ?? ??? ?if(select != GAME) ?? ??? ?{ ?? ??? ??? ?printf("輸入的操作有誤,請重新輸入......\n"); ?? ??? ??? ?continue; ?? ??? ?} ? ?? ??? ?//開始游戲 ?? ??? ?StartGame(); ?? ?} ?? ?printf("游戲結(jié)束,拜拜.\n"); ?? ?return 0; }
代碼在VS2015上正常執(zhí)行,整個游戲過程沒出現(xiàn)問題。
游戲還可以有許多改進的地方,如增加計時功能,點到附件無雷的格子時展示所有相鄰的無雷格子等,后續(xù)還可以豐富完善。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C語言實現(xiàn)文件內(nèi)容按行隨機排列的算法示例
這篇文章主要介紹了C語言實現(xiàn)文件內(nèi)容按行隨機排列的算法,涉及C語言字符串、數(shù)組遍歷與隨機數(shù)相關算法實現(xiàn)技巧,需要的朋友可以參考下2017-09-09C++面試八股文之override和finial關鍵字有何作用
C++11中的override和final關鍵字是為了增強代碼的編譯時類型檢查和面向?qū)ο笤O計中的繼承機制,下面這篇文章主要給大家介紹了關于C++面試八股文之override和finial關鍵字有何作用的相關資料,需要的朋友可以參考下2023-06-06C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)
不論是哪種參數(shù)傳遞方式,都有形參和實參之分,本文主要介紹了C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞),具有一定的參考價值,感興趣的可以了解一下2024-03-03