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

《基于 C++ 的怪物掉落武器功能开发》

一、项目背景

    在游戏开发中,怪物掉落武器机制是丰富游戏玩法与提升玩家体验的关键部分。本功能基于 C++ 语言开发,旨在实现一套逻辑清晰、扩展性强的怪物掉落武器系统,为游戏核心玩法增添策略性与趣味性。

二、功能需求

(一)武器系统

    多样化武器属性:武器拥有攻击力、攻击速度、暴击几率、元素伤害等属性。这些属性影响英雄战斗表现,不同类型武器属性侧重点不同,如剑可能攻击力较高,弓攻击速度快。

    武器升级强化:提供upgrade()函数,可提升武器各项属性。升级消耗金币、特殊材料,且有成功率设定。例如,每次升级剑的攻击力提升 10,攻击速度提升 0.1,暴击几率提升 5%,元素伤害提升 5。

    可扩展武器类型:当前包含剑、弓、法杖,未来可方便添加新武器类型,如匕首、斧头、长枪等。武器基类设计具备良好扩展性,新武器类能轻松继承并实现特有属性与行为。

(二)英雄系统

    技能与武器适配:不同职业英雄(战士、弓箭手、法师)有独特技能,且与特定武器适配。通过std::unordered_map管理技能与武器适配关系,如战士使用剑时部分技能伤害额外提升,法师使用法杖技能效果增强。

     英雄成长机制:英雄随游戏进程升级,等级、生命值、攻击力、防御力、法力值等属性提升。不同职业成长特性不同,战士生命值和防御力成长高,法师法力值和元素伤害相关成长高。

    装备栏管理:英雄有装备栏,最多可装备 6 件物品,0 号位置为武器。提供equipWeapon()和replaceEquipment()函数,实现武器装备、替换逻辑,同时处理装备栏容量限制与装备间属性加成关系。

(三)怪物系统

    等级与难度区分:怪物分为低、中、高等级,各等级有难度设定。等级和难度影响武器掉落概率与属性,高级高难度怪物掉落高品质武器概率高,掉落武器属性更好。

    多样化怪物行为:怪物在战斗中有多样行为,包括攻击方式、防御机制、逃跑几率等。近战怪物可能近身攻击,远程怪物远程攻击,魔法怪物释放魔法技能,通过类成员函数和属性实现。

    怪物群体掉落策略:玩家击败怪物群体时,触发特殊掉落策略。如群体中 70% 怪物死亡,有 30% 概率掉落稀有武器,掉落武器与英雄职业相关,通过handleGroupDeath()函数实现。

(四)用户体验与界面需求

    武器获取提示:玩家获得武器时,游戏界面展示武器名称、属性、描述,与界面开发团队协作,确保提示视觉效果与用户体验良好。

    战斗信息展示:战斗中实时展示怪物(名称、等级、生命值)和英雄(生命值、法力值、当前装备武器)信息,武器掉落有动画或提示,增强玩家参与感。

    掉落概率可视化:游戏界面以进度条、百分比数字展示武器掉落概率,帮助玩家制定游戏策略。

(五)系统扩展性与维护性

    模块化设计:将武器、英雄、怪物系统封装在不同类和文件,模块间接口清晰,降低耦合度,便于维护与扩展。

    数据存储与加载:选择 XML 或 JSON 格式存储英雄、怪物、武器信息,设计读取和写入函数,确保数据持久化与可恢复性。

    版本更新兼容性:设计考虑版本更新,确保旧版本数据在新版本正确加载使用,避免版本更新导致游戏崩溃或异常。

三、技术选型

    编程语言:选用 C++,其高效性能、强大面向对象特性及对底层硬件控制能力,适合游戏功能模块开发。

    开发环境:推荐 G++、CLion(跨平台)等主流 IDE,提供代码编辑、调试、项目管理功能,提升开发效率。

四、数据结构与算法

数据结构

    用类组织武器、英雄、怪物数据。Weapon基类及派生类描述武器属性行为,Hero类存储英雄职业和属性,Monster类封装怪物行为。

    用enum定义英雄职业和怪物等级枚举,增强代码可读性与维护性。

    用struct定义WeaponAttributes和HeroAttributes结构体,存储武器和英雄详细属性。

    用std::unordered_map管理技能与武器适配关系,用std::vector实现英雄装备栏。

算法

    在Monster类die()函数中,结合怪物等级、难度与随机数生成算法决定武器掉落概率与类型。

    武器升级、英雄成长、怪物群体掉落等功能有对应算法,如武器升级根据资源和成功率计算新属性,怪物群体掉落根据怪物死亡比例和随机数决定是否掉落稀有武器。

五、接口设计

    武器接口:Weapon基类提供display()展示武器信息,upgrade()实现武器升级,派生类必须实现这些接口,保证获取武器指针后能统一调用。

    英雄接口:Hero类提供getClass()获取英雄职业,upgradeHero()实现英雄升级,equipWeapon()和replaceEquipment()用于装备管理,isSkillCompatible()判断技能与武器适配性。

    怪物接口:Monster类的die()函数是核心接口,接受Hero对象返回Weapon指针。同时提供获取怪物等级、行为模式等接口,支持怪物相关功能。

六、异常处理

    内存管理:使用new分配内存后,及时用delete释放,在Weapon基类析构函数添加日志记录,追踪内存释放。

    随机数异常:程序初始化测试rand()函数,确保随机数生成正常。

    功能异常:武器升级、英雄成长、怪物战斗等过程出现资源不足、参数错误等异常,在相应函数抛出特定异常,调用处捕获处理,保证程序稳定和用户体验。

七、性能优化

    减少计算量:避免频繁调用函数中复杂重复计算,缓存固定参数与计算结果,如武器升级参数启动时加载到内存。

    内存优化:合理分配动态内存,减少过度和频繁分配释放,临时数据用栈内存,及时释放不再使用的内存,减少内存碎片。

    算法优化:对武器升级、英雄成长、怪物群体掉落等复杂算法优化,如怪物群体掉落采用高效概率计算方法,英雄成长使用预先计算的成长曲线表。

八、测试计划

    单元测试:对Weapon基类及派生类测试display()和upgrade()函数,对Hero类测试getClass()及其他接口函数,对Monster类测试die()及相关接口函数,验证功能正确性。

    集成测试:测试英雄、怪物、武器系统交互,包括技能与武器适配、英雄成长、怪物行为、群体掉落策略等在集成环境下运行情况。

    性能测试:在不同硬件环境监测关键函数执行时间和内存使用,评估性能,针对瓶颈优化,确保游戏流畅运行。

    兼容性测试:在不同操作系统版本、设备型号测试兼容性,确保游戏功能正常,测试游戏数据在不同版本兼容性。

    用户测试:邀请玩家测试,收集反馈,根据反馈优化功能,提升用户满意度。

九、功能实现代码

#include <iostream>
#include <vector>
#include <unordered_map>
#include <random>
#include <string>
#include <fstream>
#include <nlohmann/json.hpp>// 使用 nlohmann::json 库来处理 JSON 数据
using json = nlohmann::json;/***定义武器属性结构体* * 该结构体用于存储武器的各项属性,包括攻击力、攻击速度、暴击几率和元素伤害。*/
struct WeaponAttributes {int attack;         // 攻击力float attackSpeed;  // 攻击速度float critRate;     // 暴击几率int elementDamage;  // 元素伤害
};/*** 定义英雄属性结构体* 该结构体用于存储英雄的各项属性,包括等级、生命值、攻击力、防御力和法力值。*/
struct HeroAttributes {int level;          // 等级int health;         // 生命值int attack;         // 攻击力int defense;        // 防御力int mana;           // 法力值
};/*** 定义英雄职业枚举* * 该枚举用于表示英雄的不同职业,目前包含战士、弓箭手和法师。*/
enum class HeroClass {Warrior,Archer,Mage
};/*** 定义怪物等级枚举* * 该枚举用于表示怪物的不同等级,目前包含低、中、高三个等级。*/
enum class MonsterLevel {Low,Medium,High
};/*** 武器基类* * 该类是所有武器类的基类,定义了武器的基本属性和行为,如展示信息和升级。*/
class Weapon {
protected:std::string name;  // 武器名称WeaponAttributes attributes;  // 武器属性public:/*** 构造函数* * name 武器名称* attributes 武器属性*/Weapon(const std::string& name, const WeaponAttributes& attributes): name(name), attributes(attributes) {}/*** 析构函数* * 析构时输出日志,用于追踪内存释放。*/virtual ~Weapon() {// 日志记录,追踪内存释放std::cout << "Weapon " << name << " destroyed." << std::endl;}/*** 展示武器信息* * 输出武器的名称和各项属性。*/virtual void display() const {std::cout << "Weapon: " << name << std::endl;std::cout << "Attack: " << attributes.attack << std::endl;std::cout << "Attack Speed: " << attributes.attackSpeed << std::endl;std::cout << "Crit Rate: " << attributes.critRate << "%" << std::endl;std::cout << "Element Damage: " << attributes.elementDamage << std::endl;}/*** 武器升级* * 提升武器的各项属性,可根据不同武器类型调整。*/virtual void upgrade() {// 升级逻辑,可根据不同武器类型调整attributes.attack += 10;attributes.attackSpeed += 0.1;attributes.critRate += 5;attributes.elementDamage += 5;}
};/*** 剑类,继承自武器基类* * 表示剑这种武器类型。*/
class Sword : public Weapon {
public:/*** @brief 构造函数* * @param name 剑的名称* @param attributes 剑的属性*/Sword(const std::string& name, const WeaponAttributes& attributes): Weapon(name, attributes) {}
};/*** 弓类,继承自武器基类* * 表示弓这种武器类型。*/
class Bow : public Weapon {
public:/*** @brief 构造函数* * @param name 弓的名称* @param attributes 弓的属性*/Bow(const std::string& name, const WeaponAttributes& attributes): Weapon(name, attributes) {}
};/*** 法杖类,继承自武器基类* * 表示法杖这种武器类型。*/
class Staff : public Weapon {
public:/*** @brief 构造函数* * @param name 法杖的名称* @param attributes 法杖的属性*/Staff(const std::string& name, const WeaponAttributes& attributes): Weapon(name, attributes) {}
};/*** 英雄类* * 该类管理英雄的职业、属性、装备栏和技能与武器的适配关系。*/
class Hero {
private:HeroClass heroClass;  // 英雄职业HeroAttributes attributes;  // 英雄属性std::vector<Weapon*> equipment;  // 英雄装备栏std::unordered_map<HeroClass, std::vector<HeroClass>> skillWeaponCompatibility;  // 技能与武器适配关系public:/*** 构造函数* * heroClass 英雄职业* attributes 英雄属性*/Hero(HeroClass heroClass, const HeroAttributes& attributes): heroClass(heroClass), attributes(attributes) {// 初始化技能与武器适配关系skillWeaponCompatibility[HeroClass::Warrior] = {HeroClass::Warrior};skillWeaponCompatibility[HeroClass::Archer] = {HeroClass::Archer};skillWeaponCompatibility[HeroClass::Mage] = {HeroClass::Mage};}/*** 析构函数* * 释放装备栏中武器的内存。*/~Hero() {// 释放装备内存for (Weapon* weapon : equipment) {delete weapon;}}/*** 获取英雄职业* * HeroClass 英雄职业*/HeroClass getClass() const {return heroClass;}/*** 英雄升级* * 根据英雄职业提升相应属性。*/void upgradeHero() {// 不同职业成长特性不同switch (heroClass) {case HeroClass::Warrior:attributes.health += 20;attributes.defense += 10;break;case HeroClass::Archer:attributes.attack += 15;attributes.attackSpeed += 0.1;break;case HeroClass::Mage:attributes.mana += 30;attributes.elementDamage += 15;break;}attributes.level++;}/*** 装备武器* * 将武器添加到英雄的装备栏中,如果装备栏已满则输出提示信息。* * weapon 要装备的武器指针*/void equipWeapon(Weapon* weapon) {if (equipment.size() < 6) {equipment.push_back(weapon);} else {std::cout << "Equipment slot is full." << std::endl;}}/*** 替换装备* * 替换指定位置的装备,如果位置无效则输出提示信息。* * slot 要替换的装备位置* weapon 新的武器指针*/void replaceEquipment(int slot, Weapon* weapon) {if (slot >= 0 && slot < equipment.size()) {delete equipment[slot];equipment[slot] = weapon;} else {std::cout << "Invalid equipment slot." << std::endl;}}/*** 判断技能与武器适配性* * 简单判断技能与武器是否适配,可根据实际需求扩展。* * @param weapon 要判断的武器指针* @return true 适配* @return false 不适配*/bool isSkillCompatible(const Weapon* weapon) const {// 这里简单判断,可根据实际需求扩展return true;}
};/*** 怪物类* * 该类封装了怪物的等级、难度和行为,包括武器掉落逻辑。*/
class Monster {
private:MonsterLevel level;  // 怪物等级int health;  // 怪物生命值int difficulty;  // 怪物难度public:/*** 构造函数* * level 怪物等级* health 怪物生命值* difficulty 怪物难度*/Monster(MonsterLevel level, int health, int difficulty): level(level), health(health), difficulty(difficulty) {}/*** 怪物死亡,决定武器掉落* * 根据怪物等级和随机数决定是否掉落武器,以及掉落武器的类型。* * hero 英雄对象* Weapon* 掉落的武器指针,如果未掉落则返回 nullptr*/Weapon* die(const Hero& hero) {std::random_device rd;  // 随机数种子std::mt19937 gen(rd());  // 随机数生成器std::uniform_int_distribution<> dis(1, 100);  // 均匀分布,范围 1 到 100int dropChance = 0;// 根据怪物等级设置掉落概率switch (level) {case MonsterLevel::Low:dropChance = 10;break;case MonsterLevel::Medium:dropChance = 30;break;case MonsterLevel::High:dropChance = 50;break;}// 生成随机数,判断是否掉落武器if (dis(gen) <= dropChance) {WeaponAttributes attributes;attributes.attack = 10 + difficulty * 5;attributes.attackSpeed = 1.0 + difficulty * 0.1;attributes.critRate = 5 + difficulty * 2;attributes.elementDamage = 5 + difficulty * 3;// 根据英雄职业决定掉落武器类型switch (hero.getClass()) {case HeroClass::Warrior:return new Sword("Sword", attributes);case HeroClass::Archer:return new Bow("Bow", attributes);case HeroClass::Mage:return new Staff("Staff", attributes);}}return nullptr;}/*** 处理怪物群体死亡* * 根据怪物群体的死亡比例和随机数决定是否掉落稀有武器。* * hero 英雄对象* groupSize 怪物群体大小* deadCount 死亡怪物数量* Weapon* 掉落的稀有武器指针,如果未掉落则返回 nullptr*/Weapon* handleGroupDeath(const Hero& hero, int groupSize, int deadCount) {if ((float)deadCount / groupSize >= 0.7) {std::random_device rd;  // 随机数种子std::mt19937 gen(rd());  // 随机数生成器std::uniform_int_distribution<> dis(1, 100);  // 均匀分布,范围 1 到 100// 生成随机数,判断是否掉落稀有武器if (dis(gen) <= 30) {WeaponAttributes attributes;attributes.attack = 20 + (int)level * 10;attributes.attackSpeed = 1.2 + (int)level * 0.2;attributes.critRate = 10 + (int)level * 5;attributes.elementDamage = 10 + (int)level * 8;// 根据英雄职业决定掉落稀有武器类型switch (hero.getClass()) {case HeroClass::Warrior:return new Sword("Rare Sword", attributes);case HeroClass::Archer:return new Bow("Rare Bow", attributes);case HeroClass::Mage:return new Staff("Rare Staff", attributes);}}}return nullptr;}/*** 获取怪物等级* * MonsterLevel 怪物等级*/MonsterLevel getLevel() const {return level;}
};/*** 保存游戏数据* * 将英雄和怪物的信息保存到 JSON 文件中。* * hero 英雄对象* monsters 怪物列表*/
void saveData(const Hero& hero, const std::vector<Monster>& monsters) {json heroData;heroData["class"] = static_cast<int>(hero.getClass());heroData["level"] = hero.getAttributes().level;heroData["health"] = hero.getAttributes().health;heroData["attack"] = hero.getAttributes().attack;heroData["defense"] = hero.getAttributes().defense;heroData["mana"] = hero.getAttributes().mana;json monsterData;for (const auto& monster : monsters) {json m;m["level"] = static_cast<int>(monster.getLevel());m["health"] = monster.getHealth();m["difficulty"] = monster.getDifficulty();monsterData.push_back(m);}json data;data["hero"] = heroData;data["monsters"] = monsterData;std::ofstream file("game_data.json");if (file.is_open()) {file << data.dump(4);file.close();}
}/*** 加载游戏数据* * 从 JSON 文件中加载英雄和怪物的信息。* * hero 英雄对象* monsters 怪物列表*/
void loadData(Hero& hero, std::vector<Monster>& monsters) {std::ifstream file("game_data.json");if (file.is_open()) {json data;file >> data;HeroClass heroClass = static_cast<HeroClass>(data["hero"]["class"].get<int>());HeroAttributes heroAttributes;heroAttributes.level = data["hero"]["level"].get<int>();heroAttributes.health = data["hero"]["health"].get<int>();heroAttributes.attack = data["hero"]["attack"].get<int>();heroAttributes.defense = data["hero"]["defense"].get<int>();heroAttributes.mana = data["hero"]["mana"].get<int>();hero = Hero(heroClass, heroAttributes);monsters.clear();for (const auto& m : data["monsters"]) {MonsterLevel level = static_cast<MonsterLevel>(m["level"].get<int>());int health = m["health"].get<int>();int difficulty = m["difficulty"].get<int>();monsters.emplace_back(level, health, difficulty);}file.close();}
}int main() {// 初始化英雄HeroAttributes heroAttributes = {1, 100, 20, 10, 50};Hero hero(HeroClass::Warrior, heroAttributes);// 初始化怪物Monster monster(MonsterLevel::Medium, 50, 2);// 怪物死亡,尝试掉落武器Weapon* droppedWeapon = monster.die(hero);if (droppedWeapon) {std::cout << "You got a weapon!" << std::endl;droppedWeapon->display();hero.equipWeapon(droppedWeapon);}// 保存数据std::vector<Monster> monsters = {monster};saveData(hero, monsters);// 加载数据Hero newHero(HeroClass::Warrior, {0, 0, 0, 0, 0});std::vector<Monster> newMonsters;loadData(newHero, newMonsters);return 0;
}

相关文章:

《基于 C++ 的怪物掉落武器功能开发》

一、项目背景 在游戏开发中&#xff0c;怪物掉落武器机制是丰富游戏玩法与提升玩家体验的关键部分。本功能基于 C 语言开发&#xff0c;旨在实现一套逻辑清晰、扩展性强的怪物掉落武器系统&#xff0c;为游戏核心玩法增添策略性与趣味性。 二、功能需求 &#xff08;一&#…...

C++11观察者模式示例

该示例代码采用C11标准&#xff0c;解决以下问题&#xff1a; 消除了类继承的强耦合方式&#xff1b;通知接口使用可变参数模板&#xff0c;支持任意参数&#xff1b; 示例代码 .h文件如下&#xff1a; #include <functional> #include <string> #include <…...

算法设计学习10

实验目的及要求&#xff1a; 本查找实验旨在使学生深入了解不同查找算法的原理、性能特征和适用场景&#xff0c;培养其在实际问题中选择和应用查找算法的能力。通过实验&#xff0c;学生将具体实现多种查找算法&#xff0c;并通过性能测试验证其在不同数据集上的表现&#xff…...

configurable_alternatives 方法与使用技巧

核心功能与应用场景 在开发调试过程中&#xff0c;当需要动态替换链中的完整组件​&#xff08;如大语言模型、提示词模板等&#xff09;并保持对话连续性时&#xff0c;可通过 configurable_alternatives() 实现运行时组件热替换。典型场景包括&#xff1a; 调试时切换不同版…...

Angular 2 模板语法详解

Angular 2 模板语法详解 引言 Angular 2 作为一款强大的前端框架,以其组件化的开发模式和高效的性能被众多开发者所青睐。模板语法是Angular 2中用于定义组件UI的关键部分。本文将详细介绍Angular 2的模板语法,帮助开发者更好地理解和运用这一功能。 模板语法概述 Angula…...

对称加密:原理、算法与应用全解析

对称加密作为密码学领域的核心技术&#xff0c;凭借其高效性与广泛应用&#xff0c;在数据安全领域占据重要地位。本文将从基础概念、历史发展、核心算法到实际应用场景&#xff0c;全方位解析对称加密技术的全貌&#xff0c;并探讨其面临的挑战与未来方向。 一、对称加密的核心…...

多线程编程中的锁策略

目录 1.悲观锁vs乐观锁 关键总结 悲观锁&#xff1a; 乐观锁&#xff1a; 选择建议 用 悲观锁 当&#xff1a; 用 乐观锁 当&#xff1a; 2.重量级锁vs轻量级锁 选择建议 用 轻量级锁&#xff1a; 用 重量级锁&#xff1a; 3.挂起等待锁vs自旋锁 关键细节说明 选择…...

win10 笔记本电脑安装 pytorch+cuda+gpu 大模型开发环境过程记录

win10 笔记本电脑安装 pytorchcudagpu 大模型开发环境过程记录 文章部分内容参考 deepseek。 以下使用命令行工具 mingw64。 安装 Anaconda 安装位置&#xff1a; /c/DEVPACK/Anaconda3 然后安装 Python 3.10.16 &#xff08;略&#xff09; $ conda create -n pytorch_…...

Layout Inspector平替跨平台布局分析器のAppium Inspector

引言 因为我有一个api为26的设备&#xff0c;因为 Layout Inspector 无法在 API 26 以下设备上使用&#xff0c;并且现在AS的 Hierarchy Viewer 和Android Device Monitor 均已经在SDK中剔除&#xff0c;故想再搜一个pc版的布局查看器&#xff0c;发现Appium Inspector学习成本…...

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法&#xff1a; TF-IDF&#xff1a;基于词频-逆文档频…...

常见NLP指标PPL,F1,Rouge-L,Accuracy (CLS),Accuracy (EM)总结

常见NLP指标PPL&#xff0c;F1&#xff0c;Rouge-L总结 1.PPL 2.F1 3.Rouge-L 4.Accuracy (CLS) 5.Accuracy (EM)...

Redis数据结构之ZSet

目录 1.概述2.常见操作2.1 ZADD2.2 ZRANGE2.3 ZREVRANGE2.4 ZRANGEBYSCORE2.5 ZSCORE2.6 ZCARD2.6 ZREM2.7 ZINCRBY2.8 ZCOUNT2.9 ZMPOP2.10 ZRANK2.11 ZREVRANK 3.总结 1.概述 ZSet和Set一样也是String类型元素的集合&#xff0c;且不允许重复的成员&#xff0c;不同的是ZSet…...

使用binance-connector库获取Binance全市场的币种价格,然后选择一个币种进行下单

一个完整的示例,展示如何使用 api 获取Binance全市场的币种价格,然后选择一个最便宜的币种进行下单操作 代码经过修改,亲测可用,目前只可用于现货,合约的待开发 获取市场价格:使用client.ticker_price()获取所有交易对的当前价格 账户检查:获取账户余额,确保有足够的资…...

磁盘分析工具合集:告别C盘焦虑!

今天李师傅带大家盘点五款硬盘空间分析利器&#xff0c;帮你精准定位那些"吃空间"的元凶&#xff0c;让C盘告别臃肿烦恼&#xff01; 一、WizTree 这款NTFS磁盘的"透视眼"堪称效率典范。它通过直接读取硬盘主文件表(MFT)实现秒级扫描&#xff0c;1TB机械…...

20250405在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统来适配gmac1

【暂时还没有解决让PRO-RK3566的eth0/gmac1开机就启动】 PRO-RK3566作为iperf服务器&#xff1a; rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/# ifconfig -a rootrk3566-buildroot:/# ifconfig eth0 up rootrk3566-buildroot:/# ifconfig rootrk3566-buildroot:/…...

Spring / Spring Boot 的@MapperScan 和 @Repository

MapperScan 和 Repository 是两个与数据访问层相关的注解&#xff0c;它们在功能上有一定的联系&#xff0c;但也有明显的区别。 一、相同点 1. 都与数据访问层相关 MapperScan&#xff1a;用于扫描 MyBatis 的 Mapper 接口。MyBatis 是一个流行的持久层框架&#xff0c;Mapp…...

SDL中SDL_AudioSpec结构体参数

文章目录 ✅ SDL_AudioSpec 结构体定义&#x1f4cc; 每个字段详细解释 设置依据1. freq&#xff1a;采样频率&#xff08;Sample Rate&#xff09;2. format&#xff1a;采样格式&#xff08;Sample Format&#xff09;3. channels&#xff1a;通道数&#xff08;Channels&am…...

每日一题(小白)模拟娱乐篇14

直接理解题意&#xff0c;一分钟扩散一次&#xff0c;那么2020分钟也就是需要循环2020次&#xff0c;然后加入扩散后的条件&#xff0c;每一个次扩散使方格子的总量1&#xff08;只要有一个点扩散就无需看其他的点&#xff09;&#xff0c;若干次循环过后总数之和即所有黑色格子…...

使用 Python 爬取并打印双色球近期 5 场开奖数据

使用 Python 爬取并打印双色球近期 5 场开奖数据 前期准备安装所需库 完整代码代码解析 1. 导入必要的库2. 定义函数 get_recent_five_ssq 3. 设置请求的 URL 和 Headers 4. 发送请求并处理响应5. 解析 HTML 内容6. 提取并打印数据7. 错误处理 首先看下运行的效果图&#xff1a…...

再见VS Code!Google IDE 正颠覆传统开发体验

云端开发的革命&#xff1a;Google Project IDX 如何颠覆传统开发体验 在软件开发领域&#xff0c;Google 最新推出的 Project IDX 绝非仅仅是另一个“基于浏览器的 VS Code”——它是一次真正的范式转变。与 VS Code、Cursor 等传统工具不同&#xff0c;IDX 是一个完全云原生的…...

Java Web从入门到精通:全面探索与实战(一)

目录 引言&#xff1a;开启 Java Web 之旅​ 一、Java Web 基础概念大揭秘​ 1.1 什么是 Java Web​ 1.2 Java Web 的优势剖析​ 1.3 Java Web 相关核心概念详解 二、搭建 Java Web 开发环境&#xff1a;步步为营 2.1 所需软件大盘点​ 2.2 软件安装与配置全流程​ 三…...

AI+自动化测试:如何让测试编写效率提升10倍?

文章目录 摘要传统自动化测试的痛点编写测试用例太费时间测试覆盖率难以保证UI 测试维护成本高 AI 如何优化自动化测试&#xff1f;AI 生成单元测试&#xff1a;减少重复工作&#xff0c;提高覆盖率传统方法 VS AI 方法 使用 AI 生成 Python 单元测试自动补全边界情况传统方法 …...

软件工程面试题(三十)

将ISO8859-1字符串转成GB2312编码&#xff0c;语句为&#xff1f; String snew String(text.getBytes(“iso8859-1”),”gb2312”). 说出你用过的J2EE标准的WEB框架和他们之间的比较&#xff1f; 答&#xff1a;用过的J2EE标准主要有&#xff1a;JSP&Servlet、JDBC、JNDI…...

01-STM32(介绍、工具准备、新建工程)p1-4

文章目录 工具准备和介绍硬件设备stm32简介和arm简介stm32简介STM32命名规则STM32选型STM32F103C8T6最小系统板引脚定义STM32启动配置STM32最小系统电路ARM简介 软件安装注册器件支持包安装ST-LINK驱动安装USB转串口驱动 新建工程创建stm32工程STM32工程编译和下载型号分类及缩…...

Win10定时任务计划无法显示要执行的EXE任务程序界面,问题解决办法

用C#开发的一款WINFORM程序&#xff0c;在电脑测试一切顺利&#xff0c;运行结果正确。但用电脑的定时任务执行时&#xff0c;程序界面不显示&#xff0c;重启电脑、各种试都不行&#xff0c;最终问题解决。 解决办法&#xff1a; 要选“只在用户登陆时运行”&#xff0c;才能执…...

STM32CubeMX-H7-12-IIC读写MPU6050模块(中)-MPU6050模块详解以及软件IIC驱动

前言 上一篇我们已经完成对IIC代码基本框架的编写&#xff0c;以及获取MPU6050的ID&#xff0c;接下来我们逐一分析这个模块的功能&#xff0c;并用IIC驱动 建议看完上一篇再来看这篇 MPU6050寄存器介绍 1.电源管理寄存器&#xff08;PWR_MGMT_1&#xff0c;地址&#xff1a;0…...

基于Go语言实现一个网络聊天室(连接Redis版)

基于Go语言和Redis的实时聊天室项目详解 项目概述 在这个项目中&#xff0c;我们实现了一个基于Go语言和Redis的实时聊天室系统。该系统允许用户通过客户端连接到服务器&#xff0c;进行实时聊天&#xff0c;并且支持以下功能&#xff1a; 用户网名注册和验证消息广播和接收…...

深入解析 RocketMQ 中的 BrokerOuterAPI 组件​

在 RocketMQ 这一高性能分布式消息队列系统中&#xff0c;BrokerOuterAPI 组件犹如一座桥梁&#xff0c;连接着 Broker 与外部世界&#xff0c;在系统的运行、管理以及与其他组件交互过程中发挥着极为关键的作用。本文将深入探讨 BrokerOuterAPI 组件的内部机制、核心功能以及其…...

make_01_Program_06_:: 是什么功能

在 Makefile 中&#xff0c;:: 是一种特殊的分隔符&#xff0c;用于创建多重规则&#xff08;multiple rules&#xff09;。当您使用 :: 定义目标时&#xff0c;您可以为同一个目标指定多个命令或多个依赖关系。每个命令将在构建目标时按顺序执行&#xff0c;不会影响其他命令的…...

springboot2.7.x整合nacos+seata

1、nacos及seata下载地址 Nacos Server 下载 | Nacos 官网 Seata Java Download | Apache Seata 这里的seata版本用2.1.0版本。 2、启动nacos D:\本地-seata-nacos\nacos-server\bin>startup.cmd -m standalone 3、修改seata的conf下的application的内容 这里的数据库…...