C语言-扫雷游戏

具体思路:

(1)void menu() - 打印游戏的菜单。

(2)void game() - 游戏函数

  • 定义了两个二维字符数组mineshow,分别用于存放布置好的雷的信息和排查出的雷的信息。
  • 使用了InitBoard函数来初始化棋盘。
  • 使用了SetMine函数来布置雷。
  • 使用了FindMine函数来排查雷。

(3)int main() - 主函数

  • 使用do-while循环显示菜单并根据用户输入执行相应操作。
  • 注意srandtime函数用于初始化随机数生成器,这是设置雷的位置时可能需要的。

下面为具体函数实现:

main.c文件:主函数 - 实现扫雷游戏的基本框架

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"

void menu()
{
	printf("*****************************\n");
	printf("*********   1.play  *********\n");
	printf("*********   2.exit  *********\n");
	printf("*****************************\n");
}


void game()
{
	char mine[11][11] = {0}; //存放布置好的雷的信息
	char show[11][11] = {0}; //存放排查出的雷的信息

	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');   //全放0
	InitBoard(show, ROWS, COLS, '*');   //全放*

	//打印棋盘 - 只打印中间9×9的格子
	DisPlayBoard(show, ROW, COL);  //布置的雷不打印

	//布置雷
	SetMine(mine, ROW, COL);  
	//DisPlayBoard(mine, ROW, COL);  //打印布置好雷的棋盘

	//排查雷
	FindMine(mine, show, ROW, COL);

}

int main()
{
	int input = 0;
	srand((unsigned int )time(NULL));
	do
	{
	    menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();  //扫雷游戏
			printf("扫雷游戏!!!\n");
			break;
		case 2:
			printf("退出游戏!!!\n");
			break;
		default:
			printf("选择错误,请重新选择!!!\n");
			break;
		}
	} while (input);

	return 0;
}

game.c文件:包括游戏实现的函数

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"


//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}


//打印棋盘
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("-----------扫雷游戏-----------\n");

	//打印列号
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);  //打印列号
	}
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);  //打印行号
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("-----------扫雷游戏-----------\n");
}


//布置雷 
void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		//生成随机的下标
		int x = rand() % row +1;   //范围1~9
		int y = rand() % row +1;   //范围1~9
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}


static int get_mine_count(char mine[ROWS][COLS], int x,int  y)
{
	//求出周围8个雷的个数
	return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
		mine[x][y - 1] + mine[x][y + 1] +
		mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] -
		8 * '0';
}


//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	//1.输入排查的坐标
	//2.检查输入的坐标是不是雷:
	//   (1)如果是雷 - 炸死 - 游戏结束;
	//    (2)如果不是雷 - 统计坐标周围有几个雷 - 存储排查雷的信息到show数组, 游戏继续。

	int x = 0;
	int y = 0;
	int win = 0;

	while (win<row*col - EASY_COUNT)
	{
		printf("请输入坐标:");
		scanf("%d%d", &x, &y);  //x - (1,9);y - (1,9);

	   //判断坐标的合法性
	   if (x >= 1 && x <= row & y >= 1 && y <= col)
	   {
		   if (mine[x][y] == '1')
		   {
			   printf("很遗憾,你被炸死了\n");
			   DisPlayBoard(mine, ROW, COL);
			   break;
		   }
		   else
		   {
			   //不是雷的话,统计x,y坐标周围有几个雷
			  int count = get_mine_count(mine, x, y);
			  show[x][y] = count + '0';  //count + '0':转化成字符
			  //显示排查的信息
			  DisPlayBoard(show, ROW, COL);
			  win++;
		   }
	   }
	   else
	   {
		    printf("坐标错误,请重新输入\n");
	   }
	}
	if (win == row*col - EASY_COUNT)
	{
		printf("恭喜你排雷成功\n");
		DisPlayBoard(mine, ROW, COL);
	}
}

game.h文件:头文件的声明

#include <stdio.h>
#include "stdlib.h"
#include "time.h"


#define ROW 9
#define COL 9
#define EASY_COUNT 10

#define ROWS ROW+2
#define COLS COL+2

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);

//打印棋盘
void DisPlayBoard(char board[ROWS][COLS], int row, int col);

//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值