【C语言初阶(14)】扫雷游戏(优化:标记地雷+自动展开)

文章目录

  • Ⅰ游戏规则
  • Ⅱ 游戏实现思路
  • Ⅲ 游戏实现步骤
    • ⒈菜单界面
    • ⒉创建棋盘
      • ① 创建两个棋盘
      • ② 防止数组越界
    • ⒊棋盘初始化
    • ⒋棋盘的打印
    • ⒌布置地雷
    • ⒍玩家排查雷实现步骤
    • ⒎计算 x,y 周围有多少雷
    • ⒏展开非雷区
    • ⒐标记地雷
    • ⒑取消标记
  • Ⅳ 模块化代码实现
    • ⒈test.c
    • ⒉game.h
    • ⒊game.c
  • Ⅴ 结果演示

Ⅰ游戏规则

在一个9×9(初级)、16×16(中级)、16×30(高级)或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个),再由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开的方块有地雷,则游戏结束。

游玩方式

  • 点击一个格子,如果这个位置不是地雷,会显示以这个坐标为中心形成的一个九宫格范围内有几个地雷。
  • 例如:你点了一个格子,显示出 1 ,就说明它周围的8的格子里有 1 个雷,是 2 就有两个雷,是 3 就有三个雷···以此类推。
  • 直到玩家未点击的格子数目等于地雷数,则排雷成功,游戏胜利。

在这里插入图片描述

Ⅱ 游戏实现思路

先把过程现在前面,方便后续直接看着这个步骤写出代码

  1. 创建菜单界面函数选择退出游戏或者是进入游戏。
  2. 创建两个二维数组用以存放布置好的雷的信息以及排查出的雷的信息。
  3. 进行棋盘的初始化。
  4. 打印出初始化好后的棋盘。
  5. 给十个地雷分配随机位置。
  6. 输入要排查地雷的坐标。
  7. 检查输入的坐标是不是地雷,字符 ‘1 ’表示该位置是地雷,字符 ‘ 0 ’ 表示该位置不是地雷。
    • 输入坐标的时候一共有 4 种结果:① 被雷炸死、② 输入的坐标重复、③ 输入的坐标范围越界、④ 排雷成功。
  8. 排查玩家输入的作标周围有几个雷。
  9. 最后,再回到步骤 1 ,选择 进入游戏 以及 退出游戏。

Ⅲ 游戏实现步骤

⒈菜单界面

  • 不管玩不玩游戏,都要提供一个菜单以供选择。
void menu()
{printf("|-------------------------------|\n");printf("|----------MineSweeper----------|\n");printf("|*******************************|\n");printf("|******   1.play 0.exit   ******|\n");printf("|*******************************|\n");printf("|是雷为 '1' --------- 非雷为 '0'|\n");printf("|-------------------------------|\n");
}

⒉创建棋盘

① 创建两个棋盘

为什么要创建两个棋盘?

  • 我们已经知道,在棋盘中字符 ‘ 1 ’ 表示该处为地雷;
  • 但同样的,如果输入的作标处不是雷,但是它的九宫格范围内有一个雷,该位置也应该显示一个字符 ‘ 1 ’ 来表示它附近有一个雷。
  • 那么问题莱纳,该怎么区分这个位置显示出的 ‘ 1 ’,表示的是雷的 1 还是它附近有一个雷的 1?

在这里插入图片描述

解决方法

  • 创建两个二位数组(棋盘),mine[][] 和 show[][]
  • mine 用来存放雷的位置信息(这个不能展示出来,不然雷在哪都给你瞧见了)。
  • show 用来存放排查出的雷的信息。

② 防止数组越界

  • 现在已经知道了,在输入坐标的时候会检查该作标的范围内的 8 个格子中有几个地雷。
  • 但是如果我输入的坐标在角落上,九宫格范围超过了棋盘范围,阁下该如何应对呢。

在这里插入图片描述

将二维数组扩大一圈

  • 将 9 * 9 棋盘上下左右各扩大一排,变成一个 11 * 11 的棋盘,这样就不会出现数组越界得问题了。
  • 当然,实际使用肯定还是在中间的 9 * 9 的棋盘上进行的。

在这里插入图片描述

扩张棋盘的好处

  1. 防止数组越界
  2. 符合用户习惯:从玩家角度输入坐标 ,刚好就是我们棋盘实际使用的范围。不用再对玩家输入的坐标进行操作了。

棋盘定义

//玩家看到的期盼大小
#define ROW 9 //行
#define COL 9 //列//棋盘的实际大小
#define ROWS ROW + 2 
#define COLS COL + 2
char mine[ROWS][COLS] = { 0 };		//存放布置好的地雷的信息
char show[ROWS][COLS] = { 0 };		//存放排查出的地雷的信息

⒊棋盘初始化

  • 将 mine 数组全部初始化为字符 ‘ 0 ’;
  • 将 show 数组全部初始化为字符 ‘ * ’。
  • 不在初始化函数设定初始化得值,而是将要初始化得内容作为参数传递给函数,让函数具有通用性。
//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;//board[i][j] = '0';如果这样弄函数就不具备通用性了}}
}

⒋棋盘的打印

  • 注意:棋盘只打印出 9 * 9 的内容;
  • 并且 mine 棋盘只有在游戏失败/游戏胜利时才会打印出来。
//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("\n----MineSweeper----\n");//打印列号for (j = 0; j <= col; j++){printf("%d ", j);}putchar('\n');//显示出的棋盘的行和列都从 1 开始for (i = 1; i <= row; i++){printf("%d ", i);//打印行号for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}putchar('\n');}printf("----MineSweeper----\n");}

效果展示

在这里插入图片描述

⒌布置地雷

  • 设置 10 个地雷,利用 rand 函数在雷盘上随机分配十个位置;
  • 分配好雷的位置全部改成字符 ‘ 1 ’。

game.h

#define EASY_COUNT 10 //雷的数量

game.c

//布雷
void set_mine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//10while (count)					//雷布完之后自然退出循环{int x = rand() % row + 1;	//1 - 9int y = rand() % col + 1;	//1 - 9if ('0' == board[x][y])		//该坐标还未布雷{board[x][y] = '1';count--;//这个要放在这里面,不然雷的布置的数量和设置的数量不一致}}

效果演示

在这里插入图片描述

⒍玩家排查雷实现步骤

  • 检查坐标处是不是雷,布置存放的是字符’1’,没有放置雷存放的是字符’0’。
  • 判断坐标输入合法性几种情况:
    • 很遗憾,你被炸死了!
    • 该位置已被排查过,请重新输入
    • 坐标非法,请重新输入
    • 恭喜你,排雷成功
  • 其中,在游戏胜利以及被雷炸死后会显示出雷区。
//排雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;//找到非雷的个数int operate = 0;while (win < ROW * COL - EASY_COUNT)//游戏赢了就退出循环{putchar('\n');printf("|------------------|\n");printf("|--- 1.排查地雷 ---|\n");printf("|--- 2.标记地雷 ---|\n");printf("|--- 3.取消标记 ---|\n");printf("|------------------|\n");printf("  请选择你的操作:");scanf("%d", &operate);if(1==operate){display_board(show, ROW, COL);printf("请输入要排查的坐标:");scanf("%d %d", &x, &y);//判断坐标是否合法if ((x >= 1 && x <= row) && (y >= 1 && y <= col)){if (show[x][y] != '*'){printf("该位置已被排查过,请重新输入\n");}if ('1' == mine[x][y])			//如果是雷{printf("\n很遗憾,你被炸死了\n");display_board(mine, ROW, COL);//挂了之后要展示雷的位置break;}else							//如果不是雷,就要统计周围有几个雷{spreed(mine, show, x, y);	//该坐标不是雷,传过去判断是否能展开display_board(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入\n");}}else if (2 == operate){mark_mine(show, ROW, COL);}else if (3 == operate){cancel_mark(show, ROW, COL);}}if (ROW * COL - EASY_COUNT == win){printf("\n恭喜你,排雷成功\n");display_board(mine, ROW, COL);}
}

游戏胜利条件

  • 未翻开的格子数等于雷数时,游戏胜利。

⒎计算 x,y 周围有多少雷

排查思路

  • 在存放地雷的数组 mine 内进行排查。
  • 将玩家输入的坐标周围那一圈 8 个位置的字符全部加起来,结果是多少就有多少个雷。
  • 将结果显示到 show 数组去。

但是又有个问题了

  • 我们往地雷数组里面存放的是字符 ‘ 1 ’ 以及字符 ‘ 0 ’,而不是普通的数字 1 和 0。
  • 如果将这些个玩楞加起来,结果肯定不是我们想要的雷的数量。

解决方法

  • 我们将每个方位得到的字符减去一个字符 ‘ 0 ’,就能得到正常的数字了。
    • 例如:‘ 1 ’ - ‘ 0 ’ = 1。
  • 所以,我们 x,y 周围 8 个方位的字符都加起来之后,再减去八个字符 ‘ 0 ’(8 * ‘ 0 ’)就是 x,y 周围雷的数量了。

在这里插入图片描述

//统计x,y周围有几个雷
int get_mine_count(char board[ROWS][COLS], int x, int y)
{return (board[x - 1][y] +board[x - 1][y - 1] +board[x][y - 1] +board[x + 1][y - 1] +board[x + 1][y] +board[x + 1][y + 1] +board[x][y + 1] +board[x - 1][y + 1] - 8 * '0');
}

⒏展开非雷区

  • 当我们在玩扫雷游戏的时候会发现,点击某个区域的时候会展开一大片区域。
  • 这是因为点击的这个作标周围八个格子都没有雷,并且这八个格子每个的展开范围内都有一片区域没有雷。
  • 就这样一层一层的展开之后,最后会展开一大片区域。

在这里插入图片描述

当排查 x,y 坐标时的展开条件

  1. 该坐标不是雷。
  2. 该坐标没有被排查过。
  3. 该坐标周围没有雷(该坐标显示的是 0 )。
  4. 该坐标的周围 8 个坐标是否也满足前两个条件(有没有感觉递归要来了)。

代码实现

//展开非雷区
void spreed(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{int i = 0;int j = 0;//限制在棋盘内展开,防止越界if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL)){int count = get_mine_count(mine, x, y);if (0 == count)//该坐标周围没有雷{show[x][y] = ' ';//现将该坐标置成空格for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if ('*' == show[i][j])//该坐标没有被排查过{//满足条件,展开递归spreed(mine, show, i, j);//将坐标从 x y 向外扩散//递归要传过去的新坐标是 i j 别把 x y 传过去了 (恼)}}}}else//周围有雷,结束展开{show[x][y] = count + '0';}}
}

效果演示

在这里插入图片描述

⒐标记地雷

  • 在扫雷游戏过程中,如果我们已经确定了某个位置是地雷,可以对该处进行标记。

在这里插入图片描述

  • 这里我们用 ‘ ! ’ 来作为标记符。
  • 当该位置没有被排查过时(不是 ‘ * ’),才可以将 ‘ ! ’ 赋给 show 数组的这个位置。

代码实现

//标记地雷
void mark_mine(char show[ROWS][COLS],int row, int col)
{int x = 0;int y = 0;display_board(show, ROW, COL);printf("请输入要标记的坐标:");scanf("%d %d", &x, &y);if ((x >= 1 && x <= row) && (y >= 1 && y <= col)){if ('!' == show[x][y]){printf("该坐标已被标记,请重新输入\n");}else if ('*' == show[x][y]){show[x][y] = '!';printf("标记成功\n");display_board(show, ROW, COL);}}else{printf("坐标非法,请重新输入\n");}
}

结果演示

在这里插入图片描述

⒑取消标记

  • 在 show 数组中,输入的坐标处如果是 ‘ ! ’,则能够取消坐标,否则重新输入坐标。
//取消标记
void cancel_mark(char show[ROWS][COLS], int row, int col)
{int i = 0;int x = 0;int y = 0;int count = 0;printf("请输入要取消多少个标记:");scanf("%d", &count);while(i < count){printf("请输入要取消标记的坐标:");scanf("%d %d", &x, &y);display_board(show, ROW, COL);if ((x >= 1 && x <= row) && (y >= 1 && y <= col)){//取消标记if ('!' == show[x][y]){show[x][y] = '*';printf("取消标记成功\n");display_board(show, ROW, COL);i++;//这玩意放的位置别搞错了}else if ('*' == show[x][y]){printf("该坐标未被标记,请重新输入作标\n");}}else{printf("坐标非法,请重新输入\n");}}
}

Ⅳ 模块化代码实现

⒈test.c

#include "game.h"void menu()
{printf("|-------------------------------|\n");printf("|----------MineSweeper----------|\n");printf("|*******************************|\n");printf("|******   1.play 0.exit   ******|\n");printf("|*******************************|\n");printf("|是雷为 '1' --------- 非雷为 '0'|\n");printf("|-------------------------------|\n");
}void game()//游戏的整个流程
{int  operate = 0;char mine[ROWS][COLS] = { 0 };		//存放布置好的地雷的信息char show[ROWS][COLS] = { 0 };		//存放排查出的地雷的信息init_board(mine, ROWS, COLS, '0');	//mine 数组在没有布雷时,都是 '0'init_board(show, ROWS, COLS, '*');	//show 数组在没有排查时,都是 '*'set_mine(mine, ROW, COL);			//将雷布置到中间的9*9的格子里去display_board(show, ROW, COL);		//只打印中间9*9的内容,不打印外圈find_mine(mine, show, ROW, COL);	//排雷
}int main()
{int input = 0;srand((unsigned int)time(NULL));	//设置随机数的生成起点do{menu();printf("\n请选择是否开始游戏:");scanf("%d", &input);switch (input){case 1:printf("\n开始游戏\n"); game(); break;case 0:printf("\n退出游戏\n"); break;default:printf("\n输入错误\n"); break;}} while (input);return 0;
}

⒉game.h

#include <time.h>
#include <stdio.h>
#include <stdlib.h>//玩家看到的棋盘大小
#define ROW 9 //行
#define COL 9 //列//棋盘的实际大小
#define ROWS ROW + 2 
#define COLS COL + 2#define EASY_COUNT 10 //雷的数量//初始化数组为指定的字符
void init_board(char board[ROWS][COLS], int rows, int cols,char set);//打印棋盘信息
void display_board(char board[ROWS][COLS], int row, int col);//布雷
void set_mine(char board[ROWS][COLS], int row, int col);//排雷
void find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int row, int col);//标记地雷
void mark_mine(char show[ROWS][COLS], int row, int col);//取消标记
void cancel_mark(char show[ROWS][COLS], int row, int col);//展开非雷区
void spreed(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);

⒊game.c

#include "game.h"//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;//board[i][j] = '0';如果这样弄函数就不具备通用性了}}
}//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("\n----MineSweeper----\n");//打印列号for (j = 0; j <= col; j++){printf("%d ", j);}putchar('\n');//显示出的棋盘的行和列都从 1 开始for (i = 1; i <= row; i++){printf("%d ", i);//打印行号for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}putchar('\n');}printf("----MineSweeper----\n");
}//布雷
void set_mine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//10while (count)					//雷布完之后自然退出循环{int x = rand() % row + 1;	//1 - 9int y = rand() % col + 1;	//1 - 9if ('0' == board[x][y])		//该坐标还未布雷{board[x][y] = '1';count--;//这个要放在这里面,不然雷的布置的数量和设置的数量不一致}}
}//统计x,y周围有几个雷
int get_mine_count(char board[ROWS][COLS], int x, int y)
{return (board[x - 1][y] +board[x - 1][y - 1] +board[x][y - 1] +board[x + 1][y - 1] +board[x + 1][y] +board[x + 1][y + 1] +board[x][y + 1] +board[x - 1][y + 1] - 8 * '0');
}//排雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;//找到非雷的个数int operate = 0;while (win < ROW * COL - EASY_COUNT){putchar('\n');printf("|------------------|\n");printf("|--- 1.排查地雷 ---|\n");printf("|--- 2.标记地雷 ---|\n");printf("|--- 3.取消标记 ---|\n");printf("|------------------|\n");printf("  请选择你的操作:");scanf("%d", &operate);if(1==operate){display_board(show, ROW, COL);printf("请输入要排查的坐标:");scanf("%d %d", &x, &y);//判断坐标是否合法if ((x >= 1 && x <= row) && (y >= 1 && y <= col)){if (show[x][y] != '*'){printf("该位置已被排查过,请重新输入\n");}if ('1' == mine[x][y])			//如果是雷{printf("\n很遗憾,你被炸死了\n");display_board(mine, ROW, COL);//挂了之后要展示雷的位置break;}else							//如果不是雷,就要统计周围有几个雷{//int count = get_mine_count(mine, x, y);//show[x][y] = count + '0';spreed(mine, show, x, y);	//该坐标不是雷display_board(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入\n");}}else if (2 == operate){mark_mine(show, ROW, COL);}else if (3 == operate){cancel_mark(show, ROW, COL);}}if (ROW * COL - EASY_COUNT == win){printf("\n恭喜你,排雷成功\n");display_board(mine, ROW, COL);}
}//标记地雷
void mark_mine(char show[ROWS][COLS],int row, int col)
{int x = 0;int y = 0;display_board(show, ROW, COL);printf("请输入要标记的坐标:");scanf("%d %d", &x, &y);if ((x >= 1 && x <= row) && (y >= 1 && y <= col)){if ('!' == show[x][y]){printf("该坐标已被标记,请重新输入\n");}else if ('*' == show[x][y]){show[x][y] = '!';printf("标记成功\n");display_board(show, ROW, COL);}}else{printf("坐标非法,请重新输入\n");}
}//取消标记
void cancel_mark(char show[ROWS][COLS], int row, int col)
{int i = 0;int x = 0;int y = 0;int count = 0;printf("请输入要取消多少个标记:");scanf("%d", &count);while(i < count){printf("请输入要取消标记的坐标:");scanf("%d %d", &x, &y);display_board(show, ROW, COL);if ((x >= 1 && x <= row) && (y >= 1 && y <= col)){//取消标记if ('!' == show[x][y]){show[x][y] = '*';printf("取消标记成功\n");display_board(show, ROW, COL);i++;}else if ('*' == show[x][y]){printf("该坐标未被标记,请重新输入作标\n");}}else{printf("坐标非法,请重新输入\n");}}
}//展开非雷区
void spreed(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{int i = 0;int j = 0;//限制在棋盘内展开,防止越界if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL)){int count = get_mine_count(mine, x, y);if (0 == count)								//该坐标周围没有雷{show[x][y] = ' ';for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if ('*' == show[i][j])			//该坐标没有被排查过{spreed(mine, show, i, j);	//将坐标从 x y 向外扩散//递归要传过去的新坐标是 i j 别把 x y 传过去了 (恼)}}}}else										//周围有雷,结束展开{show[x][y] = count + '0';}}
}

Ⅴ 结果演示

被雷炸死

在这里插入图片描述

游戏胜利

  • 这里为了提升效率,我们把雷的数量弄到 80 个并先展示雷区。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.1Java EE——Spring介绍

一、Spring概述 String框架的核心技术 Spring是由Rod Johnson组织和开发的一个分层的Java SE/EE一站式&#xff08;full-stack&#xff09;轻量级开源框架。它最为核心的理念是IoC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;&#xff0c;其中&…

《前端开发 实践之 腾讯地图API 学习》

目录 腾讯地图基础入门方式一方式二 事件监听监听地图瓦片加载完成事件 移除缩放控件 & 旋转控件 & 比例尺控件初始化marker图层创建信息窗点击地图拾取坐标打点标记反解析成详细地址根据输入详细地址 反解析成经纬度 腾讯地图 腾讯地图API学习-官方地址&#xff1a;ht…

RabbitMQ系列(14)--Topics交换机的简介与实现

1、Topics交换机的介绍 Topics交换机能让消息只发送往绑定了指定routingkey的队列中去&#xff0c;不同于Direct交换机的是&#xff0c;Topics能把一个消息往多个不同的队列发送&#xff1b;Topics交换机的routingkey不能随意写&#xff0c;必须是一个单词列表&#xff0c;并以…

23款奔驰GLE450动感型升级柏林之声音响系统,体验不一样的感觉

奔驰GLE450动感型升级柏林之声的音响效果自然非同凡响&#xff0c;在人声、交响乐音乐厅感受方面都有非常逼真的现场感受&#xff0c;结合柏林之声的界面调整&#xff0c;可以在不同方位体验的高保真的音乐之享&#xff01; 小柏林音响总共13个喇叭1台功放由4个高音、4个中音、…

13 个最佳免费 PDF 编辑器清单

您正在寻找一款真正免费的 PDF 编辑器&#xff0c;不仅可以编辑和添加文本&#xff0c;还可以更改图像、添加您自己的图形、签署您的名字、填写表格等等&#xff1f;您来对地方了&#xff1a;我研究了这些类型的应用程序&#xff0c;以得出您正在寻找的内容的列表。 其中一些是…

Linux·图解Linux网络包接收过程

因为要对百万、千万、甚至是过亿的用户提供各种网络服务&#xff0c;所以在一线互联网企业里面试和晋升后端开发同学的其中一个重点要求就是要能支撑高并发&#xff0c;要理解性能开销&#xff0c;会进行性能优化。而很多时候&#xff0c;如果你对Linux底层的理解不深的话&…

hadoop -- Hbase

HBase是一个分布式、可扩展、面向列的数据存储&#xff08;百万级别列&#xff09;、可伸缩、高可靠性、实时读写的NoSQL 数据库。 HBase利用 Hadoop的 HDFS作为其文件存储系统&#xff0c; 利用MapReduce 来处理HBase中的海量数据&#xff0c; 利用Zookeeper作为分布式协同服…

《Redis 核心技术与实战》课程学习笔记(七)

切片集群&#xff1a;数据增多了&#xff0c;是该加内存还是加实例&#xff1f; 切片集群&#xff0c;也叫分片集群&#xff0c;就是指启动多个 Redis 实例组成一个集群&#xff0c;然后按照一定的规则&#xff0c;把收到的数据划分成多份&#xff0c;每一份用一个实例来保存。…

手机屏幕点胶区域定位机器视觉系统软硬件方案

【检测目的】 点胶之前定位产品&#xff0c;找寻效果较明显的边缘位置 【样品一】 两张图片为一个产品点胶部位的左边和右边。通过边缘A和边缘B这两条线可以找出交点位置做为定位点&#xff08;产品不平会造成图像模糊的情况&#xff09; 【样品二】 两张图片为一个产品点胶部位…

【Zabbix 监控 Windows 系统,Java应用,SNMP】

目录 一、Zabbix 监控 Windows 系统1、下载 Windows 客户端 Zabbix agent 22、安装客户端&#xff0c;配置3、在服务端 Web 页面添加主机&#xff0c;关联模板 二、Zabbix 监控 java 应用1、客户端开启 java jmxremote 远程监控功能1、配置 java jmxremote 远程监控功能2、启动…

Python算法笔记(1)-时间复杂度、空间复杂度

Python算法笔记&#xff08;1&#xff09;-时间复杂度 1.时间复杂度 时间复杂度是一个描述算法的运行时间的一个函数&#xff0c;它描述了算法的运行时间和输入数据的规模之间的关系&#xff0c;时间复杂度的表示方法用O表示&#xff0c;时间复杂度也用来考察输入值无限趋近无…

【NLP】基础工程:词嵌入

一、说明 词嵌入是高维向量空间中单词或短语的数字表示,其中向量之间的几何关系捕获相应单词之间的语义和句法相似性。这些表示使机器学习模型能够以更有意义的方式理解和处理自然语言。 在传统的 NLP 方法中,单词是使用稀疏的 one-hot 编码向量来表示的,其中每个单词在大词…