6_9.c

game.c

、判断周围雷数量函数find_boom_num及排雷函数Find_Boom

game.h

6_9.c
#define _CRT_SECURE_NO_WARNINGS 1//屏蔽“scanf 4996”问题
printf("\n\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\n"); printf("\$\$\$\$\$\$  1.Paly  \$\$\$\$\$\$\n");
printf("\$\$\$\$\$\$  0.Exit  \$\$\$\$\$\$\n"); printf("\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\n\n"); }//菜单
void game() { char mine[ROWS][COLS] = { 0 };//定义数组 char show[ROWS][COLS] = { 0
}; Rec_board(mine,ROWS,COLS,'0');//初始化实际雷区为'0' Rec_board(show, ROWS,
COLS, '*');//初始化镜像雷区为* //Put_board(mine, ROW, COL);//测试用 Put_board(show, ROW,
COL);//打印镜像雷区 //布置雷 Put_Boom(mine, ROW, COL); //Put_board(mine, ROW, COL);//开挂用
//排查雷 Find_Boom(mine, show, ROW, COL); }//游戏本体 int main() {
srand((unsigned int)time(NULL));//通过time获取当前时间戳和srand配合，生成随机数 int input = 0; do
{     menu();//菜单     printf("选择:>");     scanf("%d", &input);     switch
(input)//三种选择结果     {     case 1:         printf("开始游戏!\n");         game();
break;     case 0:         printf("退出游戏!\n");         break;
default:         printf("输入有误,请重新输入!\n");         break;    } } while
(input); return 0; }
game2.c
#define _CRT_SECURE_NO_WARNINGS 1//屏蔽4996问题 #include"game2.h" int i = 0; int j
= 0; void Rec_board(char board[ROWS][COLS], int rows, int cols, char set) { for
(i = 0; i < rows; i++) {     for (j = 0; j < cols; j++)     {
board[i][j] = set;     } }//棋盘默认为11*11规格，但只用9*9的大小，其他防止寻找周围雷数时越界！
}//初始化雷区,set是雷区或镜像雷区所需要的值，有可能是'0'或* void Put_board(char board[ROWS][COLS], int
row, int col) { printf("-------扫雷-------\n"); for (j = 0; j <= col; j++)//打印纵坐标
printf("%d ", j); 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 Put_Boom(char board[ROWS][COLS], int row, int col) {
int count = Boom; int i = 0; while (count) {         int x = rand() % row
+ 1;//+1是因为，要用到1到9的雷区，如果不+1，只能得到0到8的雷区         int y = rand() % col + 1;//同理
if (board[x][y] == '0')         {             board[x][y] = '1';//
'1'代表雷             count--;//布置成功一颗 -1         }//只有雷布置成功了。count才--，才能跳出while }
}//放置雷 int find_boom_num(char board[ROWS][COLS], int x, int y) { return board[x
- 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + board[x][y - 1] +
board[x][y + 1] + board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1]
- 8 * '0'; }//判断周围有几颗雷 void Find_Boom(char mine[ROWS][COLS], char
show[ROWS][COLS], int row, int col) { int count = 0;//记录周边雷数 while (count < row
* col - Boom) { int x = 0; int y = 0; int input = 0; printf("请输入一个坐标用以排雷:>")；
scanf("%d %d", &x, &y); if (mine[x][y] == '1') {     printf("\n扫雷失败，你被炸死了!\n");
Put_board(mine, ROW, COL);     printf("\n\n\n请选择是否重新开始\n\n\n");     break;
}//失败情况 else if (mine[x][y] != '1') {     int num = find_boom_num(mine, x, y);
show[x][y] = num + '0';     Put_board(show, ROW, COL);     count++;
}//成功情况，主要是获取周围雷数，然后将其赋给镜像雷区 if (count == row * col - Boom) {
printf("\n恭喜排雷成功!\n");     Put_board(show, ROW, COL); }//排雷成功的情况 } }
game2.h
#pragma once//自定义头文件自己生成的 #include<stdio.h> #include<stdlib.h>//srand和rand的头文件
#include<time.h>//time函数的头文件 #define ROW 9//宏定义行 #define COL 9//宏定义列 #define
ROWS ROW+2//“缓冲区” #define COLS COL+2//“缓冲区” #define Boom 10//宏定义雷数 void
Rec_board(char board[ROWS][COLS], int rows, int cols, char set); //初始化雷区和镜像雷区
void Put_board(char board[ROWS][COLS], int row, int col); //主要打印镜像雷区，实际雷区处于隐藏状态
void Put_Boom(char board[ROWS][COLS], int row, int col); //放置雷 void
Find_Boom(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col); //排查雷

GitHub

Gitee