当前位置: 首页 > article >正文

C 语 言 --- 扫 雷 游 戏(初 阶 版)

C 语 言 --- 扫 雷 游 戏 初 阶 版

  • 代 码 全 貌 与 功 能 介 绍
  • 扫雷游戏的功能说明
  • 游 戏 效 果 展 示
  • 游 戏 代 码 详 解
    • game.h
    • test.c
    • game.c
  • 总结

💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言
💡个 人 主 页:@笑口常开xpr 的 个 人 主 页
📚系 列 专 栏:C 启新程
✨代 码 趣 语:每 个 人 都 应 该 学 习 编 程,因 为 它 教 会 你 如 何 思 考。
💪代 码 千 行,始 于 坚 持,每 日 敲 码,进 阶 编 程 之 路。
📦gitee 链 接:gitee

在这里插入图片描述

       在 编 程 的 世 界 里,每 一 行 代 码 都 可 能 隐 藏 着 无 限 的 可 能 性 。你 是 否 想 过,一 个 小 小 的 程 序 究 竟 能 改 变 什 么?它 可 以 是 解 决 复 杂 问 题 的 工 具 ,也 可 以 是 实 现 梦 想 的 桥 梁。今 天,就 让 我 们 一 起 走 进 C 语 言 扫 雷 的 世 界,探 索 它 的 无 限 潜 力。

网页版扫雷游戏

代 码 全 貌 与 功 能 介 绍


         整 个 游 戏 项 目 由 三 个 主 要 文 件 构 成:game.h、test.c 和 game.c。这 种 多 文 件 的 架 构 设 计,有 助 于 将 不 同 功 能 模 块 分 离,提 高 代 码 的 可 读 性、可 维 护 性 与 可 扩 展 性 。

game.h

game.h 包 含 了 游 戏 所 需 的 头 文 件 引 用、常 量 定 义 以 及 函 数 声 明。

test.c

test.c 是游戏的主逻辑文件,负责处理用户输入和游戏流程的控制;

game.c

game.c 则实现了游戏的具体功能函数。

下 面 展 示完整代码

读 者 可 以 将 这 段 代 码 复 制 到 自 己 的 编 译 器 中 运 行:

game.h

#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);//打印棋盘
void DisPlayBoard(char board[ROWS][COLS], int row, int col);//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);//排查雷
void FindMine(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col);

test.c

#include "game.h"
void menu()
{printf("**********************************\n");printf("**********    1.play     *********\n");printf("**********    0.exit     *********\n");printf("**********************************\n");
}void game()
{//需要存放布置雷的信息,需要存放排查出的雷的信息 -- 需要2个二维数组//排查时,防止坐标越界,要给数组行,列各加2char mine[ROWS][COLS] = { 0 };//布置好的雷的信息char show[ROWS][COLS] = { 0 };//排查出的雷的信息//1.初始化棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//2.打印棋盘//DisPlayBoard(mine, ROW, COL);DisPlayBoard(show, ROW, COL);//3.布置雷SetMine(mine, ROW, COL);//DisPlayBoard(mine, ROW, COL);//4.排查雷FindMine(mine, show, ROW, COL);
}
void test()
{srand((unsigned int)time(NULL));int input = 0;do{	//打印菜单menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("扫雷游戏\n");//实现扫雷游戏的逻辑game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);
}
int main()
{//实现游戏的主逻辑test();return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h"void InitBoard(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;}}
}
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("----------扫雷----------\n");for (i = 0; i <= col; i++){if (i == 0){printf("  ");continue;}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");}printf("----------扫雷----------\n");
}
void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){//1.产生随机的坐标1~9int x = rand() % row + 1;int y = rand() % col + 1;//2.在坐标中放置雷if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]+ mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1]+ mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0');
}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < (row * col - EASY_COUNT)){printf("请输入要排查的坐标:> ");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标被排查过了\n");continue;}if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisPlayBoard(mine, ROW, COL);break;}else{//统计一下坐标int n = get_mine_count(mine, x, y);show[x][y] = n + '0';DisPlayBoard(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入\n");}}if (win == (row * col - EASY_COUNT)){printf("恭喜你,排雷成功\n");DisPlayBoard(mine, ROW, COL);}
}

扫雷游戏的功能说明


  • 使 用 控 制 台 实 现 经 典 的 扫 雷 游 戏
  • 游 戏 可 以 通 过 菜 单 实 现 继 续 玩 或 者 退 出 游 戏
  • 扫 雷 的 棋 盘 是 9 * 9 的 格 子
    默 认 随 机 布 置 10 个 雷
  • 可 以 排 查 雷
    如 果 位 置 不 是 雷,就 显 示 周 围 有 几 个 雷
    如 果 位 置 是 雷,就 炸 死 游 戏 结 束
    把 除 10 个 雷 之 外 的 所 有 非 雷 都 找 出 来,排 雷 成 功,游 戏 结 束

游 戏 效 果 展 示


游 戏 启 动 后,玩 家 看 到 简 洁 的 主 菜 单,选 择 1 开 始 游 戏,反 之,选 择 0 退 出 游 戏。

在这里插入图片描述

此 时,空 棋 盘 呈 现 眼 前,9 × 9 的 棋 盘 格 等 待 着 玩 家 进 行 排 查 雷。

在这里插入图片描述

         玩 家 输 入 下 棋 坐 标 后,程 序 会 验 证 坐 标 合 法 性。若 坐 标 合 法 且 对 应 位 置 没 有 雷,将 会 显 示 棋 盘 等 待 玩 家 下 一 次 排 查 雷;如 果 坐 标 是 雷,玩 家 会 收 到 “ 很 遗 憾 ,你 被 炸 死 了 ” 的 提 示; 若 坐 标 不 合 法 ,玩 家 会 收 到 “ 坐 标 非 法 ” 或 “ 该 坐 标 被 排 查 过 了” 的 提 示,需 重 新 输 入 坐 标。

在这里插入图片描述

         玩 家 不 断 根 据 游 戏 规 则 排 查 雷 直 到 雷 全 部 排 查 完 ,在 这 个 过 程 中,程 序 不 断 检 查 玩 家 输 入 的 坐 标 是 否 是 雷 以 及 雷 是 否 全 部 排 查 完。若 玩 家 把 雷 全 部 排 查 完,程 序 立 即 宣 告 “ 恭 喜 你,排 雷 成 功 ”,游 戏 结 束。

在这里插入图片描述


游 戏 代 码 详 解


game.h

#pragma once

防 止 重 复 包 含

         #pragma once 指 令 确 保 这 个 头 文 件 在 整 个 项 目 中 只 会 被 包 含 一 次。在 大 型 项 目 中,若 多 个 源 文 件 包 含 同 一 个 头 文 件,若 不 加 以 限 制,头 文 件 中 的 内 容 会 被 重 复 编 译,导 致 错 误。使 用 此 指 令 可 避 免 这 种 情 况。

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

引 入 标 准 库

         #include <stdio.h> 引 入 标 准 输 入 输 出 库,使 得 代 码 能 够 使 用 如 printf(用 于 输 出 信 息)和 scanf( 用 于 获 取 用 户 输 入)等 函 数。#include <stdlib.h> 引 入 标 准 库,为 rand 函 数( 随 机 布 置 雷 时 用 到 )等 提 供 支 持。

#define ROW 9
#define COL 9#define ROWS ROW + 2
#define COLS COL + 2//雷的数量
#define EASY_COUNT 10

常 量 定 义

         定 义 了 游 戏 棋 盘 的 大 小 ROW 和 COL 为 9,为 了 防 止 排 查 雷 时 数 组 越 界,定 义 了 ROWS 和 COLS 为 ROW + 2 和 COL + 2。同 时,还 定 义 了 初 级 难 度 下 雷 的 数 量 EASY_COUNT 为 10。

//实现扫雷游戏中的函数声明
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, 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 board[ROWS][COLS], char show[ROWS][COLS], int row, int col);

函 数 声 明

         声 明 了 四 个 关 键 函 数,分 别 是 初 始 化 棋 盘 函 数 InitBoard、打 印 棋 盘 函 数 DisPlayBoard、布 置 雷 函 数 SetMine 和 排 查 雷 函 数 FindMine。


test.c


#define _CRT_SECURE_NO_WARNINGS 1 

消 除 安 全 警 告

         用 于 消 除 因 使 用 了 一 些 不 安 全 的 函 数( 如 scanf)而 产 生 的 编 译 警 告。在 较 新 的 编 译 器 中,为 了 安 全 考 虑,对 一 些 函 数 的 使 用 会 给 出 警 告 , 通 过 定 义 这 个 宏 可 屏 蔽 这 些 警 告。

void menu(){printf("*******************************\n");printf("************  1.play  *********\n");printf("************  0.exit  *********\n");printf("*******************************\n");}

menu 函 数

         menu 函 数 用 于 打 印 游 戏 主 菜 单。通 过 printf 函 数 输 出 一 个 包 含“ 1.play ”(开 始 游 戏)和 “0.exit”( 退 出 游 戏 )选 项 的 菜 单,为 玩 家 提 供 操 作 选 择 界 面。

void game()
{//需要存放布置雷的信息,需要存放排查出的雷的信息 -- 需要2个二维数组//排查时,防止坐标越界,要给数组行,列各加2char mine[ROWS][COLS] = { 0 };//布置好的雷的信息char show[ROWS][COLS] = { 0 };//排查出的雷的信息//1.初始化棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//2.打印棋盘//DisPlayBoard(mine, ROW, COL);DisPlayBoard(show, ROW, COL);//3.布置雷SetMine(mine, ROW, COL);//DisPlayBoard(mine, ROW, COL);//4.排查雷FindMine(mine, show, ROW, COL);
}

game 函 数

         game 函 数 按 照 游 戏 的 逻 辑 顺 序,依 次 完 成 了 棋 盘 初 始 化、显 示 初 始 棋 盘、布 置 雷 以 及 让 玩 家 进 行 扫 雷 操 作 等 关 键 步 骤,是 实 现 整 个 扫 雷 游 戏 功 能 的 核 心 函 数。

void test()
{srand((unsigned int)time(NULL));int input = 0;do{   //打印菜单menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("扫雷游戏\n");//实现扫雷游戏的逻辑game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);
}

test 函 数

         test 函 数 通 过 srand 初 始 化 随 机 数 种 子,然 后 进 入 一 个 循 环,显 示 游 戏 菜 单,根 据 用 户 输 入 选 择 开 始 游 戏 或 退 出 游 戏。选 择 开 始 游 戏 时 调 用 game 函 数,game 函 数 依 次 调 用 上 述 功 能 函 数 来 完 成 游 戏 的 初 始 化、布 置 雷 和 排 查 雷 等 操 作。

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

main 函 数

main 函 数 作 为 程 序 入 口,调 用 test() 函 数 启 动 游 戏 流 程,最 后 return 0; 表 示 程 序 正 常 结 束 。


game.c


void InitBoard(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;}}
}

初 始 化 棋 盘( InitBoard 函 数 )

         该 函 数 接 受 棋 盘 数 组、行 数、列 数 和 初 始 化 字 符 作 为 参 数,通 过 两 层 循 环 将 棋 盘 数 组 的 每 个 元 素 初 始 化 为 指 定 字 符。

void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("----------扫雷----------\n");for (i = 0; i <= col; i++){if (i == 0){printf("  ");continue;}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");}printf("----------扫雷----------\n");
}

打 印 棋 盘( DisPlayBoard 函 数 )

         此 函 数 用 于 在 控 制 台 打 印 棋 盘。先 打 印 棋 盘 的 表 头( 列 号 ),然 后 逐 行 打 印 棋 盘 的 内 容,包 括 行 号 和 每 个 格 子 的 字 符。

void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){//1.产生随机的坐标1~9int x = rand() % row + 1;int y = rand() % col + 1;//2.在坐标中放置雷if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}

布 置 雷( SetMine 函 数 )

         该 函 数 通 过 随 机 生 成 坐 标,并 在 相 应 位 置 放 置 雷( 将 字 符 设 置 为 ‘1’),直 到 雷 的 数 量 达 到 EASY_COUNT。

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < (row * col - EASY_COUNT)){printf("请输入要排查的坐标:> ");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标被排查过了\n");continue;}if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisPlayBoard(mine, ROW, COL);break;}else{//统计一下坐标int n = get_mine_count(mine, x, y);show[x][y] = n + '0';DisPlayBoard(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入\n");}}if (win == (row * col - EASY_COUNT)){printf("恭喜你,排雷成功\n");DisPlayBoard(mine, ROW, COL);}
}

排 查 雷( FindMine 函 数 )

         玩 家 输 入 坐 标 后,函 数 会 检 查 坐 标 的 合 法 性 和 是 否 已 被 排 查 过 。如 果 坐 标 合 法 且 未 被 排 查,判 断 该 位 置 是 否 为 雷,若 是 则 游 戏 失 败,否 则 统 计 周 围 雷 的 数 量 并 显 示 在 显 示 棋 盘 上,直 到 所 有 非 雷 格 子 都 被 排 查 出 来 则 游 戏 胜 利。

在这里插入图片描述


总结


       通 过 这 个 简 单 的 扫 雷 游 戏,我 们 不 仅 实 践 了 C 语 言 中 的 基 本 语 法,如 变 量 定 义、循 环 结 构、条 件 判 断 和 函 数 调 用,还 学 习 了 如 何 使 用 随 机 数 生 成 函 数 和 输 入 输 出 函 数。希 望 这 篇 博 客 能 帮 助 你 更 好 地 理 解 C 语 言 编 程,激 发 你 在 编 程 世 界 中 不 断 探 索 和 创 新 的 热 情 。

相关文章:

C 语 言 --- 扫 雷 游 戏(初 阶 版)

C 语 言 --- 扫 雷 游 戏 初 阶 版 代 码 全 貌 与 功 能 介 绍扫雷游戏的功能说明游 戏 效 果 展 示游 戏 代 码 详 解game.htest.cgame.c 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &#x1f4a1;个 人 主…...

WebDeveloper靶机详解

一、主机发现 arp-scan -l靶机ip为192.168.55.163 二、端口扫描、目录枚举、漏洞扫描、指纹识别 2.1端口扫描 nmap --min-rate 10000 -p- 192.168.55.163发现并无特殊端口开放 扫描一下UDP端口 nmap -sU --min-rate 10000 -p- 192.168.55.163没有扫描到UDP端口 2.2目录枚…...

Cursor IDE 入门指南

什么是 Cursor? Cursor 是一款集成了 AI 功能的现代代码编辑器&#xff0c;基于 VSCode 开发&#xff0c;专为提高开发效率而设计。它内置强大的 AI 助手功能&#xff0c;能够理解代码、生成代码、解决问题&#xff0c;帮助开发者更快、更智能地完成编程任务。 基础功能 1.…...

来源于胡椒的亚甲二氧桥CYP450-文献精读119

Piper nigrum CYP719A37 Catalyzes the Decisive Methylenedioxy Bridge Formation in Piperine Biosynthesis 胡椒 (Piper nigrum) CYP719A37 催化胡椒碱生物合成中关键的亚甲二氧桥形成 摘要 胡椒 (Piper nigrum) 是世界上最受欢迎的香料之一。其主要辛辣成分胡椒碱 (piper…...

STM32八股【1】-----启动流程和startup文件理解

启动流程 知识点 MCU 上电复位。MSP从向量表第0个地址读取一个32位&#xff08;2字节&#xff09;的值并保存&#xff0c;该值为栈顶地址。PC计数器从第1个地址读取一个两字节的值并保存&#xff0c;该值为程序入口&#xff0c;一般是Reset_Handler。想了解FLASH地址映射可以…...

Docker与K8S是什么该怎么选?

用了很久的容器化&#xff0c;最近突然看到一个问题问&#xff1a; docker和K8S究竟有什么区别&#xff0c;到底该怎么选&#xff1f;我认真思考了一会&#xff0c;发现一时间还真说不明白&#xff0c;于是就研究了一段时间发布今天的博文&#xff01; Docker vs Kubernetes&a…...

梦回杭州...

她对我说&#xff0c;烟雨中的西湖更别有情趣&#xff0c;我也怀着对‘人间天堂’的憧憬踏上了向往之旅。第一次亲密接触没有感觉中那么好&#xff0c;现在想起来是那时的人和心情都没能安静下来&#xff0c;去慢慢品味它的美。 六下杭州&#xff0c;亲历每一片风景&#xff0c…...

NAT 实验:多私网环境下 NAPT、Easy IP 配置及 FTP 服务公网映射

NAT基本概念 定义&#xff1a;网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是一种将私有&#xff08;保留&#xff09;地址转化为合法公网 IP 地址的转换技术&#xff0c;它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。作…...

SEED XSS 实验环境搭建步骤《精简版》

目录 1. 启动 SEED Ubuntu VM 2. 配置 /etc/hosts 3. 下载并解压 Labsetup.zip 4. 使用 Docker Compose 启动实验环境 5. 确保容器正常运行 6. 访问 Elgg Web 应用 7. 账户信息 8. 进入容器内部 9.实验环境搭建完成 &#x1f389; 10. 关闭实验 11.&#x1f4a1; 重…...

YOLO数据集分割训练集、测试集和验证集

记录一下自己的分割代码。 注意&#xff1a; 这是在windows环境&#xff0c;请Linux的同学们注意。标签为txt&#xff0c;图像为jpg&#xff0c;其他的我没试过喔。 训练集、验证集、测试集&#xff08;7:2:1&#xff09; import os import shutil import random from tqdm…...

Debug-037-table列表勾选回显方案

效果展示&#xff1a; 图1 图2 最近实现一个支持勾选的el-table可以回显之前勾选项的功能。实现了一个“编辑”的功能&#xff1a; 在图1中的列表中有三行数据&#xff0c;当点击“更换设备”按钮时&#xff0c;打开抽屉显示el-table组件如图2所示&#xff0c;可以直接回显勾选…...

使用 libevent 构建高性能网络应用

使用 libevent 构建高性能网络应用 在现代网络编程中&#xff0c;高性能和可扩展性是开发者追求的核心目标。为了实现这一目标&#xff0c;许多开发者选择使用事件驱动库来管理 I/O 操作和事件处理。libevent 是一个轻量级、高性能的事件通知库&#xff0c;广泛应用于网络服务…...

人脸表情识别系统分享(基于深度学习+OpenCV+PyQt5)

最近终于把毕业大论文忙完了&#xff0c;众所周知硕士大论文需要有三个工作点&#xff0c;表情识别领域的第三个工作点一般是做一个表情识别系统出来&#xff0c;如下图所示。 这里分享一下这个表情识别系统&#xff1a; 采用 深度学习OpenCVPyQt5 构建&#xff0c;主要功能包…...

AtCoder - arc086_d Shift and Decrement分析与实现

分析与思路 可以把操作流程表示成下图 以进行四次除法操作为例&#xff1a; 这里有一个关键点&#xff1a;对于每个p_i (0< i <x-1) &#xff0c;x是除法操作的次数&#xff0c;如果p_i>2&#xff0c;可以将2个p_i的减法操作去掉&#xff0c;在p_(i1)中增加一个减法…...

学习111

项目名称项目简介主要功能技术原理GitHub地址browser-use智能浏览器工具&#xff0c;让AI像人类一样操作浏览器&#xff0c;实现网页自动化网页浏览与操作、多标签页管理、视觉识别与内容提取、操作记录与重复执行、自定义动作支持、主流LLM模型支持为大语言模型服务的创新Pyth…...

Android Jetpack Compose介绍

Android Jetpack Compose Android Jetpack Compose 是 Google 推出的现代 UI 工具包&#xff0c;用于以声明式的方式构建 Android 应用的 UI。它摒弃了传统的 XML 布局方式&#xff0c;完全基于 Kotlin 编写&#xff0c;提供了更简洁、更强大的 UI 开发体验。以下是 Compose 的…...

tcping 命令的使用,ping IP 和端口

1. ‌Windows系统安装‌ ‌下载tcping工具‌&#xff1a;根据系统位数&#xff08;32位或64位&#xff09;下载对应的tcping.exe文件。‌安装步骤‌&#xff1a; 将下载的tcping.exe文件复制到C:\Windows\System32目录下。如果下载的是64位版本&#xff0c;需将文件名改为tcpi…...

天地图InfoWindow插入React自定义组件

截至2025年03月21日天地图的Marker不支持添加Label; 同时Label和Icon是不支持自定义HTMLElement只支持String&#xff1b;目前只有InfoWindow支持自定义HTMLElement; 效果图 React核心api import ReactDOM from react-dom/client const content document.createElement(div);…...

003-掌控命令行-CLI11-C++开源库108杰

首选的现代C风格命令行参数解析器! &#xff08;本课程包含两段教学视频。&#xff09; 以文件对象监控程序为实例&#xff0c;五分钟实现从命令行读入多个监控目标路径&#xff1b;区分两大时机&#xff0c;学习 CLI11 构建与解析参数两大场景下的异常处理&#xff1b;区分三…...

理解 Node.js 中的 process`对象与常用操作

理解 Node.js 中的 process 对象与常用操作 在 Node.js 中&#xff0c;process 是一个全局对象&#xff0c;提供了与当前 Node.js 进程相关的信息和操作。无论是获取进程信息、处理信号、访问环境变量&#xff0c;还是控制进程行为&#xff0c;process 都是不可或缺的工具。 看…...

鸿蒙HarmonyOS NEXT应用崩溃分析及修复

鸿蒙HarmonyOS NEXT应用崩溃分析及修复 如何保证应用的健壮性&#xff0c;其中一个指标就是看崩溃率&#xff0c;如何降低崩溃率&#xff0c;就需要知道存在哪些崩溃&#xff0c;然后对症下药&#xff0c;解决崩溃。那么鸿蒙应用中存在哪些崩溃类型呢&#xff1f;又改如何解决…...

【conda activate无效】 conda: error: argument COMMAND: invalid choice: ‘activate‘

conda activate失效了 在使用conda activate时出现报错&#xff1a; usage: conda [-h] [-v] [--no-plugins] [-V] COMMAND ... conda: error: argument COMMAND: invalid choice: activate (choose from clean, compare, config, create, info, init, install, list, notice…...

Redis + 布隆过滤器解决缓存穿透问题

Redis 布隆过滤器解决缓存穿透问题 1. Redis 布隆过滤器解决缓存穿透问题 &#x1f4cc; 什么是缓存穿透&#xff1f; 缓存穿透指的是查询的数据既不在缓存&#xff0c;也不在数据库&#xff0c;导致每次查询都直接访问数据库&#xff0c;增加数据库压力。 例如&#xff1…...

机器学习——分类、回归、聚类、LASSO回归、Ridge回归(自用)

纠正自己的误区&#xff1a;机器学习是一个大范围&#xff0c;并不是一个小的方向&#xff0c;比如&#xff1a;线性回归预测、卷积神经网络和强化学都是机器学习算法在不同场景的应用。 机器学习最为关键的是要有数据&#xff0c;也就是数据集 名词解释&#xff1a;数据集中的…...

HarmonyOS鸿蒙开发 BuilderParam在父组件的Builder的点击事件报错:Error message:is not callable

HarmonyOS鸿蒙开发 BuilderParam在父组件的Builder的点击事件报错&#xff1a;Error message:is not callable 最近在鸿蒙开发过程中&#xff0c;UI做好了&#xff0c;根据列表item进行点击跳转&#xff0c;报错了 报错信息如下 Error message:is not callable Stacktrace:at…...

【canvas】一键自动布局:如何让流程图节点自动找到最佳位置

一键自动布局&#xff1a;如何让流程图节点自动找到最佳位置 引言 在流程图、拓扑图和系统架构图设计中&#xff0c;节点布局往往是最令人头疼的问题。如果手动调整每个节点位置&#xff0c;不仅耗时费力&#xff0c;还难以保证美观性和一致性。本文将深入解析如何实现自动布…...

[每周一更]-(第137期):Go + Gin 实战:Docker Compose + Apache 反向代理全流程

文章目录 **1. Go 代码示例&#xff08;main.go&#xff09;****2. Dockerfile 多段构建**3.构建 Docker 镜像**4. docker-compose.yml 直接拉取镜像****5. 运行容器****6. 测试 API**7、配置域名访问**DNS解析&#xff1a;将域名转换为IP地址****DNS寻址示例** 8.错误记录 访问…...

HTTPS 加密过程详解

HTTPS 详解及其加密过程流程框架 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种基于 HTTP 协议的安全通信协议&#xff0c;通过 SSL/TLS 协议对传输数据进行加密和身份验证&#xff0c;解决了 HTTP 明文传输的安全隐患。以下是其核心原理和加密流程的…...

SpringCache小记

Spring Cache 小记 官方文档&#xff1a;https://springdoc.cn/spring-cache-tutorial/ 基础知识 常用注解 EnableCaching&#xff1a;开启缓存功能&#xff0c;一般放在启动类上。 Cacheable&#xff1a;表示该方法支持缓存。当调用被注解的方法时&#xff0c;如果对应的键已…...

Web-Machine-N7靶机通关攻略

获取靶机ip arp-scan -l 端口扫描 nmap xxxx 访问80端口发现没用 扫描目录 gobuster dir -u http:/192.168.117.160 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium,txt -x php,html,txt ,zip 打开exploit.html 点击F12&#xff0c;修改localhost为靶机ip&#…...