第一步先将菜单以及选项给呈现出来
使用do....while来实现选项,因为只需要执行此选项即可,因此设置返回值为void
#include<stdio.h> static void menu() { printf("****************\n"); printf("***1.开始游戏***\n"); printf("***0.退出游戏***\n"); printf("****************\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:"); int i = scanf("%d", &input); switch (input) { case 1: game(); //这个game函数实现整个游戏的运作 case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }此时实现game这个函数,因为只需要它执行,不需要返回类型,同理设置为void
static void game() { char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); SetMine(mine, ROW, COL);//埋雷 //DisplayBoard(mine, ROW, COL); DisplayBoard(show, ROW, COL);//打印棋盘 FindMine(mine, show, ROW, COL); }逐条分析
这两条是创键棋盘,一个用来安置,一个用来查看
char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 };这两条是用来初始化棋盘
InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*');这是InitBoard函数的实现
第一条是初始化棋盘,在此棋盘内埋雷,第二条则是隐藏棋盘,来猜雷在哪里
void InitBoard(char board[ROWS][COLS], int r, int c, char set)//初始化棋盘 { int i = 0; for (i = 0; i < r; i++) { int j = 0; for (j = 0; j < c; j++) { board[i][j] = set; } } }定义棋盘的大小
#define ROW 9 #define COL 9当排雷时,会不可避免的越界,因此可以再加上一圈棋盘来防止越界
#define ROWS ROW+2 #define COLS COL+2设置雷的个数
#define EASY_COUNT 10埋雷
SetMine(mine, ROW, COL);//埋雷实现如下
void SetMine(char mine[ROWS][COLS], int r, int c)//埋雷 { int count = EASY_COUNT; while (count) { int x = rand() % r + 1;//将x的值限定在9之内 int y = rand() % c + 1;//将y的值限定在9之内 if (mine[x][y] == '0')//如果值为'0',就将其设置为“雷” { mine[x][y] = '1';//如果值为'1',“雷”的个数减去一个 count--; } } }srand((unsigned int)time(NULL));这条主要使rand函数生成的为随机值,包含的“time”就是一个一直在改变的值,从而可实现随机的效果
此函数用来排查雷
int GetMineCount(char mine[ROWS][COLS], int x, int y)实现如下
int GetMineCount(char mine[ROWS][COLS], int x, int y)//判断每个坐标周围雷的个数 { int i = 0; int j = 0; int c = 0; for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { if (mine[x + i][y + j] == '1') c++; } } return c; }以下为找雷的代码
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int r, int c)//找雷 { int x = 0; int y = 0; int win = 0; while (win<r*c-EASY_COUNT) { int f= scanf("%d %d", &x, &y); if (x >= 1 && x <= r && y >= 1 && y <= c) { if (mine[x][y] == '1') { printf("很遗憾,游戏结束\n"); DisplayBoard(mine, r, c); break; } else { if (show[x][y] == '*') { int c = GetMineCount(mine, x, y); show[x][y] = c + '0'; DisplayBoard(show, ROW, COL); win++; } else { printf("该坐标已经被排查过,请重新输入坐标\n"); } } } else { printf("输入的坐标非法,请重新输入\n"); } } if (win==r*c-EASY_COUNT) { printf("排雷成功\n"); DisplayBoard(mine, ROW, COL); } }完整代码实现如下
game.h
#include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS COL+2 #define EASY_COUNT 10 void InitBoard(char board[ROWS][COLS], int r, int c, char set); void DisplayBoard(char board[ROWS][COLS], int r, int c); void SetMine(char mine[ROWS][COLS], int r, int c); void FindMine(char mine[ROWS][COLSgame.c
//函数定义 #define _CRT_SECURE_NO_WARNINGS #include"game.h" void InitBoard(char board[ROWS][COLS], int r, int c, char set)//初始化棋盘 { int i = 0; for (i = 0; i < r; i++) { int j = 0; for (j = 0; j < c; j++) { board[i][j] = set; } } } void DisplayBoard(char board[ROWS][COLS], int r, int c)//打印棋盘 { int i = 0; printf("----扫雷----\n"); for (i = 0; i <= c; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= r; i++) { int j = 0; printf("%d ", i); for (j = 1; j <= c; j++) { printf("%c ", board[i][j]); } printf("\n"); } } void SetMine(char mine[ROWS][COLS], int r, int c)//埋雷 { int count = EASY_COUNT; while (count) { int x = rand() % r + 1; int y = rand() % c + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } static int GetMineCount(char mine[ROWS][COLS], int x, int y)//判断每个坐标周围雷的个数 { int i = 0; int j = 0; int c = 0; for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { if (mine[x + i][y + j] == '1') c++; } } return c; } void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int r, int c)//找雷 { int x = 0; int y = 0; int win = 0; while (win<r*c-EASY_COUNT) { int f= scanf("%d %d", &x, &y); if (x >= 1 && x <= r && y >= 1 && y <= c) { if (mine[x][y] == '1') { printf("很遗憾,游戏结束\n"); DisplayBoard(mine, r, c); break; } else { if (show[x][y] == '*') { int c = GetMineCount(mine, x, y); show[x][y] = c + '0'; DisplayBoard(show, ROW, COL); win++; } else { printf("该坐标已经被排查过,请重新输入坐标\n"); } } } else { printf("输入的坐标非法,请重新输入\n"); } } if (win==r*c-EASY_COUNT) { printf("排雷成功\n"); DisplayBoard(mine, ROW, COL); } }text.h
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include"game.h" static void game() { char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); SetMine(mine, ROW, COL);//埋雷 //DisplayBoard(mine, ROW, COL); DisplayBoard(show, ROW, COL);//打印棋盘 FindMine(mine, show, ROW, COL); } static void menu() { printf("****************\n"); printf("***1.开始游戏***\n"); printf("***0.退出游戏***\n"); printf("****************\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:"); int i = scanf("%d", &input); switch (input) { case 1: game(); case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }