C++ 游戏开发入门

news2025/1/14 1:36:46

一、为什么选择 C++ 进行游戏开发

C++ 在游戏开发领域具有独特的地位。它兼具高效性与对底层硬件的良好控制能力,这使得它非常适合开发对性能要求极高的游戏核心引擎部分。许多知名的大型游戏,如《使命召唤》系列、《虚幻竞技场》等,其底层架构都是基于 C++ 构建的。C++ 能够直接操作内存,在处理复杂的游戏逻辑、大规模数据运算(如物理模拟、图形渲染中的大量计算)以及优化游戏性能方面有着卓越的表现。同时,丰富的类库和工具支持也为游戏开发提供了便利,像 DirectX 和 OpenGL 等图形库可用于创建精美的游戏画面。

二、C++ 基础回顾与强化

在深入 C++ 游戏开发之前,务必确保对 C++ 的基础有扎实的掌握。这包括数据类型(如 int、float、double、char 等)、控制结构(if-else、for、while、switch 等)、函数的定义与使用、类与对象的概念(封装、继承、多态)以及指针和引用的操作。例如,在游戏中创建角色类时,就会用到类的封装来隐藏角色内部属性和行为的实现细节,通过继承可以派生出不同类型的角色类并共享部分通用属性和方法。指针可用于高效地处理游戏中的动态内存分配,如加载游戏资源时动态创建对象数组。

三、游戏开发的核心概念

(一)游戏循环

游戏循环是游戏运行的核心机制。它不断地重复更新游戏状态、处理用户输入、进行物理模拟和渲染画面等操作。一个简单的游戏循环示例如下:

while (true) {
    // 处理用户输入
    handleInput();
    // 更新游戏状态
    updateGameState();
    // 进行物理模拟(如碰撞检测等)
    physicsSimulation();
    // 渲染游戏画面
    render();
}

在这个循环中,handleInput函数用于获取玩家的键盘、鼠标等输入操作,并根据输入改变游戏中的相关变量或触发相应的事件。updateGameState函数根据游戏规则和逻辑更新游戏中各个对象的状态,例如角色的位置、生命值、游戏得分等。physicsSimulation函数处理游戏中的物理效果,如物体的运动、碰撞等,确保游戏世界的物理行为符合现实逻辑。render函数则负责将游戏的当前状态绘制到屏幕上,显示给玩家。

(二)图形渲染基础

图形渲染是让游戏世界可视化的关键。在 C++ 中,我们可以使用图形库如 OpenGL 或 DirectX 来实现。以 OpenGL 为例,首先需要初始化 OpenGL 环境,创建窗口并设置相关的渲染上下文。然后定义顶点数据(如三角形、四边形等图形的顶点坐标)、颜色数据等,通过编写顶点着色器和片段着色器来控制图形的绘制方式和颜色填充等效果。例如,绘制一个简单的三角形:

// 顶点数据
GLfloat vertices[] = {
    -0.5f, -0.5f, 0.0f,  // 左下角顶点
     0.5f, -0.5f, 0.0f,  // 右下角顶点
     0.0f,  0.5f, 0.0f   // 顶点坐标
};

// 顶点缓冲对象
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// 顶点属性指针设置
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);

// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);

这段代码首先定义了一个三角形的顶点坐标数组,然后创建了顶点缓冲对象(VBO)来存储顶点数据,并设置了顶点属性指针,最后使用glDrawArrays函数绘制出三角形。在实际游戏中,会有更复杂的图形和场景,需要加载模型文件(如.obj 格式),并进行纹理映射、光照处理等操作来使画面更加逼真。

(三)用户输入处理

游戏需要及时响应用户的输入操作。在 C++ 中,可以使用操作系统提供的输入 API 或者游戏引擎的输入处理模块。例如,在 Windows 平台下,可以使用 Windows API 来检测键盘和鼠标消息。以下是一个简单的检测键盘按键是否按下的示例:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow) {
    static TCHAR szAppName[] = TEXT("InputDemo");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    if (!RegisterClass(&wndclass)) {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),
                   szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName, TEXT("Input Demonstration"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
    case WM_KEYDOWN:
        if (wParam == VK_UP) {
            // 处理向上箭头按键按下事件
            // 例如移动角色向上
            break;
        }
        // 其他按键处理
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

在这个示例中,WndProc函数是窗口过程函数,用于处理各种窗口消息。当接收到WM_KEYDOWN消息时,判断按下的键是否为向上箭头键(VK_UP),如果是则可以在相应的代码块中编写处理角色向上移动的逻辑。对于鼠标输入,类似地可以处理鼠标点击、移动等消息来实现游戏中的交互功能,如点击按钮、控制视角等。

(四)碰撞检测与物理模拟

碰撞检测用于判断游戏中的物体是否发生碰撞,这对于游戏的交互性和真实性至关重要。常见的碰撞检测算法有包围盒碰撞检测(AABB - Axis-Aligned Bounding Box)、圆形碰撞检测(适用于圆形或近似圆形的物体)以及更为复杂的三角形网格碰撞检测等。例如,AABB 碰撞检测的基本思想是通过比较两个物体的包围盒(通常是最小的能包含物体的矩形)在坐标轴上的范围是否重叠来判断是否碰撞。

物理模拟则是在碰撞发生后,根据物理定律计算物体的运动和相互作用效果。比如,当两个物体碰撞后,根据它们的质量、速度、弹性系数等参数计算碰撞后的速度和方向变化。在 C++ 中,可以使用物理引擎如 Box2D 或 PhysX 来实现较为复杂的碰撞检测和物理模拟功能。以 Box2D 为例,首先创建一个物理世界,然后在世界中创建刚体(具有质量、形状等属性的物体)、关节(用于连接刚体)等元素,设置好相关的物理参数后,物理引擎会自动处理碰撞检测和物理模拟的计算。

四、C++ 游戏开发框架与库

(一)SFML(Simple and Fast Multimedia Library)

SFML 是一个跨平台的 C++ 多媒体库,提供了对图形、音频、网络、窗口管理等功能的支持,非常适合开发 2D 游戏。它具有简单易用的 API,能够快速创建游戏窗口、加载和绘制图像、播放音频等。例如,使用 SFML 创建一个简单的窗口并显示一张图片:

#include <SFML/Graphics.hpp>

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Example");
    sf::Texture texture;
    if (!texture.loadFromFile("image.jpg")) {
        // 图片加载失败处理
        return -1;
    }
    sf::Sprite sprite(texture);

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(sprite);
        window.display();
    }

    return 0;
}

这段代码首先创建了一个大小为 800x600 的窗口,然后加载一张名为image.jpg的图片并创建对应的精灵(Sprite),在游戏循环中不断地处理窗口事件、清除窗口、绘制精灵并显示窗口内容。SFML 还提供了对文本绘制、动画、用户输入处理等功能的支持,方便开发者快速构建 2D 游戏的基本框架。

(二)Unreal Engine(使用 C++ 开发)

Unreal Engine 是一款功能强大的游戏引擎,虽然它提供了可视化的蓝图脚本编程方式,但 C++ 在其中也有着重要的地位,可用于开发游戏的核心逻辑、性能关键部分以及自定义插件等。使用 Unreal Engine 进行 C++ 开发,首先需要安装 Unreal Engine 开发环境,创建一个 C++ 项目。在项目中,可以定义游戏角色类、游戏模式类、关卡类等。例如,创建一个自定义的游戏角色类继承自ACharacter类:

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"

UCLASS()
class AMyCharacter : public ACharacter {
    GENERATED_BODY()

public:
    AMyCharacter();

    // 角色的自定义行为函数
    void MyCustomFunction();

protected:
    // 重写父类的函数,如角色移动等
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};

AMyCharacter::AMyCharacter() {
    // 初始化角色属性等操作
}

void AMyCharacter::MyCustomFunction() {
    // 实现自定义的角色行为,如特殊技能等
}

void AMyCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) {
    Super::SetupPlayerInputComponent(PlayerInputComponent);
    // 绑定输入操作到角色的行为函数
    PlayerInputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);
    PlayerInputComponent->BindAxis("MoveRight", this, &AMyCharacter::MoveRight);
    // 其他输入绑定
}

在这个示例中,AMyCharacter类继承自ACharacter类,在构造函数中可以进行角色属性的初始化,MyCustomFunction函数用于实现角色的自定义行为,SetupPlayerInputComponent函数用于绑定玩家的输入操作(如键盘、鼠标操作)到角色的相应行为函数上。通过 Unreal Engine 的强大功能,如蓝图与 C++ 的混合编程、场景编辑、光照效果、物理模拟等,可以开发出高质量的 3D 游戏。

(三)Unity(使用 C++ 与 C# 混合开发)

Unity 是一款广泛使用的游戏引擎,虽然其主要脚本语言是 C#,但也可以通过 C++ 编写插件来扩展引擎功能或处理性能关键部分。例如,可以使用 C++ 编写图形渲染插件来实现特定的渲染效果,或者处理与底层硬件交互的部分。要在 Unity 中使用 C++,需要了解 Unity 的插件开发接口(Plugin API)。通常,将 C++ 代码编译成动态链接库(.dll 文件在 Windows 平台,.so 文件在 Linux 平台等),然后在 Unity 项目中通过 C# 脚本调用 C++ 插件中的函数。例如,一个简单的 C++ 函数用于计算两个数的和:

// MyPlugin.cpp
extern "C" {
    __declspec(dllexport) int AddNumbers(int a, int b) {
        return a + b;
    }
}

在 C# 脚本中调用这个 C++ 函数:

using UnityEngine;
using System.Runtime.InteropServices;

public class PluginCaller : MonoBehaviour {
    // 导入 C++函数
    [DllImport("MyPlugin")]
    private static extern int AddNumbers(int a, int b);

    void Start() {
        int result = AddNumbers(5, 3);
        Debug.Log("Result of addition: " + result);
    }
}

通过这种方式,可以充分利用 C++ 的性能优势和 Unity 的高效开发环境,实现复杂的游戏功能。

五、实践项目示例

(一)简单的 2D 平台游戏

项目目标:创建一个具有基本角色移动、跳跃、碰撞检测的 2D 平台游戏。

技术要点:

  • 使用 SFML 库创建游戏窗口、加载游戏角色和地图的图像资源。
  • 处理玩家输入(键盘操作)来控制角色的移动和跳跃,例如按下方向键左右移动角色,按下空格键使角色跳跃。
  • 实现基于 AABB 的碰撞检测,用于判断角色与地图平台、障碍物等的碰撞,当发生碰撞时,根据碰撞情况调整角色的运动状态,如阻止角色穿过障碍物、实现角色在平台上的站立等。
  • 设计简单的游戏关卡,包括平台、陷阱、奖励物品等元素,并通过文件加载或硬编码的方式创建关卡布局。

开发步骤:

  1. 初始化 SFML 窗口和相关资源加载器。
  2. 创建角色类,包含角色的图像、位置、速度、加速度等属性,以及移动、跳跃等行为函数。
  3. 开发碰撞检测系统,编写函数用于检测角色与不同类型物体的碰撞并返回碰撞结果。
  4. 构建关卡类,负责加载和管理关卡中的平台、陷阱等元素,并提供函数用于检查角色在关卡中的位置是否合法。
  5. 在游戏循环中,不断更新角色状态、处理碰撞检测、绘制角色和关卡元素到窗口中。

(二)3D 第一人称射击游戏(基于 Unreal Engine)

项目目标:打造一个具有基本的第一人称视角移动、射击、敌人 AI 等功能的 3D 射击游戏。

技术要点:

  • 在 Unreal Engine 中使用 C++ 创建第一人称角色类,继承自ACharacter类,实现角色的移动控制(包括行走、奔跑、蹲下、跳跃等),并处理鼠标输入来控制视角转动。
  • 开发武器系统,包括不同类型的枪支,实现射击功能(发射子弹、产生后坐力、消耗弹药等),以及子弹与场景物体的碰撞检测和伤害计算。
  • 设计敌人 AI 系统,使敌人能够感知玩家的位置、进行巡逻、追逐玩家并在合适的时机进行攻击。可以使用行为树或状态机来实现敌人的智能行为。
  • 构建 3D 游戏场景,包括地形、建筑物、道具等元素,利用 Unreal Engine 的场景编辑工具进行创建和布置,并设置合适的光照和阴影效果以增强游戏的视觉体验。

开发步骤:

  1. 创建 Unreal Engine C++ 项目,设置好项目的基本配置和目录结构。
  2. 开发第一人称角色类,重写相关的移动和输入处理函数,设置角色的动画蓝图以实现角色移动的动画效果。
  3. 设计武器类,创建不同枪支的继承类,实现射击逻辑、弹药管理、武器切换等功能,并在角色类中添加武器持有和使用的相关逻辑。
  4. 构建敌人 AI 系统,创建敌人角色类,设计敌人的感知组件、行为树或状态机来控制敌人的行为逻辑,如巡逻路径的设置、发现玩家后的追逐和攻击策略等。
  5. 使用 Unreal Engine 的场景编辑器创建游戏场景,添加地形、建筑、道具等元素,并为场景设置光照、阴影、材质等效果,最后将角色、武器、敌人等元素放置到场景中进行整合和测试。

通过这些实践项目,可以逐步积累 C++ 游戏开发的经验,深入理解游戏开发的各个环节和技术要点,为进一步开发更复杂、更大型的游戏奠定坚实的基础。

六、学习资源推荐

  • 书籍
    • 《C++ 游戏编程入门教程》:以通俗易懂的方式介绍了 C++ 游戏编程的基础知识和实践技巧,包括游戏开发的基本概念、C++ 语言基础、图形编程、游戏物理模拟等内容,适合初学者入门。
    • 《3D 游戏编程大师技巧》:涵盖了 3D 游戏编程的各个方面,如 3D 数学基础、图形渲染、碰撞检测、动画等,通过大量的示例代码和详细的解释,帮助读者深入理解 3D 游戏开发的原理和技术。
    • 《DirectX 角色扮演游戏编程》:专注于 DirectX 技术在角色扮演游戏开发中的应用,包括角色建模、场景绘制、光照效果、输入处理等内容,适合想要学习使用 DirectX 进行游戏开发的读者。
    • 《游戏开发物理学》:介绍了游戏开发中常用的物理模拟技术,如刚体力学、碰撞检测与响应、流体模拟等,通过实际案例和代码示例,帮助读者掌握游戏物理引擎的使用方法。
  • 在线教程网站
    • https://zhuanlan.zhihu.com/p/660290204该知乎专栏以魔兽开源后端框架 trinitycore 为例,深入拆解了游戏后端开发中的关键技术,如 cmake 项目构建、数据库模块、日志模块、网络模块等,适合有一定 C++ 基础,想要深入学习游戏后端开发的读者。
    • 【完整版300集】B站最容易懂的C++游戏开发教程,从零基础小白到游戏开发大神, - 哔哩哔哩这套教程从 C 语言简史、汇编语言等基础知识讲起,逐步深入到 C++ 游戏开发的相关内容,内容全面,适合零基础的初学者。
    • C++EasyX图形编程教程:RPG游戏元素详解,轻松入门游戏开发通过 C++ EasyX 图形库,详细介绍了 RPG 游戏中角色、地图、任务、战斗系统等基本元素的实现方法,非常适合初学者快速入门游戏开发。
    • 【蓝蓝】-变异护士 Sixth sense_哔哩哔哩_bilibili带你全面学习游戏后端开发技术点,包括网络编程、数据库操作、多线程等,帮助你掌握游戏服务器开发的核心技能。
    • 开源项目

    • TrinityCore:这是一个基于 C++ 的魔兽世界开源服务器项目,包含了丰富的游戏开发技术,如高性能网络编程、数据库设计、游戏逻辑实现等,通过学习和研究该项目的源码,可以深入了解大型多人在线游戏的开发架构和技术细节。
    • OGRE:OGRE 是一个用 C++ 编写的面向场景的 3D 渲染引擎,具有高效、灵活、跨平台等特点,其源码结构清晰,注释详细,是学习 3D 图形渲染和游戏引擎开发的优秀资源。
    • SFML:SFML 是一个简单快速的多媒体库,提供了对图形、音频、网络等功能的支持,适合用于开发 2D 游戏和小型游戏项目,其文档和示例丰富,易于上手。
    • 游戏引擎文档和教程

    • Unreal Engine 官方文档:Unreal Engine 是一款功能强大的游戏引擎,其官方文档详细介绍了引擎的各项功能和使用方法,包括蓝图编程、C++ 编程、场景编辑、动画制作等,通过学习官方文档和相关教程,可以快速掌握 Unreal Engine 的开发技巧。
    • Unity 官方文档:Unity 是一款广泛使用的游戏引擎,其官方文档涵盖了引擎的各个方面,如脚本编程、场景构建、物理模拟、UI 设计等,同时还提供了丰富的示例项目和教程,帮助读者快速入门和提高开发技能。

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

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

相关文章

CLIP模型也能处理点云信息

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

关于NXP开源的MCU_boot的项目心得

MCU的启动流程细查 注意MCU上电第一个函数运行的就是Reset_Handler函数&#xff0c;下图是表示了这个函数做了啥事情&#xff0c;注意加强一下对RAM空间的段的印象&#xff0c;从上到下是栈&#xff0c;堆&#xff0c;.bss段&#xff0c;.data段。 bootloader的难点 固件完…

MySQL5.6升级MySQL5.7

升级方式介绍 08 数据库服务版本升级方法 5.6 – 5.7 – 8.0 数据库版本升级方法&#xff1a; Inplace-本地升级 步骤一&#xff1a;在同一台服务器中&#xff0c;需要部署高版本数据库服务实例步骤二&#xff1a;低版本数据库中的数据进行备份迁移&#xff0c;迁移到高版本…

怎么理解BeamSearch?

在大模型推理中&#xff0c;常会用到BeamSearch&#xff0c;本文就BeamSearch原理与应用理解展开讲解。 一、BeamSearch原理 Beam Search 是一种启发式搜索算法&#xff0c;常用于自然语言处理&#xff08;NLP&#xff09;和其他需要生成序列的任务中&#xff0c;比如机器翻译…

shodan2-批量查找CVE-2019-0708漏洞

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

SciPy Optimize和 CVXPY对比

CVXPY和SciPy Optimize模块都是在Python中解决优化问题的强大工具&#xff0c;但它们是为不同类型的问题而设计的&#xff0c;具有不同的优点和局限性。本文对比两者的优缺点&#xff0c;阐述各自的应用场景&#xff0c;同时解释常用求解器&#xff0c;并给出实际示例进行说明。…

DevOps工程技术价值流:GitLab源码管理与提交流水线实践

在当今快速迭代的软件开发环境中&#xff0c;DevOps&#xff08;开发运维一体化&#xff09;已经成为提升软件交付效率和质量的关键。而GitLab&#xff0c;作为一个全面的开源DevOps平台&#xff0c;不仅提供了强大的版本控制功能&#xff0c;还集成了持续集成/持续交付(CI/CD)…

Android Studio 右侧工具栏 Gradle 不显示 Task 列表

问题&#xff1a; android studio 4.2.1版本更新以后AS右侧工具栏Gradle Task列表不显示&#xff0c;这里需要手动去设置 解决办法&#xff1a; android studio 2024.2.1 Patch 2版本以前的版本设置&#xff1a;依次打开 File -> Settings -> Experimental 选项&#x…

Linux详解:文件权限

文章目录 前言Linux文件权限基础文件成员与三组权限字符 权限的修改修改文件所有者总结 前言 在浩瀚的操作系统世界中&#xff0c;Linux以其开源、灵活和强大的特性&#xff0c;成为了服务器、开发环境以及众多个人用户的首选。而在Linux的众多特性中&#xff0c;文件权限机制…

SeggisV1.0 遥感影像分割软件【源代码】讲解

在此基础上进行二次开发&#xff0c;开发自己的软件&#xff0c;例如&#xff1a;【1】无人机及个人私有影像识别【2】离线使用【3】变化监测模型集成【4】个人私有分割模型集成等等&#xff0c;不管是您用来个人学习还是公司研发需求&#xff0c;都相当合适&#xff0c;包您满…

Spark常问面试题---项目总结

一、数据清洗&#xff0c;你都清洗什么&#xff1f;或者说 ETL 你是怎么做的&#xff1f; 我在这个项目主要清洗的式日志数据&#xff0c;日志数据传过来的json格式 去除掉无用的字段&#xff0c;过滤掉json格式不正确的脏数据 过滤清洗掉日志中缺少关键字段的数据&#xff…

数据结构4——栈和队列

目录 1.栈 1.1.栈的概念及结构 1.2栈的实现 2.队列 2.1队列的概念及结构 2.2队列的实现 1.栈 1.1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段称为栈顶&#xff0c;另一端称为…

限定符使用

正则表达式的元字符一次一般只能匹配一个位置或一个字符,如果想要匹配零个、一个或多个字符时,则需要使用限定符。限定符用于指定允许特定字符或字符集自身重复出现的次数。常用限定符如下: <asp:TextBox [^>]> 正则表达式字符类[^>]匹配除过“>”之外的任何字…

【Python】Selenium模拟在输入框里,一个字一个字地输入文字

我们平常在使用Selenium模拟键盘输入内容&#xff0c;常用的是用send_keys来在输入框上输入字&#xff1a; 基本的输入方式&#xff1a; input_element driver.find_element(By.ID, searchBox) input_element.send_keys("我也爱你") #给骚骚的自己发个骚话不过这种…

Node.js 实战: 爬取百度新闻并序列化 - 完整教程

很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候&#xff0c;大家会用到python &#xff0c;因为实现起来很方便。但是其实Node.js 用来爬取网络内容&#xff0c;也是非常强大的。 今天我向大家介绍一下我自己写的一个百度新闻的爬虫&#xff0c;可…

配置宝塔php curl 支持http/2 发送苹果apns消息推送

由于宝塔面板默认的php编译的curl未加入http2的支持&#xff0c;如果服务需要使用apns推送等需要http2.0的访问就会失败&#xff0c;所以重新编译php让其支持http2.0 编译方法&#xff1a; 一、安装nghttp2 git clone https://github.com/tatsuhiro-t/nghttp2.git cd nghttp…

YOLOv11 NCNN安卓部署

YOLOv11 NCNN安卓部署 之前自己在验证更换relu激活函数重新训练部署模型的时候&#xff0c;在使用ncnn代码推理验证效果很好&#xff0c;但是部署到安卓上cpu模式会出现大量的错误检测框&#xff0c;现已更换会官方默认的权重 前言 YOLOv11 NCNN安卓部署 目前的帧率可以稳定…

MeterSphere接口测试提取数组及引用

实际工作中常见的使用场景&#xff1a; 1、提取数组中某个特定值&#xff1b; $.data.groups[n].name提取特定值 2、提取数组中全部值&#xff1b; $.data.groups[*].name&#xff0c;并勾选匹配多条以提取全部值 3、提取数组中的某几个特定值&#xff1b; 如提取数组中第1个和…

【数据结构】队列的概念、结构和实现详解

本文来介绍一下数据结构中的队列&#xff0c;以及如何用C语言去模拟实现。 1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。 特点&#xff1a;数据先进先出FIFO&#xff08;first in first out&#xf…

【Linux】设计文件系统(C实现)

要求&#xff1a; (1)可以实现下列几条命令 dir 列文件目录 create 创建文件 delete 删除文件 read 读文件 write 写文件 (2)列目录时要列出文件名、存取权限&#xff08;八进制&#xff09;、文件长度、时间&#xff08;创建时间&#xff0c;修改时间以及…