项目实战——C语言扫雷游戏

news2025/6/7 1:10:51


这是一款9*9的扫雷游戏

扫雷游戏

  • 1.需求分析
  • 2.程序框架设计
  • 3.分函数实现
    • 打印游戏菜单界面
    • 游戏主逻辑函数
    • 程序主入口
    • 初始化游戏棋盘
    • 随机布置地雷
    • 显示当前棋盘状态
    • 计算指定位置周围的地雷数量
    • 玩家排雷主逻辑
  • 4.分文件实现
    • (1)test.c
    • (2)game.c
    • (3)game.h
  • 5.运行效果展示
  • 如果你觉得这篇文章对你有帮助
  • 请给个三连支持一下哦

1.需求分析

我们需要编写一款C语言扫雷游戏,包含9*9 自定义格式等游戏格式
注意:(由于创作者水平有限)**!!**本款游戏未能实现UI设计前端知识

  • 游戏可以通过菜单实现继续玩或者退出游戏
  • 游戏的棋盘格式是9x9
  • 默认随机布置10颗雷
  • 可以排查雷
    –如果不是雷,则显示周边有几颗雷
    –如果是雷,则炸死游戏结束
    –把除了雷之外的所有非雷格子都找出来,则排雷成功,游戏结束
    游戏可以反复玩


  • 甚至我们可以拓展多种玩法,例如:11x1115x15计时模式

  • 游戏界面
    在这里插入图片描述

2.程序框架设计

  • 扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构(C语言讲完之后会讲到)来存储这些信息。
  • 因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们首先想到的就是创建一个9*9的数组来存放布置雷的信息
  • 那如果这个位置布置雷,我们就存放1,没有布置雷就存放0.

在这里插入图片描述
我们先看上面这个9x9的格子
我们访问(8,9)这个坐标的时候,周围的⼀圈8个位置,统计周围雷的个数时,最下面的三个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大⼀圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就行,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11是⽐较合适。

  • 再定义一个符号数组用来存放排查出的雷的信息

我们可以将数组初始化为*


3.分函数实现

打印游戏菜单界面

void menu() {
    printf("***********************\n");
    printf("*****   1. play   *****\n");  // 选择1开始游戏
    printf("*****   0. exit   *****\n");  // 选择0退出游戏
    printf("***********************\n");
}


游戏主逻辑函数

void game() {
    // 定义两个二维数组:
    // mine数组:存储地雷的真实分布('0'无雷,'1'有雷)
    // show数组:存储玩家可见的信息('*'未排查,数字表示周围雷数)
    char mine[ROWS][COLS];  // 实际地雷分布棋盘
    char show[ROWS][COLS];  // 玩家可见棋盘

    // 初始化棋盘:
    // mine数组全部初始化为'0'(表示初始时没有地雷)
    // show数组全部初始化为'*'(表示所有位置都未排查)
    InitBoard(mine, ROWS, COLS, '0');
    InitBoard(show, ROWS, COLS, '*');

    // 在mine数组中随机布置地雷(数量由EASY_COUNT决定)
    SetMine(mine, ROW, COL);

    // 打印玩家可见的棋盘(调试时可取消注释查看地雷分布)
    // DisplayBoard(mine, ROW, COL);  // 打印真实地雷分布(用于调试)
    DisplayBoard(show, ROW, COL);    // 打印玩家可见棋盘

    // 开始玩家排雷过程
    FindMine(mine, show, ROW, COL);
}


程序主入口

int main() {
    int input = 0;  // 存储用户输入的菜单选择

    // 设置随机数种子(使用当前时间确保每次运行随机性不同)
    srand((unsigned int)time(NULL));

    // 主游戏循环(至少执行一次)
    do {
        menu();              // 打印菜单
        printf("请选择:>"); // 提示用户输入
        scanf_s("%d", &input); // 读取用户选择

        // 根据用户选择执行不同操作
        switch (input) {
        case 1:    // 选择1:开始游戏
            game(); // 调用游戏主函数
            break;
        case 0:    // 选择0:退出游戏
            printf("退出游戏\n");
            break;
        default:   // 其他输入:提示错误
            printf("选择错误,请重新选择\n");
            break;
        }
    } while (input);  // 当input不为0时继续循环

    return 0;  // 程序正常退出
}


初始化游戏棋盘

// board: 二维数组表示的棋盘
// rows: 棋盘的行数
// cols: 棋盘的列数
// set: 初始化时填充的字符(通常'0'表示无雷,'1'表示有雷)
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;  // 将当前格子设置为指定字符
        }
    }
}


随机布置地雷

// mine: 表示雷区的二维数组
// row: 有效行数
// col: 有效列数
void SetMine(char mine[ROWS][COLS], int row, int col)
{
    // 需要布置的地雷数量(EASY_COUNT可能是头文件中定义的常量,如10)
    int count = EASY_COUNT;

    while (count) {  // 循环直到布置完所有地雷
        // 生成随机坐标(1-row和1-col范围内)
        int x = rand() % row + 1;  // 1到row的随机数
        int y = rand() % col + 1;  // 1到col的随机数

        // 检查该位置是否已经有雷
        if (mine[x][y] == '0')  // '0'表示无雷
        {
            mine[x][y] = '1';  // '1'表示有雷
            count--;  // 成功布置一个雷,计数器减1
        }
    }


显示当前棋盘状态

// board: 要显示的棋盘(可能是雷区或玩家可见区)
// row: 棋盘的有效行数(通常从1开始)
// col: 棋盘的有效列数(通常从1开始)
void DisplayBoard(char board[ROWS][COLS], int row, int col) {
    printf("-------扫雷-------\n");

    // 打印列号(0-col)
    for (int j = 0; j <= col; j++) {
        printf("%d ", j);  // 打印列索引(0到col)
    }
    printf("\n");

    // 打印每一行内容(行号+棋盘内容)
    for (int i = 1; i <= row; i++) {
        printf("%d ", i);  // 打印行号(1到row)

        // 打印该行每个格子的内容
        for (int j = 1; j <= col; j++) {
            printf("%c ", board[i][j]);  // 打印棋盘内容
        }
        printf("\n");  // 换行到下一行
    }
}


计算指定位置周围的地雷数量

// mine: 雷区数组
// x: 行坐标
// y: 列坐标
// 返回:周围8个格子的地雷总数
int GetMineCount(char mine[ROWS][COLS], int x, int y) {
    // 将周围8个格子的字符值相加('0'=48,'1'=49),然后减去8*'0'得到实际数字
    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');
}


玩家排雷主逻辑

// mine: 真实的雷区数组
// show: 玩家看到的棋盘(显示已排查区域)
// row: 有效行数
// col: 有效列数
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
    int x = 0, y = 0;  // 玩家输入的坐标
    int win = 0;       // 已安全排查的格子计数

    // 游戏循环:当已排查的安全格子数 < 总格子数-地雷数时继续
    while (win < row * col - EASY_COUNT) {
        printf("请输入要排查的坐标:");
        scanf_s("%d %d", &x, &y);  // 读取玩家输入

        // 检查坐标是否合法
        if (x >= 1 && x <= row && y >= 1 && y <= col) {
            // 如果踩中地雷
            if (mine[x][y] == '1') {
                printf("很遗憾,你被炸死了\n");
                DisplayBoard(mine, row, col);  // 显示全部地雷位置
                break;  // 结束游戏
            }
            else {
                // 计算并显示周围地雷数量
                int count = GetMineCount(mine, x, y);
                show[x][y] = count + '0';  // 将数字转换为ASCII字符(如1→'1')
                DisplayBoard(show, row, col);
                win++;  // 成功排查一个安全格子,计数器加1
            }
        }
        else {
            printf("输入的坐标非法,请重新输入\n");  // 坐标超出范围提示
        }
    }
    // 胜利条件判断:当所有安全格子都被排查
    if (win == row * col - EASY_COUNT) {
        printf("恭喜你,排雷成功!\n");
        DisplayBoard(mine, row, col);  // 显示地雷位置
    }
}


4.分文件实现

这一次我们分三个文件来讲解

test.c
文件中写文件的测试逻辑
game.c
文件中写函数的实现
game.h
文件中写程序需要的数据类型和函数声明

(1)test.c

#include <stdio.h>      // 标准输入输出库
#include "game.h"       // 包含自定义的游戏头文件(定义常量、函数声明等)
#include <stdlib.h>     // 包含rand()和srand()函数
#include <time.h>       // 包含time()函数用于生成随机数种子

// 打印游戏菜单界面
void menu() {
    printf("***********************\n");
    printf("*****   1. play   *****\n");  // 选择1开始游戏
    printf("*****   0. exit   *****\n");  // 选择0退出游戏
    printf("***********************\n");
}

// 游戏主逻辑函数
void game() {
    // 定义两个二维数组:
    // mine数组:存储地雷的真实分布('0'无雷,'1'有雷)
    // show数组:存储玩家可见的信息('*'未排查,数字表示周围雷数)
    char mine[ROWS][COLS];  // 实际地雷分布棋盘
    char show[ROWS][COLS];  // 玩家可见棋盘

    // 初始化棋盘:
    // mine数组全部初始化为'0'(表示初始时没有地雷)
    // show数组全部初始化为'*'(表示所有位置都未排查)
    InitBoard(mine, ROWS, COLS, '0');
    InitBoard(show, ROWS, COLS, '*');

    // 在mine数组中随机布置地雷(数量由EASY_COUNT决定)
    SetMine(mine, ROW, COL);

    // 打印玩家可见的棋盘(调试时可取消注释查看地雷分布)
    // DisplayBoard(mine, ROW, COL);  // 打印真实地雷分布(用于调试)
    DisplayBoard(show, ROW, COL);    // 打印玩家可见棋盘

    // 开始玩家排雷过程
    FindMine(mine, show, ROW, COL);
}

// 程序主入口
int main() {
    int input = 0;  // 存储用户输入的菜单选择

    // 设置随机数种子(使用当前时间确保每次运行随机性不同)
    srand((unsigned int)time(NULL));

    // 主游戏循环(至少执行一次)
    do {
        menu();              // 打印菜单
        printf("请选择:>"); // 提示用户输入
        scanf_s("%d", &input); // 读取用户选择

        // 根据用户选择执行不同操作
        switch (input) {
        case 1:    // 选择1:开始游戏
            game(); // 调用游戏主函数
            break;
        case 0:    // 选择0:退出游戏
            printf("退出游戏\n");
            break;
        default:   // 其他输入:提示错误
            printf("选择错误,请重新选择\n");
            break;
        }
    } while (input);  // 当input不为0时继续循环

    return 0;  // 程序正常退出
}


(2)game.c

#include "game.h"  // 包含自定义的游戏头文件,可能定义了ROWS、COLS、EASY_COUNT等常量

// 初始化游戏棋盘
// board: 二维数组表示的棋盘
// rows: 棋盘的行数
// cols: 棋盘的列数
// set: 初始化时填充的字符(通常'0'表示无雷,'1'表示有雷)
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;  // 将当前格子设置为指定字符
        }
    }
}

// 显示当前棋盘状态
// board: 要显示的棋盘(可能是雷区或玩家可见区)
// row: 棋盘的有效行数(通常从1开始)
// col: 棋盘的有效列数(通常从1开始)
void DisplayBoard(char board[ROWS][COLS], int row, int col) {
    printf("-------扫雷-------\n");

    // 打印列号(0-col)
    for (int j = 0; j <= col; j++) {
        printf("%d ", j);  // 打印列索引(0到col)
    }
    printf("\n");

    // 打印每一行内容(行号+棋盘内容)
    for (int i = 1; i <= row; i++) {
        printf("%d ", i);  // 打印行号(1到row)

        // 打印该行每个格子的内容
        for (int j = 1; j <= col; j++) {
            printf("%c ", board[i][j]);  // 打印棋盘内容
        }
        printf("\n");  // 换行到下一行
    }
}

// 随机布置地雷
// mine: 表示雷区的二维数组
// row: 有效行数
// col: 有效列数
void SetMine(char mine[ROWS][COLS], int row, int col)
{
    // 需要布置的地雷数量(EASY_COUNT可能是头文件中定义的常量,如10)
    int count = EASY_COUNT;

    while (count) {  // 循环直到布置完所有地雷
        // 生成随机坐标(1-row和1-col范围内)
        int x = rand() % row + 1;  // 1到row的随机数
        int y = rand() % col + 1;  // 1到col的随机数

        // 检查该位置是否已经有雷
        if (mine[x][y] == '0')  // '0'表示无雷
        {
            mine[x][y] = '1';  // '1'表示有雷
            count--;  // 成功布置一个雷,计数器减1
        }
    }
}

// 计算指定位置周围的地雷数量
// mine: 雷区数组
// x: 行坐标
// y: 列坐标
// 返回:周围8个格子的地雷总数
int GetMineCount(char mine[ROWS][COLS], int x, int y) {
    // 将周围8个格子的字符值相加('0'=48,'1'=49),然后减去8*'0'得到实际数字
    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');
}

// 玩家排雷主逻辑
// mine: 真实的雷区数组
// show: 玩家看到的棋盘(显示已排查区域)
// row: 有效行数
// col: 有效列数
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
    int x = 0, y = 0;  // 玩家输入的坐标
    int win = 0;       // 已安全排查的格子计数

    // 游戏循环:当已排查的安全格子数 < 总格子数-地雷数时继续
    while (win < row * col - EASY_COUNT) {
        printf("请输入要排查的坐标:");
        scanf_s("%d %d", &x, &y);  // 读取玩家输入

        // 检查坐标是否合法
        if (x >= 1 && x <= row && y >= 1 && y <= col) {
            // 如果踩中地雷
            if (mine[x][y] == '1') {
                printf("很遗憾,你被炸死了\n");
                DisplayBoard(mine, row, col);  // 显示全部地雷位置
                break;  // 结束游戏
            }
            else {
                // 计算并显示周围地雷数量
                int count = GetMineCount(mine, x, y);
                show[x][y] = count + '0';  // 将数字转换为ASCII字符(如1→'1')
                DisplayBoard(show, row, col);
                win++;  // 成功排查一个安全格子,计数器加1
            }
        }
        else {
            printf("输入的坐标非法,请重新输入\n");  // 坐标超出范围提示
        }
    }

    // 胜利条件判断:当所有安全格子都被排查
    if (win == row * col - EASY_COUNT) {
        printf("恭喜你,排雷成功!\n");
        DisplayBoard(mine, row, col);  // 显示地雷位置
    }
}


(3)game.h

#pragma once  // 防止头文件被重复包含

// 标准库头文件
#include <stdio.h>   // 提供输入输出函数(如printf、scanf)
#include <stdlib.h>  // 提供内存分配、随机数等函数(如rand、srand)
#include <time.h>    // 提供时间相关函数(如time用于随机数种子)

/***********************
 * 游戏难度配置宏定义
 * 通过地雷数量控制难度级别
 ***********************/
#define EASY_COUNT 10   // 简单难度 - 10个地雷
#define MIDIEA_COUNT 30 // 中等难度 - 30个地雷(注意拼写应为MEDIUM)
#define HIGH_COUNT 50   // 困难难度 - 50个地雷

 /***********************
  * 棋盘尺寸宏定义
  * 采用"大一圈"的数组设计便于边界处理
  ***********************/
#define ROW 9    // 游戏可见区域的行数(玩家实际操作区域)
#define COL 9    // 游戏可见区域的列数
#define ROWS ROW+2  // 实际数组行数 = 可见行 + 2(上下各多一行边界)
#define COLS COL+2  // 实际数组列数 = 可见列 + 2(左右各多一列边界)

  /***********************
   * 函数声明部分
   * 描述各模块的核心功能
   ***********************/

   /**
	* @brief 初始化游戏棋盘
	* @param board 目标二维数组
	* @param rows 数组总行数(应使用ROWS)
	* @param cols 数组总列数(应使用COLS)
	* @param set 初始化填充字符
	* @note 将整个数组(包括边界)初始化为set字符
	*       通常:mine数组用'0',show数组用'*'
	*/
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);

/**
 * @brief 打印游戏棋盘
 * @param board 要打印的二维数组
 * @param row 可见区域行数(应使用ROW)
 * @param col 可见区域列数(应使用COL)
 * @note 会显示行列坐标(1-9)
 *       只打印内部9x9区域(忽略最外圈边界)
 */
void DisplayBoard(char board[ROWS][COLS], int row, int col);

/**
 * @brief 随机布置地雷
 * @param board 地雷分布数组(通常为mine数组)
 * @param row 可见区域行数(应使用ROW)
 * @param col 可见区域列数(应使用COL)
 * @note 在1-9行/列范围内随机布置地雷
 *       地雷用'1'表示,安全格用'0'
 *       实际使用时应配合EASY_COUNT等难度常量
 */
void SetMine(char board[ROWS][COLS], int row, int col);

/**
 * @brief 玩家排雷核心逻辑
 * @param mine 真实地雷分布数组
 * @param show 玩家可见的棋盘数组
 * @param row 可见区域行数(应使用ROW)
 * @param col 可见区域列数(应使用COL)
 * @note 处理玩家输入、胜负判断、棋盘更新
 *       包含游戏主循环,直到胜利或踩雷
 */
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);


5.运行效果展示

在这里插入图片描述


如果你觉得这篇文章对你有帮助

请给个三连支持一下哦

在这里插入图片描述

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

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

相关文章

【Java】CopyOnWriteArrayList

一&#xff0c;概述 CopyOnWriteArrayList作为List接口的实现之一&#xff0c;它区分于ArrayList在于它是线程安全的。如它名字一样&#xff0c;所有的写操作均复制了原数组的值&#xff0c;虽说代价较大&#xff0c;但读多写少的环境下&#xff0c;是可接受的。笔者在此简单看…

C#入门学习笔记 #8(委托)

欢迎进入这篇文章,文章内容为学习C#过程中做的笔记,可能有些内容的逻辑衔接不是很连贯,但还是决定分享出来,由衷的希望可以帮助到你。 笔记内容会持续更新~~ 本章介绍C#中的委托,本章难度较大... 委托 C#中的委托是C语言、C++中函数指针的升级版。接下来介绍一个概念—…

CSS 3D 变换中z-index失效问题

CSS 3D 变换中 z-index 失效问题 1. z-index 失效了 在 CSS 中&#xff0c;z-index 通常用于控制元素的层叠顺序&#xff0c;数值越大&#xff0c;元素越靠前显示。在 3D 变换&#xff08;如 rotateX、translateZ&#xff09; 中使用 z-index 时&#xff0c;可能会发现z-inde…

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(七):消息框交互功能添加

Tailwind CSS 实战&#xff0c;基于Kooboo构建AI对话框页面&#xff08;一&#xff09; Tailwind CSS 实战&#xff0c;基于Kooboo构建AI对话框页面&#xff08;二&#xff09;&#xff1a;实现交互功能 Tailwind CSS 实战&#xff0c;基于 Kooboo 构建 AI 对话框页面&#x…

【计算机网络】网络层IP协议与子网划分详解:从主机通信到网络设计的底层逻辑

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a; 【计算机网络】传输层TCP协议——协议段格式、三次握手四次挥手、超时重传、滑动窗口、流量控制、 &…

基于WSL搭建Ubnutu 20.04.6 LTS(二)-部署Docker环境

Docker是一组平台即服务&#xff08;PaaS&#xff09;的产品。它基于操作系统层级的虚拟化技术&#xff0c;将软件与其依赖项打包为容器。托管容器的软件称为Docker引擎。Docker能够帮助开发者在轻量级容器中自动部署应用程序&#xff0c;并使得不同容器中的应用程序彼此隔离&a…

【图像处理入门】6. 频域图像处理:傅里叶变换与滤波的奥秘

摘要 频域图像处理通过傅里叶变换将图像从空间域转换到频率域,为图像增强、去噪、压缩等任务提供全新视角。本文将深入解析傅里叶变换原理,介绍低通、高通滤波的实现方式,结合OpenCV和Python代码展示频域滤波在去除噪声、增强边缘中的应用,帮助读者掌握图像频域处理的核心…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的生态农庄留存运营策略研究

摘要&#xff1a;本文聚焦于生态农庄运营中的游客留存问题&#xff0c;以村长与乡亲们吸引游客进村为背景&#xff0c;深入探讨如何借助开源AI智能名片链动2 1模式S2B2C商城小程序实现游客的有效留存。通过分析该小程序在信息传递、服务整合、营销激励等方面的优势&#xff0c…

Jenkins实现自动化部署Springboot项目到Docker容器(Jenkinsfile)

Jenkins实现自动化部署Springboot项目到Docker容器 引言:为什么需要自动化部署? 在软件开发中,频繁的手动部署既耗时又容易出错。通过 Docker + Jenkins + Git 的组合,您可以实现: ✅ 一键部署:代码推送后自动构建和部署🐳 环境一致性:Docker 确保开发、测试、生产环…

【Linux】Git原理与使用

编程不仅是解决问题的艺术&#xff0c;更是对复杂性进行优雅管理的哲学。 前言 这是我自己学习Linux系统编程的第三篇笔记。后期我会继续把Linux系统编程笔记开源至博客上。 上一期笔记是关于Vim文本编辑器知识&#xff1a; 【Linux】Vim文本编辑器-CSDN博客https://blog.csdn…

A*算法实现原理以及实现步骤(C++)

算法原理&#xff1a; A*算法是一种启发式搜索算法&#xff0c;用于在图中寻找最短路径。它结合了Dijkstra算法的确保最短路径的优点和贪心最佳优先搜索的高效性。其核心在于使用一个评估函数&#xff1a; f(n) g(n) h(n) 其中&#xff1a; - g(n) 表示从起点到节点n的实际代…

Devops自动化运维---py基础篇一

python基础篇 1、基本数据类型 2、算术运算符 3、变量 变量&#xff1a;编程语言中能储存结果或能表示值的抽象概念 用途&#xff1a;用一段数据赋予一个简短、易于记忆的名字&#xff0c;方便重复使用3.1 格式转化变量 操作符号描述%s字符串%d整数%f浮点数 实例&#xff1…

平安养老险蚌埠中心支公司开展金融宣教活动

近日&#xff0c;平安养老保险股份有限公司&#xff08;以下简称“平安养老险”&#xff09;蚌埠中心支公司&#xff0c;走进某合作企业开展金融教育宣传活动。 活动现场&#xff0c;平安养老险蚌埠中心支公司工作人员通过发放宣传手册和小礼品等方式&#xff0c;向企业员工普…

Redisson简明教程—你家的锁芯该换了

1.简介 各位攻城狮们&#xff0c;你还在使用原生命令来上锁么&#xff1f;看来你还是不够懒&#xff0c;饺子都给你包好了&#xff0c;你非要吃大饼配炒韭菜&#xff0c;快点改善一下“伙食”吧&#xff0c;写代码也要来点幸福感。今天咱们就来聊聊Redisson提供的各种锁&#…

48V带极性反接保护-差共模浪涌防护方案

在工业自动化&#xff08;电动机驱动 / 工业机器人&#xff09;、交通基础设施&#xff08;充电桩 / 车载电子&#xff09;、安防系统&#xff08;监控摄像头 / 门禁&#xff09;、储能设备&#xff08;BMS / 离网控制器&#xff09;等领域&#xff0c;DC48V 电源因安全特低电压…

Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)

一、线程安全推理 在多线程环境中运行YOLO 模型需要仔细考虑&#xff0c;以确保线程安全。Pythons threading 模块允许您同时运行多个线程&#xff0c;但在这些线程中使用YOLO 模型时&#xff0c;需要注意一些重要的安全问题。本页将指导您创建线程安全的YOLO 模型推理。 1.1、…

jvm学习第1day jvm简介,栈溢出、堆溢出

jvm学习第1day jvm简介&#xff0c;栈溢出、堆溢出 jvm简介栈线程安全栈溢出线程运行诊断堆堆溢出 方法区方法区内存溢出常量池和运行时常量池 jvm简介 jvm 是编译后的字节码文件运行的环境&#xff0c; 因此各个平台有了jvm可以运行java.class文件&#xff0c;这是Java跨平台…

用广告维持的免费 AI 图像生成工具(个人项目分享)

用广告维持的免费 AI 图像生成工具&#xff08;个人项目分享&#xff09; 免费 AI 图像生成工具网址&#xff1a;https://aiart.gcc.ac.cn/ 最近做了一个 AI 图像生成器&#xff0c;主要目标是“尽量简单”&#xff1a; 打开网页就能用不用注册、不用登录免费&#xff0c;不…

分析Web3下数据保护的创新模式

在这个信息爆炸的时代&#xff0c;我们正站在 Web3 的门槛上&#xff0c;迎接一个以去中心化、用户主权和数据隐私为核心的新时代。Web3 不仅仅是技术的迭代&#xff0c;它更是一场关于数据权利和责任的结构性变革。本文将探讨 Web3 下数据保护的创新模式&#xff0c;以期为用户…

​减少交通拥堵、提高效率、改善交通安全的智慧交通开源了。

智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界面上…