C语言扫雷(mine clearance)的代码实现

今天咱就不聊快捷键了 (聊不完啊)     写了扫雷游戏的代码,基本能运行了,接下来就差完善人性化的功能了   经计算 本代码行数也就100多行  好的  废话不多说 先上代码!!

(本篇涉及到随机数的生成,未来我们会谈到)

游戏结构

//实现扫雷
//可以自主(作者)选择棋盘大小  
//初始化棋盘initialize map
//跟玩家互动打印棋盘display map
//玩家选择排雷坐标
//统计坐标周围雷个数
int win_record = 0;
#define ROW 9//自己拟定地图的行row,列column
#define COL 9
#define COLS (COL + 2)  //加上边界 进行初始化 便于get_mine_num的函数实现
#define ROWS (ROW + 2)
#define mine_min (COL*ROW-1)  //用于维护游戏,方便作者测试
#define mine_num 10   //拟定雷的个数
void menu(void)//菜单
{
	puts("************************");
	puts("******   扫  雷   ******");
	puts("******  1. play   ******");
	puts("******  0. exit   ******");
	puts("****** 请输入:<   ******");
	puts("************************");
}
char map_inside[ROWS][COLS];
char map_show[ROWS][COLS];
void game()
{
	srand((unsigned int)time(NULL));
	//被调函数 游戏实现!
	puts("--------扫雷--------");
	initial_map(map_inside,ROWS,COLS, '0');
	initial_map(map_show, ROWS, COLS,'*');
	//显示地图
	display_map(map_show,ROW,COL);
	//display_map(map_inside, ROW, COL);//维护游戏用
	//设置雷需要生成随机数
	set_mine(map_inside, ROW, COL, mine_num);
	//display_map(map_inside, ROW, COL);//维护游戏用

	//玩家输入坐标找点
	int i = find_mine(map_inside,map_show, ROWS, COLS);
	if (i)
		win_record++;
}

int main()
{
	//主调函数 游戏结构
	int option = 0;
	menu();
	int cnt = 0;
	do
	{
		if(cnt != 0)
		menu();
		scanf("%d", &option);
		switch (option)
		{
		case 1:
			game();
			cnt++;
			break;
		case 0:
			puts("正在结算......");
			Sleep(1000);//伪结算
			puts("退出成功!");
			printf("您共游玩了%d次,胜利%d次", cnt,win_record);
			return 0;
		default:
			system("cls");
			puts("输入不合法,请重新输入!");
			break;
		}
	} while (option);
	return 0;
}

游戏主体(结构实现/函数实现)

void initial_map(char a[ROWS][COLS], int row, int col, char set)//初始化地图 地图符号由 char set 决定
{
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			a[i][j] = set;
}

void display_map(char a[ROWS][COLS], int row, int col)//输出打印地图其中包括inside(隐藏,来储存雷的坐标)和 show(显示,来和玩家互动)
{
	puts("--------------------");
	for (int c = 0; c <= col; c++)
		printf("%d ", c);
	puts("");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", a[i][j]);
		}
		puts("");
	}
	puts("--------------------");
}

void set_mine(char a[ROWS][COLS], int row, int col, int num)//设置随机雷
{
	while (num)
	{
		row = rand() % 9 + 1;
		col = rand() % 9 + 1;
		if (a[row][col] == '0')
		{
			a[row][col] = '1';//1代表雷
			num--;
		}
	}
}

int get_mine_number(char a[ROWS][COLS], int r, int c)//得到玩家选择坐标周围雷的个数
{
	return a[r - 1][c - 1] + a[r - 1][c + 1]
		+ a[r][c - 1] + a[r][c + 1]
		+ a[r - 1][c] + a[r + 1][c]
		+ a[r + 1][c + 1] + a[r + 1][c - 1] - 8 * '0';
}
int find_mine(char inside[ROWS][COLS], char show[ROWS][COLS], int row, int col)//玩家输入坐标排雷
{
	int r, c;
	int win = 0;
	int flag = 1;
	while (win < row * col - mine_min)
	{
		do
		{
			printf("请输入排查坐标(行,列)"); scanf("%d %d", &r, &c);
			if (r <= row && r >= 1 && c <= row && c >= 1)
			{
				flag = 0;
			}
			else puts("输入不合法!请输入两个1~9的数字中间用逗号隔开!");
		} while (flag);
		if (inside[r][c] == '0')
		{
			int num = get_mine_number(inside, r, c);
			show[r][c] = num + '0';
			system("cls");
			display_map(show, ROW, COL);
			win++;
		}
		else if (inside[r][c] == '1')
		{
			puts("很遗憾,你被炸死了!");
			display_map(inside, ROW, COL);
			puts("是否继续?(输入0/1)");
			return 0;
		}
	}
	if(win == row * col - mine_min)
	{
		printf("恭喜你排雷成功!");
		return 1;
	}

}


谈谈思路

“扫雷”的游戏规则前人之述备,不在此赘述。##注意!在接下来的每一步最好都进行调试找bug

1.想想需要什么功能

与玩家互动让他们做出选择 需要菜单,需要显示output    需要初始化地图而且一个用来显示周围地雷数,一个是内部用来储存地雷的坐标的地图(也就是数组) 记录胜场数  然后就是循环、选择等等语句  慢慢想你也可以写出来。

2.拆分结构

1.首先是主体结构,需要选择语句,一般写在主调函数里面   

2.其次是游戏内部结构,需要实现上述功能其中游戏结构也可以拆分为a.初始化地图 b.显示地图  c.设置地雷  d.玩家输入坐标排雷

3.将结构包装为函数 并注释

4.用自己的方法实现函数

因为每一步目的都是清晰的,此时排查bug效率高

好了 写完了就发给朋友让他们玩玩 让他们给你找找bug


总结

好耶!又水了一篇博客(bushi)     大学时间真的好紧啊真的太充实了  

本篇所需的基础不高,也算是对本蒟蒻的目前所学的总结  

经次一历,我发现快捷键真的节约时间。不知道跟大家一不一样,每次写代码,每次使用快捷键我心情都会变好。敲代码真的让人快乐!!

快捷键还会更新的,大家稍作观望!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值