用C语言实现扫雷游戏

本人能力不足,代码能力有待提升,在敲代码的过程中遇到了很多问题,在此不再一一赘述,现将代码以及分析展示如下:

#include"stdio.h"
#include"stdlib.h"
#include"time.h"
#include"string.h"
#pragma warning(disable:4996)
#define ROWS 11
#define COLS 11
#define COUNT 10

//菜单函数
void menu()
{
	printf("********************\n");
	printf("*****请进入游戏*****\n");
	printf("*****  1.play  *****\n");
	printf("*****  0.exit  *****\n");
	printf("********************\n");
	/*printf("请输入0或1进行游戏:-->  ");*/
}

//初始化雷区
void init_game(char mine[ROWS][COLS], char show[ROWS][COLS])
{
	//memset是以字节为单位,初始化内存块  
	//当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值  
	//在这里也可以用for循环来进行棋盘初始化
	//int i = 0;  
	//int j = 0;
	//for (i = 0; i < ROWS - 1; i++)
	//{
	//	for (j = 0; j < COLS - 1; j++)
	//	{
	//		mine[i][j] = '0';
	//		show[i][j] = '*';
	//	}
	//}
	memset(mine, ' 0 ', ROWS*COLS*sizeof(char));
	memset(show, ' * ', ROWS*COLS*sizeof(char));
}

//随机布局雷阵,即布好十个雷的任意位置
void set_mine(char mine[ROWS][COLS])
{
	int count = COUNT;//雷的个数,在这里为十个
	int x = 0;
	int y = 0;
	srand((unsigned)time(NULL));
	while (count)
	{
		//time函数可以获取当前的系统时间(但是获取的是秒数,是从1970年1月1日零时零分零秒到目前为止所经过的时间)
		//srand函数是随机数发生器的初始化函数  
		//为了让每一次程序的调用都产生不同的值,常常使用系统时间来初始化
		x = rand() % 9 + 1;
		y = rand() % 9 + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

//显示雷区
void display(char show[ROWS][COLS])
{
	int i = 0;
	int j = 0;
	printf(" ");
	for (i = 1; i < COLS - 1; i++)
	{
		printf(" %d ", i);
	}
	printf("\n");
	for (i = 1; i < ROWS - 1; i++)
	{
		printf("%d", i);
		for (j = 1; j < COLS - 1; j++)
		{
			printf(" %c ", show[i][j]);
		}
		printf("\n");
	}
}

//计算雷的个数,主要是对其周围八个方格进行判断  
int get_num(char mine[ROWS][COLS], int x, int y)
{
	int count = 0;
	if (mine[x - 1][y - 1] == '1')//左上方  
	{
		count++;
	}
	if (mine[x - 1][y] == '1')//左边  
	{
		count++;
	}
	if (mine[x - 1][y + 1] == '1')//左下方  
	{
		count++;
	}
	if (mine[x][y - 1] == '1')//上方  
	{
		count++;
	}
	if (mine[x][y + 1] == '1')//下方  
	{
		count++;
	}
	if (mine[x + 1][y - 1] == '1')//右上方  
	{
		count++;
	}
	if (mine[x + 1][y] == '1')//右方  
	{
		count++;
	}
	if (mine[x + 1][y + 1] == '1')//右下方  
	{
		count++;
	}
	return count;
}

//进行扫雷
int sweep(char mine[ROWS][COLS], char show[ROWS][COLS])
{
	int count = 0;
	int x = 0;
	int y = 0;
	while (count != ((ROWS - 2)*(COLS - 2) - COUNT))
	{
		printf("请输入坐标:  \n");
		scanf("%d %d", &x, &y);
		if (mine[x][y] == '1')
		{
			printf("你踩到雷了!\n");
			return 0;
		}
		else
		{
			int ret = get_num(mine, x, y);
			show[x][y] = ret + '0';
			display(show);
			count++;
		}
	}
	printf("恭喜你赢了!\n");
	display(mine);
	return 0;
}

//进行游戏
int Game(char mine[ROWS][COLS], char show[ROWS][COLS])
{
	set_mine(mine);
	display(show);
	sweep(mine, show);
	return 0;
}
 
//主函数
int main()
{
	int input = 0;
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	int i = 0;
	int j = 0;
	for (i = 0; i < ROWS - 1; i++)
	{
		for (j = 0; j < COLS - 1; j++)
		{
			mine[i][j] = '0';
			show[i][j] = '*';
		}
	}
	menu();
	while (1)
	{
		printf("请输入0或1:  ");
		scanf("%d", &input);
		if (input == 1)
		{
			printf("进入游戏!\n");
			Game(mine, show);
			break;
		}
		else if (input == 0)
		{
			printf("退出游戏!\n");
			exit(0);
			break;
		}
		else
		{
			printf("输入有误!\n");
		}
	}
	system("pause");
	return 0;
}
同之前所做的三子棋游戏差不多,主要是通过对各个函数的调用来实现此游戏的功能的,接下来,将一一分析每个函数的相关功能:

//1.menu函数:主要用于游戏开始界面的实现,以供玩家选择游戏的进或退,这里主要是通过几个简单的printf()函数来实现打印的;

//2.init_game函数:主要用于列阵的初始化,在这里定义了两个数组,一个是扫雷的界面,一个是用于显示雷的分布来用于计数,在这里主要用到了一个memset()函数来加以实现;

//3.set_mine函数:主要用于雷的布局,总共有十个雷,在这里主要是通过rand()函数来实现雷的随机分布的;同时调用了一个srand()函数,以及time()函数;

//4.display函数:主要用于实现雷的分布情况,显示各个雷所在的对应位置;

//5.get_num函数:计算雷的个数, 主要是对其周围八个方格进行判断 ,来统计周围共有多少雷分布,这里通过用八个if语句来实现统计;

//6.sweep函数:主要是进行扫雷操作,通过while语句以及if语句加以实现;

//7.Game函数:用于实现各个函数的功能;
//8.主函数:实现全部代码的相应功能,在这里主要是通过if语句来加以判断的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值