【扫雷】(简易版)


游戏演示

在这里插入图片描述


文件的设计

game.h头文件负责变量的定义,函数的声明和各个头文件的包含

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 9
#define col 9
#define mineCount 10;
#define no_mine '0'
#define is_mine '1'
char mine[row][col];
char show[row][col];
void initBoard();
void setMine();
void printShowBoard();
void printMineBoard();
void findMine();

gameDriver.文件负责实现游戏的逻辑

在这里插入图片描述

game.c文件负责各个功能的实现

在这里插入图片描述


主函数

int main()
{
	int input = 0;
	//设置随机数生成器
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("=====\t退出游戏\t=====\n");
			break;
		}
	} while (input);
	return 0;
}

menu()菜单函数

void menu()
{
	printf("=====\t扫雷\t=====\n");
	printf("=====\t1.play\t=====\n");
	printf("=====\t0.exit\t=====\n");
}

game()游戏函数

void game()
{
	initBoard();
	setMine();
	findMine();
}

initBoard()初始化雷盘

void initBoard()
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			show[i][j] = '*';
			mine[i][j] = no_mine;
		}
	}
}

setMine()设置雷

void setMine()
{
	//雷数
	int count = mineCount;
	//布置雷
	while (count != 0)
	{
		int x = rand() % row - 1;
		int y = rand() % col - 1;
		if (mine[x][y] == no_mine)
		{
			mine[x][y] = is_mine;
			count--;
		}
	}
}

printShowBoard()打印显示雷盘

static void printShowBoard()
{
	for (int i = 0; i < col + 1; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (int i = 0; i < row; i++)
	{
		printf("%d ", i + 1);
		for (int j = 0; j < col; j++)
		{
			printf("%c ",show[i][j]);
		}
		printf("\n");
	}
}

printMineBoard()打印真实雷盘

static void printMineBoard()
{
	for (int i = 0; i < col + 1; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (int i = 0; i < row; i++)
	{
		printf("%d ", i + 1);
		for (int j = 0; j < col; j++)
		{
			printf("%c ", mine[i][j]);
		}
		printf("\n");
	}
}

findMine()找雷

void findMine()
{
	int x = 0; 
	int y = 0; 
	int i = 0; 
	int j = 0;
	//周围雷的总数
	int mine_sum = 0;
	//还需排查的位置
	int need_check_position = row * col - mineCount;
	do
	{
		mine_sum = 0;
		printShowBoard();
		printf("请输入坐标:>");
		scanf("%d %d", &x, &y);
		//坐标合法
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			//坐标上不是雷,并且没被排查过
			if (mine[x - 1][y - 1] == no_mine && show[x -1][y -1] == '*')
			{
				//计算周围的雷数
				for (i = x - 1 - 1; i < x - 1 - 1 + 3; i++)
				{
					for (j = y - 1 - 1; j < y - 1 - 1 + 3; j++)
					{
						if (i >= 0 && i <= row - 1 &&
							j >= 0 && j <= col - 1 &&
							mine[i][j] == is_mine)
						{
							mine_sum = mine_sum + mine[i][j] - '0';
						}
					}
				}
				//放到show数组里
				show[x - 1][y - 1] = mine_sum + '0';
				//需要排查的坐标总数减一
				need_check_position--;
			}
			//坐标上的不是雷,但已经被排查过
			else if (mine[x - 1][y - 1] == no_mine && show[x - 1][y - 1] != '*')
			{
				printf("此位置已排查,请重新输入\n");
			}
			//坐标是雷
			else
			{
				printf("游戏失败\n");
				printMineBoard();
				break;
			}
		}
		//坐标不合法
		else
		{
			printf("输入有误,请重新输入\n");
		}
	} while (need_check_position != 0);
	if (need_check_position == 0)
	{
		printf("恭喜你,扫雷成功!!!\n");
	}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值