【C语言】-扫雷-简单版

news2024/9/27 9:23:36

前言:感谢各位朋友的捧场,这里给大家分享的是扫雷游戏的简单实现
(PS:这里简单是指只实现了游戏的基础功能和主要流程,由于当前本人技术知识尚薄弱,相关的优化会通过后续的学习进行更新)

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。 ——百度百科

一、准备工作

1. 文件分类

这里同样分为 game.h、game.c、test.c 三个文件进行编写,同专栏的下面这篇文章中有详细介绍:
【C语言】-三子棋-简单版

2. #define 定义标识符常量的设置

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

  • 解释
    (1)因为先着重于游戏主要功能的实现为目的,故将难度先默认为简单版也就是9×9的界面大小,总共只有10个雷;具体的后续优化将在后面的一部分介绍。
    (2)这里先介绍一下后面排查雷的思路:选定一个坐标,看其周围一圈有几个雷。如下图所示:
    在这里插入图片描述

假定蓝色圈为选定坐标,那么就要检测其周围八个位置即图中红色圈所经过的方块中有几个雷;而如果选定的坐标在边界处,如上图黄色圈的位置,此时若对其进行特殊情况处理会比较繁琐,故可以直接多增加一行一列来简化整体的程序。

3. 包含头文件

#include"game.h"

同样详细可见:
【C语言】-三子棋-简单版

二、编写过程

1. 简单主界面的建立

这里也和三子棋一样,就不再赘述啦,朋友们感兴趣的可以看看:
【C语言】-三子棋-简单版
下面我们开始编写 game()函数内容的介绍

2. 界面初始化与打印

  • 在开始编写之前,先介绍一下一些“规则”,其实也就是实现的思路
    假设我们采用字符 ‘1’ 来表示雷;用字符 ‘0’来表示没有雷,这样就会有个问题:当游戏界面上出现一个1是表示当前位置是雷呢?还是表示当前位置的周围八个位置中有一个雷呢?
    这里我们可以通过两个二维数组来解决这个二义性的问题:一个用于存放雷;一个用于显示。
    布置雷的操作我们就在存放雷的二维数组中进行;游戏中实际的界面及扫雷过程我们就在显示的二维数组中进行(前者进行内部设置,后者进行对外展现
    这里可能可能还有一个问题:为什么不用 ‘*’ ‘#’ 等字符来表示雷呢,关于这个问题我们会在后面计算某坐标周围有几个雷时进行解答,好奇的朋友也可直接先跳转到那部分看看。
  • 根据上述内容,我们就可以在 game() 函数中创建这两个二维数组了:
	char mine[ROWS][COLS] ;	//用于放置雷
	char show[ROWS][COLS] ;	//用于打印

接着,和使用一个变量一样,我们需先对其进行初始化,因为两个二维数组的作用不同,所以初始化的内容的也不同。我们的思路是这样的,对于放置雷的数组,先全都初始化为字符 ‘0’,后面再一个函数来进行布置雷;对于显示界面的数组,我们可以全都初始化为字符 ‘*’,来模拟扫雷一开始的游戏界面;接着,在打印界面的时候,我们可以加上行号和列号,便于游戏时通过键入坐标来排雷。初始化效果图如下:
放置雷的数组(实际游戏过程中不打印,这里仅说明用):
在这里插入图片描述
显示界面的数组:
在这里插入图片描述
接下来我们介绍具体是如何实现的。

(1)界面初始化

知识点: 相比于三子棋中初始化棋盘的函数,扫雷中的初始化函数新增添了一个参数,来实现指定初始化的内容,增强了代码的复用性,而不用为两个不同功能的二维数组分别编写初始化函数

其在头文件中的声明如下:
在这里插入图片描述
在 game.c 文件中进行编写的代码如下:

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

解释:双循环遍历二维数组,将所有元素置为 set 中的内容即可。

(2)界面打印

头文件声明如下:
在这里插入图片描述
在 game.c 文件中进行编写的代码如下:

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	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");
	}
}

解释:结合上述的效果图,我们先通过一个单独的for循环打印列标,然后再通过一个双重for循环实现在打印数组内容前先打印行标。(PS:为了对齐效果,列标比行标多打印了一个0,所以需要注意一下循环变量的初始化部分
有了上述内容,game()函数就可以有以下这么几行:

	char mine[ROWS][COLS] ;	//用于放置雷
	char show[ROWS][COLS] ;	//用于打印
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	DisplayBoard(mine, ROW, COL); //用于测试,实际不打印
	DisplayBoard(show, ROW, COL); //实际打印

game() 函数的测试结果:
在这里插入图片描述

完成初始化和打印界面的函数后,接下来就可以着手布置雷。

3. 布置雷

头文件声明如下:
在这里插入图片描述
在 game.c 文件中进行编写的代码如下:

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = EASY;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if ('0' == board[x][y])
		{
			board[x][y] = '1';
			count--;
		}		
	}
}

解释:这里放置雷的思路就是在 9×9 的游戏界面中生成10个随机坐标,但需要注意的是生成坐标后需判断一下当前坐标是否已经布置过雷了,避免相同的坐标处进行重复次数的布雷。以布雷的个数作为控制循环的条件,当布置雷的数量足够后即可跳出循环。对于其中随机数生成函数的较详细介绍可阅读下面这篇文章中的随机数生成部分:
【C语言】-猜数游戏-简单版
当布置雷函数编写完成后,game() 函数中就扩充为如下代码:

	srand((unsigned int)time(NULL));
	char mine[ROWS][COLS] = {0};	//用于放置雷
	char show[ROWS][COLS] = {0};	//用于打印
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	SetMine(mine, ROW, COL);
	DisplayBoard(mine, ROW, COL);  //用于测试,实际不打印
	DisplayBoard(show, ROW, COL);  //实际打印

测试结果如下:
在这里插入图片描述
可以看到,用于布置雷的数组已经完成10个雷的布置,字符 ‘1’ 处即为雷的位置。
雷布置完成了,接下来介绍最后一个函数的实现,也就是排查雷

4. 排查雷

结合上述设计两个作用不同的二维数组的思路,我们在二维数组mine(布置雷的数组)中排查,在二维数组show(实际显示的数组)中反馈排查信息。整个排查雷的过程可分为几个部分,下面逐一进行讲解:

(1)输入排查坐标

此部分需要注意的就是对输入坐标合法性的判断:

  • 输入坐标的是否超过界面大小
  • 输入的坐标是否已经被排查过了
    部分代码如下:
		printf("请输入坐标:\n");
		scanf("%d%d", &x, &y);
		if (x < 1 || x>ROW || y<1 || y>COL)		//检查输入坐标是否越界
		{
			printf("输入错误,请重新输入:\n");
			continue;
		}
		if (show[x][y] != '*')			//检查输入坐标处是否已被排查
		{
			printf("该位置已排查,请重新输入:\n");
			continue;
		}

(2)某坐标处周围雷数的计算:

这里我们设计一个函数来专门服务于某坐标周围雷数的计算

  • 代码如下:
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] 
		+ mine[x + 1][y - 1] +	mine[x + 1][y] + mine[x + 1][y + 1]
		+ mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0';
}

解释:看着好像很复杂,原理其实很简单。这里就体现了之前所说的用字符 ‘1’ 来表示雷的好处了:

  • 这里先补充一个字符作为整数返回的规则:字符若作为整数返回,那么返回的就是其ASCII码值。如字符 ‘A’ 的ASCII码值为65,那么其在作为整数返回时,返回值就是65。
  • 回到函数中,字符 ‘1’ 的ASCII码为49,而字符 ‘0’的ASCII码为48,那么二者相减得到就是ASCII码为1字符,那么在把这个字符作为整数返回时,其实返回的就是它的ASCII码值,也就是1。
  • 那么我们若想知道某坐标周围8个位置中有几个雷,也就是有几个字符 ‘1’ ,我们就可以把这些字符都加起来,然后分别都减去一个字符 ‘0’,这样最终返回的ASCII码值其实就是周围位置中雷的个数了。
    (注:字符 ‘1’ 与 ASCII码为1的字符不是一个概念;字符 ‘1’ 加 字符 ‘1’可不等于 字符 ‘2’,本质是它们的ASCII码值进行相加;返回的ASCII码值不能超过ASCII码规定的范围,即0-127。)
  • 但若想在实际显示的数组(show)中显示表示有几个雷的具体数字,我们还需在函数返回值的基础上再加上一个字符 ‘0’,即如下面条语句:show[x][y] = get_mine_count(mine, x, y) + '0';
    因为该数组show的类型为字符型,此时若想通过打印字符的方式(即打印数组show的元素)来实现打印数字就需要打印数字对应的字符(而不是ASCII码值),有点绕,举个例子:
    如若想屏幕上出现数字3,就得打印一个字符 ‘3’,而不是ASCII码值为3字符
    所以,在函数返回周围有几个雷之后再加上一个字符 ‘0’ ,就得到雷数对应的字符,也就能在屏幕上打印出来了。
    (小知识:对于字符0-9,若想得到数字0-9,就可用相应字符减去一个字符 ‘0’;反之同理。)

通过这个函数,我们就完成了某坐标周围雷数的计算。

(3)扫雷失败与完成的条件

扫雷失败的条件为:输入排查雷的坐标在放置雷的数组(mine)中刚好对应着雷,也就是字符 ‘1’。
扫雷的完成条件为:把所有不是雷的位置都找出来。
具体到 9×9的界面,10个雷的难度中,就是要找出 9×9-10=71个位置。
由此我们可以创建一个计数变量,只要我们排查的坐标上不是雷,那么计数变量++,直到达到设定的值,在9×9上也就是71。
部分代码如下:

		if (mine[x][y] == '1')
		{
			printf("You Lose!\n");
			break;
		}
		else
		{
			show[x][y] = get_mine_count(mine, x, y) + '0';	
			win++;
		}
		DisplayBoard(show, ROW, COL);
		if (win == row * col - EASY)
		{
			printf("You Win!\n");
			break;
		}

将以上部分组成循环:
当输入坐标不合法时,循环输入直至合法;
输入合法后,判断坐标是否为雷,若为雷,则打印“失败信息”并跳出循环;若不是雷,则可先打印界面(show数组),然后判断计数变量是否满足扫雷完成的条件,若满足,则打印“成功信息”并跳出循环。
实现排查雷的完整代码如下:

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int  y = 0;
	int win = 0;
	while (1)
	{
		printf("请输入坐标:\n");
		scanf("%d%d", &x, &y);
		if (x < 1 || x>ROW || y<1 || y>COL)		//检查输入坐标是否越界
		{
			printf("输入错误,请重新输入:\n");
			continue;
		}
		if (show[x][y] != '*')			//检查输入坐标处是否已被排查
		{
			printf("该位置已排查,请重新输入:\n");
			continue;
		}

		if (mine[x][y] == '1')
		{
			printf("You Lose!\n");
			break;
		}
		else
		{
			show[x][y] = get_mine_count(mine, x, y) + '0';	
			win++;
		}
		DisplayBoard(show, ROW, COL);
		if (win == row * col - EASY)
		{
			printf("You Win!\n");
			break;
		}
	}
}

至此,游戏进行所需的函数全都编写完成,接下来就可以进行“组装”测试了
game() 函数的最终内容如下代码:

void game()
{
	srand((unsigned int)time(NULL));
	char mine[ROWS][COLS] = {0};	//用于放置雷
	char show[ROWS][COLS] = {0};	//用于打印
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	SetMine(mine, ROW, COL);
	DisplayBoard(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);
	FindMine(mine, show, ROW, COL);
}

5.完整代码:

(1)game.h文件:

#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 10

//界面初始化
void InitBoard(char board[ROWS][COLS], int row, int col, char set);

//打印界面
void DisplayBoard(char board[ROWS][COLS], int row, int col);

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

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

(2)game.c文件:

#include"game.h"

//界面初始化(代码的复用性)
void InitBoard(char board[ROWS][COLS], int row, int col, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = set;
		}
	}
}

//打印界面
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	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");
	}
}

//放置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = EASY;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if ('0' == board[x][y])
		{
			board[x][y] = '1';
			count--;
		}		
	}
}

//排查雷
//1.在二维数组mine中排查,在二维数组show中反馈排查信息
//2.专设函数判断周围一圈有几个雷
//3.排查完毕的条件

int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] 
		+ mine[x + 1][y - 1] +	mine[x + 1][y] + mine[x + 1][y + 1]
		+ mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0';
}
//这就是用字符1表示雷不用#号等符号表示雷的原因:不用循环,直接加一圈,再把字符转换成数字
//字符1加字符1可不等于字符2
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int  y = 0;
	int win = 0;
	while (1)
	{
		printf("请输入坐标:\n");
		scanf("%d%d", &x, &y);
		if (x < 1 || x>ROW || y<1 || y>COL)		//检查输入坐标是否越界
		{
			printf("输入错误,请重新输入:\n");
			continue;
		}
		if (show[x][y] != '*')			//检查输入坐标处是否已被排查
		{
			printf("该位置已排查,请重新输入:\n");
			continue;
		}

		if (mine[x][y] == '1')
		{
			printf("You Lose!\n");
			break;
		}
		else
		{
			show[x][y] = get_mine_count(mine, x, y) + '0';	
			win++;
		}
		DisplayBoard(show, ROW, COL);
		if (win == row * col - EASY)
		{
			printf("You Win!\n");
			break;
		}
	}
}

(3)test.c文件:

#include"game.h"

void menu()
{
	printf("***********************************\n");
	printf("************  1.Play  *************\n");
	printf("************  0.Exit  *************\n");
	printf("***********************************\n");
}

void game()
{
	srand((unsigned int)time(NULL));
	char mine[ROWS][COLS] = {0};	//用于放置雷
	char show[ROWS][COLS] = {0};	//用于打印
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	SetMine(mine, ROW, COL);
	DisplayBoard(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);
	FindMine(mine, show, ROW, COL);
}

void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入进行选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
		case 0:
			break;
		default:
			printf("输入错误,请重新输入:\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

三、优化思路:

PS:这一部分作为即时更新内容,由于本人知识技术尚薄弱,优化的具体实现需一段时间来完成,后续若有新的优化思路或解决了某个优化问题,将在这一部分进行更新分享

根据经典版扫雷的游玩, 总结了以下可优化之处:
(PS:主观上优化的重要程度按序号排列)
(1) 一开始选择的位置一定不是雷,且若周围没有雷则应向周围自动展开一片
(2)能标记和取消标记雷
(3)能显示剩余雷的个数及游戏已经进行的时间
(4)多打印一个界面,可进行难度的选择,而不是直接更改定义的标识符的常量的数值
(5)利用EasyX(C语言的界面库)进行相关视觉效果上的优化等
如果大伙还有什么优化思路,非常希望各位在评论区留下宝贵的意见。感激不尽!

以上就是我对C语言实现简单版扫雷的内容分享啦。

看完觉得有觉得帮助的话不妨点赞收藏鼓励一下,有疑问或看不懂的地方或有可优化的部分还恳请朋友们留个评论,多多指点,谢谢朋友们!🌹🌹🌹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

session,cookie和token的区别

session&#xff0c;cookie和token究竟是什么简述cookie&#xff0c;session&#xff0c;token作为面试必问题&#xff0c;很多同学能答个大概&#xff0c;但是又迷糊不清&#xff0c;希望本篇文章对大家有所帮助http是一个无状态协议什么是无状态呢&#xff1f;就是说这一次请…

【Java Swing】Java组件及事件处理

图形用户接口1、Swing概述2、Swing顶级容器3、布局管理器4、事件处理5、Swing常用组件1、Swing概述 Swing是一种轻量级的组件&#xff0c;它由Java语言开发&#xff0c;可以通过使用简洁的代码、灵活的功能和模块化的组件来创建优雅的用户界面Swing组建的继承关系 2、Swing顶…

企业为何都用电子招投标 现代电子招投标系统介绍

在以前的传统招投标工作中&#xff0c;主要采用人工、书面文件的模式操作&#xff0c;往往产品没有得到很好地分类&#xff0c;导致整个招投标流程变得漫长且复杂。在传统招投标过程中通常需要三个月或更长时间&#xff0c;这对于买方或供应商企业而言是非常浪费时间的。如果还…

LIO-SAM代码解析——imageProjection.cpp

目录imageProjection.cpp1. ImageProjection类1.1. imuHandler1.2. odometryHandler1.3. cloudHandler⭐1.3.1. cachePointCloud&#xff1a; 点云消息缓存与检查1.3.2. deskewInfo() &#xff1a; 获得运动补偿信息1.3.2.1. imuDeskewInfo() &#xff1a; imu的补偿信息1.3.2.…

TOOM系统加强网络舆情监控的建议,如何加强网络舆情的引导和管控

网络舆情监控是指在互联网上通过技术手段&#xff0c;对网络上的舆情信息进行收集、整理、分析、评估和处理&#xff0c;以有效地识别、预测、处理网络舆情问题。网络舆情监控工作的目的是促进舆情健康&#xff0c;防止舆情危机。接下来简单了解TOOM系统加强网络舆情监控的建议…

Python基本语法与变量类型

一、Python基本语法 1、Python注释 Python 支持两种类型的注释&#xff0c;分别是单行注释和多行注释。 &#xff08;1&#xff09;单行注释 单行注释指的是从井号#开始&#xff0c;直到这行结束为止的所有内容都是注释。 # 注释内容&#xff08;2&#xff09;多行注释 Pyt…

ccflow-代码

报表设计目录概述需求&#xff1a;设计思路实现思路分析报表设计&#xff0c;流程运维系统&#xff08;三元log&#xff09;数据源管理和维护是否:debug状态. 0 表示不是, 1 是&#xff0c;如果系统发布后&#xff0c;请将此修改成0&#xff0c;以提高执行效率。在流程运行结束…

Python语言开发学习之使用Python预测天气

什么是wttr&#xff1f; 使用Python预测天气的第一步&#xff0c;我们要了解wttr是什么。wttr.in是一个面向控制台的天气预报服务&#xff0c;它支持各种信息表示方法&#xff0c;如面向终端的ANSI序列(用于控制台HTTP客户端(curl、httpie或wget))、HTML(用于web浏览器)或PNG(…

【微信小程序】解决点击(bindtap)和长按(bindlongtap)冲突

点击事件的执行&#xff1a; <button bindtap"bindtap" bindtouchstart"touchstart" bindtouchend"touchend">按钮</button>可以看到顺序为&#xff1a;touchstart → touchend → tap 长按事件的执行&#xff1a; <button bin…

Blender 渲染与后期处理

文章目录旋转环境贴图&#xff08;天空盒&#xff09;物体只渲染其他物体的阴影而不渲染自身渲染一个背景透明的图片在后期合成中&#xff0c;将渲染结果和一张图片合成到一起输出不同的通道方法一方法二后期制作景深效果渲染单个图层图层渲染单个图层旋转环境贴图&#xff08;…

对程序员超有用的网站!一定要收藏起来!

作为一名专业的程序员&#xff0c;我们应该利用各种渠道来扩充自己的知识。然后做一个技术高超的打工人&#xff01;&#xff08;&#xff09;然后用自己超高的技术&#xff0c;赚超多超多的money! (√) 但是要获取大量的信息就要有优质可靠的信息来源。今天我就把我珍藏的&…

CMOS图像传感器——深入ISO

在之前讲Dual Gain这一HDR技术时,有大致提到过ISO: HDR 成像技术学习(二)_沧海一升的博客-CSDN博客HDR成像技术介绍:staggered HDR、DOL-HDR、DCG,双原生ISO等。https://blog.csdn.net/qq_21842097/article/details/120904447 这一篇文章我们深入讲解一下。 通常…

IP协议详解

IP协议 IP协议格式&#xff1a; 4位版本号&#xff1a;指定IP协议的版本&#xff0c;对于IPv4来说&#xff0c;就是4。 4位首部长度&#xff1a;IP头部的长度是多少个32bit(4字节)&#xff0c;也就是 length * 4 的字节数。4bit表示最大的数字是15&#xff0c;因此IP头部最大…

学会这几招,轻松提升办公效率

技巧一&#xff1a;录屏 录屏需要使用“第三方工具/插件”吗&#xff1f;其实&#xff0c;PPT中有一个内置的“录屏”工具&#xff01; 使用PPT自带的“录屏”工具可以帮助我们快速录制电脑屏幕上的内容&#xff0c;录屏后的录屏结果会自动添加到PPT中&#xff0c;非常适合在PP…

JavaWeb_HTTP+Tomcat+Servlet

一、JavaWeb技术栈 B/S 架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器 架构模式&#xff0c;它的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把We…

第三章.逻辑回归—正确率/召回率/F1指标,非线性逻辑回归代码

第三章.逻辑回归 3.2 正确率/召回率/F1指标 正确率(Precision)和召回率(Recall)广泛应用于信息检索和统计学分类领域的两个度量值&#xff0c;用来评价结果的质量。 1.概念&#xff1a; 1).正确率&#xff1a; 检索出来的条目有多少是正确的 2).召回率&#xff1a; 所有正…

Notepad++ 编写html代码快捷键切换到浏览器查看

一、设置Notepad 快速启动浏览器并且运行html1.找到Notepad的安装路径&#xff0c;找到Notepad 的shortcuts.xml文件。2.如图所示&#xff0c;用记事本打开【千万不要用Notepad打开】。打开之后可以看到里面的代码。以启动连接 chrome浏览器为例&#xff0c;选择对应的chrome 代…

【金融学】Financial Markets

Financial MarketsClass1 Financial Markets IntroductionWhat is Financial MarketsFinancial Topics课程目标Class1 Financial Markets Introduction What is Financial Markets “金融不仅仅是关于赚钱&#xff0c;金融应该是关于使某事发生” ----Robert Shiller. Financi…

TCP的3次握手细节

一、什么是TCP的三次握手在网络数据传输中&#xff0c;传输层协议TCP是要建立连接的可靠传输&#xff0c;TCP建立连接的过程&#xff0c;我们称为三次握手。三次握手的具体细节1. 第一次握手&#xff1a;Client将SYN置1&#xff0c;随机产生一个初始序列号seq发送给Server&…

虹科方案|使用 Thunderbolt™ 实现 VMware vSAN™ 连接

一、引言ATTO的Thunderbolt支持VMware ESXi 和ThunderLink产品线&#xff0c;使我们能够创建基于Mac的vSphere设置&#xff0c;从而能够为我们的macOS服务器提供虚拟化服务。 将虚拟硬件、快照和Veeam备份与macOS服务器的简单性相结合&#xff0c;将改变SMB市场的游戏规则。二、…