首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言-扫雷

C语言-扫雷

作者头像
用户11456817
发布2025-01-22 08:44:26
发布2025-01-22 08:44:26
23500
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

第一步需要创建三个文件:game.h,game.c和test.c文件

game.h:存放函数声明

game.c:存放函数定义

test.c:存放主函数,和代码运行

准备好文件之后,我们就需要滤清思路:

第一步:在game.h中进行需要函数的声明和头文件的书写

rand()函数原型:

int rand(void);

stdlib.h是使用rand()函数所需要的头文件

rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。

srand的原型为:

void srand(unsigned int seed);

在调用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1,如srand(1)则是用1来初始化种子。随机种子相同,每次产生的随机数也会相同。

用srand设置随机种子:

想要生成1~100的数字:

int num =rand()%100+1

产生0~99的数字:int num = rand()%100

time函数:

time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。time函数返回的这个时间差也被叫做:时间戳。

time函数需要用到的头文件:include<time.h>

test.c部分:

完成前面的操作,要开始对test.c文件的编译

test.c文件是我们对游戏开始界面的编写,需要有游戏入口,”开始游戏“,”结束游戏“等等的选项入口,便可开始游戏。同时可以作为对函数的测试的入口。

头文件为include"game.h",可以将game.h中包含的头文件进行运用。

meum()函数部分:

打印选择目录,进入游戏的入口。

test()函数部分:

设置种子srand()函数,并使用do whlie循环和switch选择语句来进行编译,使用定义input变量来进行选择进入game()函数开始游戏还是退出游戏。我额外添加了一个”选择错误,重新选择“的选项,增加游戏多选性。

game()部分:

则是对game.h和game.c文件中函数的声明和定义的测试运行。

game.h部分:

并在game.h中用define来定义所需变量的数值,如我就是用ROW和COL来进行所需二维数组的行列,这样方便修改对变量的定义。

在game.h头文件中还可以对需要使用到的函数进行声明,便于后面在game.c文件中对函数进行定义使用。

第一个函数声明,InitBoard函数初始化棋盘,初始化show和mine棋盘,show棋盘用来存放雷的信息,mine棋盘用来设置雷。

第二个函数声明,DisplayBoard函数用来打印show和和mine棋盘

第三个函数声明,SetMine函数用来设置雷

GetMineCount函数用来计算排除类所在位置附近8个位置雷的个数,返回类型为int

最后一个函数声明,FindMine函数有寻找雷的作用

以上是在头文件中对所需要的函数的声明

game.c部分:

需要引入game.h的头文件

初始化棋盘,需要用到到两个循环来初始化棋盘,用set字符来初始化棋盘,不会与整形冲突,也便于观察。

对于棋盘的打印,可以打印一个"------扫雷------“的标题。

然后再进行棋盘的打印,先打印一行序列,再换行,用嵌套循环,边打印序列,便往棋盘每个空格中放一个字符。

设置雷的实现,也需要用到在头文件game.h中的宏定义,创建一个EASY_COUNT变量来进行雷个数的设置,当雷个数为0时,则跳出while循环,雷则设置完成。在为雷的位置放一个字符’1‘。

对排查位置附近雷的数量进行统计,同样也是字符型,利用排查位置附近的坐标位置来进行统计。定义一个count变量,来进行累加,减去字符’0‘,来将其转化为字符型,统计完成返回count。

FindMine()函数的实现较为复杂,需要用到while循环和if判断语句。

定义三个变量,x,y,win

x为行坐标,y为列坐标,win为记录已排查数。

if用来判断输入的坐标合法性,合法则进入if语句,不符则跳出。

坐标为雷,则退出,不为则继续游戏。

需要调用DisplayBoard函数。

全部实现代码:

game.h:

代码语言:javascript
代码运行次数:0
运行
复制
#pragma once

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

#define ROW  9
#define COL  9

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

#define EASY_COUNT 10


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

void DisplayBoard(char borad[ROWS][COLS], int rows, int cols);//打印棋盘

void SetMine(char mine[ROWS][COLS], int rows, int cols);//设置雷

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

game.c:

代码语言:javascript
代码运行次数:0
运行
复制
#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

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

void DisplayBoard(char board[ROWS][COLS], int rows, int cols) {
	printf("-------- 扫雷 --------\n");
	int i = 0;
	for (i = 0; i <= cols; i++) {
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= rows; i++) {
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <=cols; j++) {
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

void SetMine(char mine[ROWS][COLS], int rows, int cols) {
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand() % rows + 1;
		y = rand() % cols + 1;
		if (mine[x][y] != '1') {
			mine[x][y] = '1';
			count--;
		}
	}
	
}

int GetMineCount(char mine[ROWS][COLS],int x,int y) {
	int i = 0;
	int count = 0;
	for (i = -1; i <= 1; i++) {
		int j = 0;
		for (j = -1; j <= 1; j++) {
			count += (mine[x + i][y + j] - '0');
		}
	}
	return count;
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols) {
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < cols * rows - EASY_COUNT)
	{
		printf("请输入坐标位置:");
		scanf_s("%d %d", &x, &y);
		if (x >= 1 && x <= rows && y >= 1 && y <= cols)
		{
			if (mine[x][y] =='1')
			{
				printf("很可惜,你踩雷了");
				DisplayBoard(mine, rows, cols);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, rows, cols);
				win++;
			}
	    }
		else
		{
			printf("输入的坐标有误,请重新输入");
		}
	}
	if (win == cols * rows - EASY_COUNT) {
		printf("恭喜你,扫雷成功");
		DisplayBoard(mine, rows, cols);
	}

}

test.c:

代码语言:javascript
代码运行次数:0
运行
复制
#include"game.h"

void meum()
{
	printf("*************************\n");
	printf("***********1.play********\n");
	printf("***********0.exit********\n");
	printf("*************************\n");
}
void game()
{
	char mine[ROWS][COLS] = { 0 };//设置雷
	char show[ROWS][COLS] = { 0 };//存放雷的消息

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

	SetMine(mine, ROW, COL);

	DisplayBoard(show, ROW, COL);
	DisplayBoard(mine, ROW, COL);

	FindMine(mine, show, ROW, COL);

}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do {
		meum();
		printf("请选择:>");
		scanf_s("%d", &input);
		switch (input) {
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • rand()函数原型:
  • srand的原型为:
  • 用srand设置随机种子:
  • time函数:
  • test.c部分:
  • meum()函数部分:
  • test()函数部分:
  • game()部分:
  • game.h部分:
    • game.c部分:
  • 全部实现代码:
  • game.h:
  • game.c:
  • test.c:
  • 运行结果:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档