一,程序
先设置头文件,各个功能接口
mine.h 文件
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MineNumber 10
#define ROW 10
#define COL 10
#define ROWS ROW+2
#define COLS COL+2
//初始化棋盘
void InitBoard(char board[ROWS][COLS],char set);
//打印棋盘
void PrintBoard(char board[ROWS][COLS]);
//布置雷
void SetMineBoard(char mine[ROWS][COLS]);
//排查雷
void SeekMine(char mine[ROWS][COLS], char show[ROWS][COLS]);
//排查0雷及周围
void SeekMine1(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//标记雷
void FindMine(char show[ROWS][COLS]);
//判断获胜
int Win(char mine[ROWS][COLS], char show[ROWS][COLS]);
再设置各个接口功能,mine.c 文件
#define _CRT_SECURE_NO_WARNINGS
#include"mine.h"
//初始化棋盘
void InitBoard(char board[ROWS][COLS],char set)
{
for (int row = 0; row < ROWS; row++)
{
for (int col = 0; col < COLS; col++)
{
board[row][col] = set;
}
}
}
//打印棋盘
void PrintBoard(char board[ROWS][COLS])
{
printf("\n");
for (int r = 0; r < ROWS-1; r++)
{
for (int c = 0; c < COLS-1; c++)
{
if (0 == r && 0 == c)
{
printf("%-2d ", r);
}
else if (0 == r)
{
printf("%d ",c);
}
else
{
if (0==c)
{
printf("%-2d ", r);
}
else
printf("%c ", board[r][c]);
}
}
printf("\n");
}
printf("\n");
}
//布置雷
void SetMineBoard(char mine[ROWS][COLS])
{
int count=0;
while (MineNumber != count)
{
int r = rand() % ROW + 1, c = rand() % COL + 1;
if ('0'==mine[r][c])
{
mine[r][c] = '1';
count++;
}
}
}
//判断周围雷数
char Judge(char mine[ROWS][COLS], int row, int col)
{
char count ='0';
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
if (i != 0 || j != 0)
{
count += mine[row + i][col + j] - '0';
}
}
}
return count;
}
//排查周围
void SeekMine2(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
if (i != 0 || j != 0)
{
SeekMine1(mine, show, row + i, col + j);
}
}
}
}
//排查0雷及周围
void SeekMine1(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
if ('1' == mine[row][col] && '+' != show[row][col])
{
show[row][col] = '#';
printf("\n你被炸死了\n");
PrintBoard(mine);
}
else if ('*' == show[row][col] && row>0 && col>0 && row<ROW + 1 && col<COL + 1)
{
show[row][col] = Judge(mine, row, col);
if ('0' == show[row][col])
{
SeekMine2(mine, show, row, col);
}
}
}
//排查雷
void SeekMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{
int row=0, col=0;
while (true)
{
printf("\n请输入要排查的坐标:>");
scanf("%d%d",&row,&col);
if (0 == row && 0 == col)
FindMine(show);
else if (row<1 || col<1 || row>ROW || col>COL )
{
printf("输入超界\n");
}
else
{
if ('*'!= show[row][col])
{
int count = show[row][col] - '0';
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
if (i != 0 || j != 0)
{
if ('+' == show[row + i][col+j])
{
count--;
}
}
}
}
if (0 == count)
{
SeekMine2(mine, show, row, col);
break;
}
else
{
printf("运用失败\n");
}
}
if ('1'==mine[row][col])
{
show[row][col] = '#';
printf("\n你被炸死了\n");
PrintBoard(mine);
break;
}
else
{
SeekMine1(mine, show, row, col);
break;
}
}
}
}
//标记雷
void FindMine(char show[ROWS][COLS])
{
int row = 0, col = 0;
while (true)
{
printf("\n请输入要标记雷的坐标:>");
scanf("%d%d", &row, &col);
if (0 == row, 0 == col)
{
PrintBoard(show);
break;
}
if ('*' != show[row][col] || row<1 || col<1 || row>ROW || col>COL)
{
printf("无法标记\n");
}
else
{
show[row][col] = '+';
}
}
}
//判断获胜
int Win(char mine[ROWS][COLS], char show[ROWS][COLS])
{
int count1 = 0, count2 = 0, count3 = 0;
for (int r = 1; r < ROWS - 1; r++)
{
for (int c = 1; c < COLS - 1; c++)
{
if ('#' == show[r][c])
return 0;
if ('*' == show[r][c] || '+' == show[r][c])
count1++;
if ('+' == show[r][c])
count2++;
if ('+' == show[r][c] && '1' == mine[r][c])
count3++;
}
}
if (10 == count1)
{
printf("你赢了\n");
return 0;
}
if (10 == count2 && 10 == count3)
{
printf("你赢了\n");
return 0;
}
return 1;
}
最后设置菜单
main.c 文件
#define _CRT_SECURE_NO_WARNINGS
#include"mine.h"
void menu()
{
printf("******************************\n");
printf("****** 1. play *******\n");
printf("****** 0. exit *******\n");
printf("******************************\n");
}
void game()
{
char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息
char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息
//初始化棋盘
InitBoard(mine,'0');//'0'
InitBoard(show,'*');//'*'
//打印一下棋盘
PrintBoard(show);
//布置雷
SetMineBoard(mine);
int win = 1;
while (win)
{
//排查雷
SeekMine(mine, show);
PrintBoard(show);
win = Win(mine, show);
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏\n");
break;
case 1:
game();
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
二,实验
我们来玩玩吧
运气不错,一下出来不少,输入0 0,进入标记模式,将确认的雷打上标记,
再输入0 0,退出标记模式
输入7 3坐标,因为7 3周围的雷都被我们标记出来了,周围未知区域可以一次性显示出来。
如果标错了,这个显示会让你直接踩到雷哦。
最后简单完成扫雷