简易扫雷的实现


前言

随着学习C语言的深入,现在我将在这篇文章中展示简易扫雷的实现,如有疏漏,敬请指正。


正文

一、扫雷的玩法

扫雷是在棋盘上放置一定数量的雷,玩家通过输入坐标来排查雷,若选择的坐标位置上存在雷则游戏失败,若选择的位置没有雷,则该位置显示周围8个格子中雷的个数,直至玩家排查出所有的雷即获得游戏的胜利。

二、扫雷过程实现代码示例

1.初始菜单

这个菜单最普通不过了,1开始游戏,0退出游戏,需要注意的是需要将菜单放入do while循环内。
代码如下:

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

2.设置棋盘和雷的个数

设置棋盘大小应使用#define定义的常变量,以便于增强代码的可移植性。同时考虑到后续需要计算雷的个数,防止出现数组越界访问的情况,应在棋盘外再加一圈便于以后查找。
代码如下:

#define ROW 9
#define COL 9
#define ROWS ROW+2//多一圈
#define COLS COL+2//多一圈
#define EASY_MODE 10//简易模式10个雷

接下来设置棋盘。
代码如下:

void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)//此处rows,cols是布置时全要布置
{
  int i = 0;
  int j = 0;
  for(i = 0;i<rows;i++)
     {
        for(j=0;j<cols;j++)
        {
         board[i][j] = set;
        }
     }
}

char mine[ROWS][COLS];
char show[ROWS][COLS];
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');

3.展示棋盘

将棋盘打印,检查是否正确。
代码如下:

void DisplayBoard(char board[ROWS][COLS],int row,int col)//此处的row,col是打印时只需要展示中间部分
{
  printf("------扫雷游戏------\n");
     int i = 0;
     int j = 0;  
     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");
  }
DisplayBoard(mine,row,col);
DisplayBorad(show,row,col);
  

效果如下:
在这里插入图片描述

4.布置雷

通过生成随机坐标的方式布置雷,通过rand()%num+1实现坐标范围为1-num,注意若生成的位置不是‘0’,则需要重新生成坐标。
代码如下:

void SetMine(char mine[ROWS][COLS], int row, int col, int number)//number为雷的个数
{
	while (number)
	{
		//横纵坐标1-row
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			number--;
		}
	}
}

设置好后不需要打印,不然就没法玩了。

5.排查雷

用户输入坐标进行排查雷。
代码如下:

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int win = 0;
	while (win< row*col-EASY)
	{
		printf("请输入要排查的坐标:>");
		int x = 0;
		int y = 0;
		scanf("%d%d", &x, &y);
		//1、坐标合法性
		//2、该坐标是不是雷?不是雷,统计周围雷的个数
		if (x >= 1 && x <= row && y >= 1 && y <= col)//坐标合法性
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了!\n");
				DisplayBoard(mine, row, col);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, row, col);
				win++;
 			}
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}
	}
	if (win == row*col - EASY)
	{
		printf("恭喜你,排雷成功!\n");
		DisplayBoard(mine,row,col);
	}
}

6.计算雷的个数

当输入的坐标合法且不是雷是,需要统计周围8个坐标里雷的个数总和。
Tips:1、字符1和字符0相减的值为1
2、可利用周围的1减去8*’0‘或者用循环包括自身减去9*’0‘

代码如下:


int GetMineCount(char mine[ROWS][COLS], int x, int y)//统计mine数组x,y坐标周围有几个雷
{
	return 
	    mine[x - 1][y + 1] +
		mine[x][y + 1] +
		mine[x + 1][y + 1] +
		mine[x - 1][y] +
		mine[x + 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] - 8 * '0';
	// 或者两重循环相加-9*‘0’
	/*
	int GetMineCount(char mine[ROWS][COLS],int row,int col)
	int i = 0;
	int j = 0;
	char count;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= ocl; j++)
		{
		count+=mine[i][j];
		}
	}
	int ret = count - 9*'0';
	return ret;
	*/

}

三、测试游戏运行情况

测试截图如下:

正常排雷:
在这里插入图片描述
踩到雷:
在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了C语言实现三子棋的方法,关于连续展开一片无雷区域可考虑使用递归实现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值