【C】用c语言编写的扫雷小游戏

注意:主函数以及菜单函数在上一篇博客中。

#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;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_38606740/article/details/88849388