扫雷(初阶)

细节决定成败!

目录

打印菜单

创建棋盘并打印

埋雷

排雷

 判断输赢


 

扫雷游戏规则

当棋盘内除去有地雷的格子,全被排除那么就会胜利,反之当玩家排到一颗雷就会被炸西

根据三子棋的写法,扫雷程序也是需要分为几个文件,声明函数的文件,定义函数的文件和游戏实现的文件

首先还是思考出一个大方向之后在慢慢优化

第一步还是打印一个菜单

第二部创建棋盘并打印

第三步随机埋雷

第四步排雷并判断

第五步判断输赢

大方向就这样,其余细节在程序中优化

打印菜单

创建棋盘并打印

1.创建两个二维数组,一个负责存放雷的信息,一个负责与放雷盘进行比对

2.初始化两个数组,雷盘初始化全 '0',雷用 ’1‘表示,排雷盘初始化全 '*',后续需要在输入的坐标中显示周围地雷的个数

3.由于输入坐标可能在棋盘边界,后续扫描周围八个坐标会造成数组越界,所以让行和列都加上2

创建一个11*11的棋盘,排雷,放雷,打印棋盘都只使用9*9的数组

4.定义行,列为常量,方便更改棋盘大小

5.添加行号,列号方便输入坐标

6.一切都可以创建为函数封装,使程序模块化

当然后续不会打印雷盘。

埋雷

1.随机生成地雷放入雷盘当中,通过rand函数实现

2.地雷的个数也创建为常量,方便后续更改地雷个数

这样地雷就布置好了

排雷

 1.玩家输入坐标排雷,判断坐标是否有雷,扫描周围八个坐标标是否存在地雷,并在输入坐标中显示地雷个数

2.判断地雷,输入坐标有地雷,跳出循环,并打印雷盘

3.扫描周围八个坐标,有雷就加加,最后返回,因为创建的数组是11*11而使用的是9*9棋盘所以不会发生数组越界

 判断输赢

1.当整个数组的元素减去雷的个数就是需要排掉的个数,每排掉一个坐标计数器就会加加,然后判断,直到排完地雷判断条件符合跳出循环,宣布胜利

更多细节尽在程序中

游戏实现.c文件

#include"test.h"//自定义头文件中包含了其它头文件
void game()
{
	//创建棋盘(数组)
	//存放字符创建字符二维数组数组
	//创建两个棋盘put放地雷get排雷
	char put[ROWS][COLS] = { 0 };
	char get[ROWS][COLS] = { 0 };
	使用初始化数组函数
	//雷阵初始化为全零
	init(put, ROWS, COLS, '0');
	//排雷阵初始化为全*
	init(get, ROWS, COLS, '*');
	//使用打印数组函数
	print(get, ROW, COL);
	//使用埋地雷函数
	bur(put, ROW, COL);
	//使用排雷判断函数
	jud(put, get, ROW, COL);//判断地雷盘是否是地雷,周围八个数有几个雷,后再传给排雷盘
}
void test()
{
	int a = 0;
	do//先打印一遍菜单
	{
		menu();
		printf("请选择\n");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
		{
			game();
			break;
		}
		case 0:
		{
			printf("退出游戏\n");
			break;
		}
		default:
		{
			printf("选择错误\n");
			break;
		}
		}
	} while (a);

}
int main()
{
	//创建随机值起点
	srand((unsigned int)time(NULL));
	test();
	return 0;
}

游戏函数声明文件

//此文件用来声明函数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//行,列
#define ROW 9
#define COL 9
//行列各加2防止查找周围八个数时数组越界
//不要太依赖标识符常量,尽量传参
#define ROWS ROW+2
#define COLS COL+2
#define lei 10//创建雷的个数,方便后期修改个数
//声明菜单函数
void menu();
//声明初始化数组
void init(char arr[ROWS][COLS], int row, int col, char ch);
//声明打印数组,传11*11打印9*9
void print(char arr[ROWS][COLS], int row, int col);
//声明埋地雷函数
void bur(char arr[ROWS][COLS], int row, int col);
//声明判断排雷
void jud(char put[ROWS][COLS], char get[ROWS][COLS], int row, int col);

游戏定义文件

//此文件用来定义函数
#include"test.h"
//菜单定义
void menu()
{
	printf("****************\n");
	printf("***1.开始游戏***\n");
	printf("***0.结束游戏***\n");
	printf("****************\n");
}
//定义初始化数组
void init(char arr[ROWS][COLS], int row, int col, char ch)
{
	//遍历数组初始化字符
	int i = 0;
	int n = 0;
	for (i = 0; i < row; i++)
	{
		for (n = 0; n < col; n++)
		{
			//没必要再写一个函数初始化排雷数组
			//只有复制的符号不同
			arr[i][n] = ch;
		}
	}
}
//定义打印数组
void print(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int n = 0;

	printf("--------------------\n");
	//打印行列号方便输入
	for (n = 0; n <= col; n++)
	{
		printf("%d ", n);
	}
	printf("\n");
	//只打印9*9的符号
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (n = 1; n <= col; n++)
		{
			printf("%c ", arr[i][n]);
		}
		printf("\n");
	}
}
//定义埋雷函数
void bur(char arr[ROWS][COLS], int row, int col)
{
	//创建随机下标,十颗地雷
	int j = lei;
	while (j)
	{
		int i = rand() % row + 1;
		int n = rand() % col + 1;
		if (arr[i][n] == '0')
		{
			arr[i][n] = '1';
			j--;
		}
	}
}
//定义周围地雷个数
int ret(char arr[ROWS][COLS], int i, int n)
{	//'0'的阿斯克码值是48'1'是49,'1'-'0'=1 当有2个字符0就是98两个字符0是96相减等于2
	//就表示周围一圈有2个雷
	return (arr[i + 1][n + 1] + arr[i][n + 1] + arr[i - 1][n + 1] + arr[i - 1][n] +
		arr[i - 1][n - 1] + arr[i][n - 1] + arr[i + 1][n - 1] + arr[i + 1][n] - 8 * '0');
}
//定义排雷判断
void jud(char put[ROWS][COLS], char get[ROWS][COLS], int row, int col)
{
	//玩家输入下标
	int i = 0;
	int n = 0;
	int k = 0;
	while (k < (row * col - lei))//总数减去雷就是所有可以排的
	{
		printf("请输入坐标 :");
		scanf("%d %d", &i, &n);
		//判断输入是否合法
		if (1 <= i && row >= i && 1 <= n && col >= n)
		{
			//判断坐标是否重复
			if (get[i][n] != '*')
			{
				printf("已经排过\n");
				//直接重新再输入不向下输入
				continue;
			}
			//判断是否挖到雷
			if (put[i][n] == '1')
			{
				printf("恭喜你,被炸西啦!\n");
				//打印雷盘让你凉的明白
				print(put, row, col);
				break;
			}
			else
			{
				int p = 0;
				//使用ret函数计算周围八个坐标有没有雷,并返回个数
				p = ret(put, i, n);
				//数组是字符类型的,不能直接使用
				// '0''1'2'的ASCII值分别是48,49,50
				// 而p如果返回2,当p+'0'=50也就是'2'了
				get[i][n] = p + '0';
				print(get, ROW, COL);
				k++;//计数器
			}
		}
		else
		{
			printf("请重新输入\n");
		}

	}
	if (k == (row * col - lei))
	{
		printf("恭喜你赢了\n");
		print(get, row, col);

	}

此游戏还可以优化为输入坐标后展开一片,直到周围都有地雷,标记你认为的地雷……

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值