注意:主函数以及菜单函数在上一篇博客中。
#pragma once
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h>
#define MineRowCol 9
#define MineColRow 9
#define Mines 10
/*
* 当前版本:v1.0.1
*
* 作者:linqxxy
*
/* 完成日期:2019.3.27
/*
* 函数名称:initMine
*
* 函数功能:初始化布雷数组,初始化显示数组
*
* 入口参数:mines,ShowMine,Row,Col
*
* 出口参数:空
*
* 返回类型:void
*/
void initMine(char mines[MineRow][MineCol], char Showmine[MineRow][MineCol], int row,int col)
{
int i = 0, x = 0, y = 0;
memset(mines, '0', MineCol*MineRow * sizeof(char));//初始化布雷数组为0
memset(Showmine, '.', MineCol*MineRow * sizeof(char));//初始化显示地图为.
for (i = 0; i <= Mines; i++)
{
while (1)
{
x = rand() % row;
y = rand() % col;
if (mines[x][y] == '0')
{
mines[x][y] = '1';//随机产生雷的坐标
break;
}
}
}
}
/*
* 函数名称:printmine
*
* 函数功能:打印扫雷地图或者布雷地图
*
* 入口参数:mines或者ShowMine,Row,Col
*
* 出口参数:空
*
* 返回类型:void
*/
void printmine(char mines[MineRow][MineCol], int row , int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
printf("%4d", i);//打印坐标,方便玩家输入
}
printf("\n");
for (i = 0; i < row; i++)
{
printf("%2d", i);
for (j = 0; j < col; j++)
{
printf(" %c ", mines[i][j]);
}
printf("\n");
}
}
/*
* 函数名称:checkmine
*
* 函数功能:检查周围有多少个雷,返回雷的个数。
*
* 入口参数:mines,ShowMine,Row,Col,x,y
*
* 出口参数:空
*
* 返回类型:char
*/
char checkmine(char mines[MineRow][MineCol], char show[MineRow][MineCol],int x,int y )
{
int i = 0, j = 0;
char count = '0';
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
if (mines[i][j] == '1')//如果周边有雷 count++
{
count++;
}
}
}
return count;
}
/*
* 函数名称:win
*
* 函数功能:检查是否胜利,踩雷返回L;未踩雷显示周围雷的个数,如果棋盘上
*空余位置数等于雷数,则返回W,胜利。
*
*
* 入口参数:mines,ShowMine,Row,Col,x,y
*
* 出口参数:空
*
* 返回类型:char
*/
char win(char mines[MineRow][MineCol], char show[MineRow][MineCol], int row, int col,int x,int y)
{
int count = 0;
if (mines[x][y] == '0')
{
show[x][y] = checkmine(mines,show,x,y);//如果没踩雷,显示该坐标周围雷数
}
else
{
return 'L';
}
for (x = 0; x < row; x++)
{
for (y = 0; y < row; y++)
{
if (show[x][y] == '.')//判断空余位置与雷数是否相等
{
count++;
}
}
}
if (count == Mines)
{
return 'W';
}
else
{
return 0;
}
}
/*
* 函数名称:Clearance
*
* 函数功能:扫雷逻辑的实现,先初始化地图,然后打印显示地图。输入坐标判断是否胜利。
*
* 入口参数:空
*
* 出口参数:空
*
* 返回类型:void
*/
void Clearance()
{
char mines[MineRow][MineCol] = { 0 };
char Showmine[MineRow][MineCol] = { 0 };
char ret = 0;
initMine(mines, Showmine, MineRow, MineCol);//初始化布雷地图与显示地图
printmine(Showmine, MineRow, MineCol);//打印初始显示地图
int x = 0, y = 0;
while (1)
{
printf("请输入你要点开的坐标:\n");
scanf("%d%d", &x, &y);
ret = win(mines, Showmine, MineRow, MineCol, x, y);//判断是否胜利并修改雷数
printmine(Showmine, MineRow, MineCol);//打印有周边雷数的显示地图
if (ret == 'W')
{
printf("恭喜你赢了,已经找出所有的雷\n");
printmine(mines, MineRow, MineCol);
break;
}
if (ret == 'L')
{
printf("Boom!不好意思您输了\n");
printmine(mines, MineRow, MineCol);
break;
}
}
}