C語言實現掃雷遊戲源代碼
本文實例為大傢分享瞭C語言實現掃雷遊戲的具體代碼,供大傢參考,具體內容如下
此次掃雷中我們以9乘以9的表格為例,後期可自動調動
主要思路:建立兩個11乘以11的表格,分別為佈雷和排雷後的表格,其中我們以字符1表示此處有雷,字符0表示此處無雷,在佈雷時我們用時間函數佈置隨機的10個雷(具體多少個雷可自行選擇),在另一個表格中顯示出所選位置周圍雷的個數
建立11*11的表格是因為便於統計四條邊上位置周圍含雷的個數
用vs建立頭文件game.n和兩個源文件game.c和test.c
(先分開講解,在文章最後有三個文件的整體顯示)
在頭文件中的聲明有
#include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY 10
time.h和stdlib.h 文件是time.h的庫函數
ROW表示行,COL表示列,ROWS表示11列,COLS表示11行,EASY表示(簡單程度)雷有10個
首先在test.c文件中建立主函數
int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: game();//實現遊戲的過程 break; case 0: printf("退出遊戲\n"); break; default: printf("選擇錯誤,請重新選擇\n"); break; } } while (input); return 0; }
其中 srand((unsigned int)time(NULL)) 是為瞭能夠在使用rand函數時每次產生不同的隨機數
其中包含兩個函數,分別為菜單函數menu()和實現遊戲的函數game()
菜單函數為
void menu() { printf("************************\n"); printf("***** 1.play *********\n"); printf("***** 0.exit *********\n"); printf("************************\n"); }
主函數中整形input為輸入的數字,1進行遊戲,0退出遊戲
進行的遊戲函數為
void game() { //創建棋盤對應的數組 char mine[ROWS][COLS];//佈置好的雷的信息 char show[ROWS][COLS];//排查出雷的信息 //初始化棋盤 initboard(mine, ROWS, COLS, '0'); initboard(show, ROWS, COLS, '*'); //打印棋盤 //displayboard(mine, ROW, COL); displayboard(show, ROW, COL); //佈置雷 setmine(mine, ROW, COL, EASY); //displayboard(mine, ROW, COL); //排雷 finemine(mine, show, ROW, COL); }
1、創建棋盤
在遊戲函數中我們首先創建兩個11乘以11的棋盤,佈置雷的棋盤為mine[ROWS][COLS],在玩傢面前顯示的棋盤為show[ROWS][COLS]
2、初始化棋盤
在佈置雷的棋盤中全部填寫字符0,在玩傢顯示的棋盤面前全部填寫為字符*,
頭文件中聲明
//初始化棋盤 void initboard(char board[ROWS][COLS], int rows, int cols,char set);
game.c中具體寫出函數
void initboard(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0, j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } }
3、打印棋盤
頭文件聲明
//打印棋盤 void displayboard(char board[ROWS][COLS], int row, int col);
game.c中具體寫出函數
//打印棋盤 void displayboard(char board[ROWS][COLS], int row, int col) { int i = 0, j = 0; printf("-----------掃雷遊戲-------------\n"); for (i = 0; i <= col; i++) printf("%d ", i); printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } printf("-----------掃雷遊戲-------------\n"); }
4、佈置雷
將mine函數佈置出雷
頭文件
//佈置雷 void setmine(char mine[ROWS][COLS], int row, int col, int count);
count為計數器,計算佈置雷的個數,初始值為EASY,在頭文件中設置為10
game.c中的函數
//佈置雷 void setmine(char mine[ROWS][COLS], int row, int col, int count) { while (count) { int x = rand() % row + 1; //模9為0到8 int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } }
rand函數產生隨機數,模上row(9)後的數為0到8,加上1為1到9的數,棋盤本為11*11,但我們填充雷在1~9行,1到9列
5、排雷並且在玩傢面前顯示出棋盤
頭文件
//排雷 void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c中的函數
//統計x,y坐標周圍雷的個數 int getmine(char mine[ROWS][COLS], int x, int y) { 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'; } //排雷+打印排雷後的棋盤 void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int win = 0; while (win<ROW*COL-EASY) { printf("請輸入要排查雷的坐標:>"); int x, y; scanf("%d%d", &x, &y); //坐標合法性 //坐標是不是雷,不是雷,統計周圍雷的個數 if (x >= 1 && x <= row&&y >= 1 &&y <= col) { if (mine[x][y]=='1') { printf("很遺憾,你被炸死瞭\n"); displayboard(mine, row, col); break; } else { //坐標不是雷,統計雷的個數 int count = getmine(mine, x, y); show[x][y] = count+'0';//數字加上字符0為字符數字,轉化為字符數字,因為打印的為字符 displayboard(show, row, col); //打印排雷後的棋盤 win++; } } else { printf("坐標非法,重新輸入!\n"); } } if (win == ROW*COL - EASY) { printf("恭喜你,排雷成功\n"); displayboard(mine, row, col); } }
win為已排查出非雷的個數
判斷非雷位置周圍8個位置有雷的個數隻需要將周圍8個位置中的字符相加再減去8個0的ascll值,因為8個位置中有雷的位置即為字符1,將8個位置的字符相加轉化為實際的數字,即為雷的個數,當排除出的非雷的個數為ROWSCOLS-EASY(99-10)時,即掃雷成功
game.h中完整文件為
#include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY 10 //初始化棋盤 void initboard(char board[ROWS][COLS], int rows, int cols,char set); //打印棋盤 void displayboard(char board[ROWS][COLS], int row, int col); //佈置雷 void setmine(char mine[ROWS][COLS], int row, int col, int count); //排雷 void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c中完整文件為
#define _CRT_SECURE_NO_WARNINGS #include"game.h" //初始化棋盤 void initboard(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0, j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = set; } } } //打印棋盤 void displayboard(char board[ROWS][COLS], int row, int col) { int i = 0, j = 0; printf("-----------掃雷遊戲-------------\n"); for (i = 0; i <= col; i++) printf("%d ", i); printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } printf("-----------掃雷遊戲-------------\n"); } //佈置雷 void setmine(char mine[ROWS][COLS], int row, int col, int count) { while (count) { int x = rand() % row + 1; //模9為0到8 int y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } //統計x,y坐標周圍雷的個數 int getmine(char mine[ROWS][COLS], int x, int y) { 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'; } //排雷+打印排雷後的棋盤 void finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int win = 0; while (win<ROW*COL-EASY) { printf("請輸入要排查雷的坐標:>"); int x, y; scanf("%d%d", &x, &y); //坐標合法性 //坐標是不是雷,不是雷,統計周圍雷的個數 if (x >= 1 && x <= row&&y >= 1 &&y <= col) { if (mine[x][y]=='1') { printf("很遺憾,你被炸死瞭\n"); displayboard(mine, row, col); break; } else { //坐標不是雷,統計雷的個數 int count = getmine(mine, x, y); show[x][y] = count+'0';//數字加上字符0為字符數字,轉化為字符數字,因為打印的為字符 displayboard(show, row, col); //打印排雷後的棋盤 win++; } } else { printf("坐標非法,重新輸入!\n"); } } if (win == ROW*COL - EASY) { printf("恭喜你,排雷成功\n"); displayboard(mine, row, col); } }
test.c完整文件為
#define _CRT_SECURE_NO_WARNINGS #include "game.h" void menu() { printf("************************\n"); printf("***** 1.play *********\n"); printf("***** 0.exit *********\n"); printf("************************\n"); } void game() { //創建棋盤對應的數組 char mine[ROWS][COLS];//佈置好的雷的信息 char show[ROWS][COLS];//排查出雷的信息 //初始化棋盤 initboard(mine, ROWS, COLS, '0'); initboard(show, ROWS, COLS, '*'); //打印棋盤 //displayboard(mine, ROW, COL); displayboard(show, ROW, COL); //佈置雷 setmine(mine, ROW, COL, EASY); //displayboard(mine, ROW, COL); //排雷 finemine(mine, show, ROW, COL); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: game();//實現遊戲的過程 break; case 0: printf("退出遊戲\n"); break; default: printf("選擇錯誤,請重新選擇\n"); break; } } while (input); return 0; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。