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

2.6.C++项目:网络版五子棋对战之数据管理模块-游戏房间管理模块的设计

在这里插入图片描述

文章目录

  • 一、意义
  • 二、功能
  • 三、作用
  • 四、游戏房间类基本框架
  • 五、游戏房间管理类基本框架
  • 七、游戏房间类代码
  • 八、游戏房间管理类代码

一、意义

对匹配成功的玩家创建房间,建立起一个小范围的玩家之间的关联关系!
房间里一个玩家产生的动作将会广播给房间里的其他用户。

二、功能

将这些房间管理起来,以便于进行房间生命周期的控制!

三、作用

  • 游戏房间类:
    // 实现两个部分:
    // 1. 房间的设计
    // 2. 房间管理的设置
    // 游戏房间的设计:
    // 管理的数据,处理房间中产生的动作
    // 1. 房间的ID
    // 2. 房间的状态(决定了一个玩家退出房间时所作的动作)
    // 3. 房间中玩家的数量(决定了玩家什么时候销毁)
    // 4. 白棋玩家id
    // 5. 黑棋玩家id
    // 6. 用户信息表的句柄(当玩家胜利/失败的时候更新用户数据)
    // 7. 棋盘信息(二维数组)
    // 房间中产生的动作:
    // 1. 下棋
    // 2. 聊天
    // 不管是什么动作,只要是合理的,都要广播给房间里的其他用户!
  • 游戏房间管理类:
    // Restful 风格的网络通信接口设计:
    // 房间管理:
    // 1. 创建房间 (两个玩家对战匹配完成了,为他们创造一个房间,需要传入两个玩家的用户id)
    // 2. 查找房间 (通过房间id查找房间信息,通过用户id查找房间所在信息)
    // 3. 销毁房间 (根据房间id销毁房间,房间中所有用户退出了,销毁房间)
    // 需要管理的数据:
    // 1. 数据管理模块句柄
    // 2. 在线用户管理模块句柄
    // 3. 房间id分配计数器
    // 4. 互斥锁
    // using room_ptr = std::shared_ptr; 房间信息的空间使用shared_ptr进行管理,释放了我们还操作,访问错误!
    // 5. unordered_map<room_id,room_ptr> 房间信息管理(建立起房间id与房间信息的映射关系)
    // 6. unordered_map<room_id,user_id> 房间id与用户id的关联关系管理! 通过用户id找到所在房间id,再去查找房间信息!
    // 7. 房间中所有用户退出了,销毁房间。

四、游戏房间类基本框架

typedef enum { GAME_START, GAME_OVER }room_statu;
class room {private:// 1. 房间的ID// 2. 房间的状态(决定了一个玩家退出房间时所作的动作)// 3. 房间中玩家的数量(决定了玩家什么时候销毁)// 4. 白棋玩家id// 5. 黑棋玩家id// 6. 用户信息表的句柄(当玩家胜利/失败的时候更新用户数据)// 7. 棋盘信息(二维数组)uint64_t _room_id;room_statu _statu;int _player_count;uint64_t _white_id;uint64_t _black_id;user_table *_tb_user; online_manager *_online_user;std::vector<std::vector<int>> _board;public:room()~room()/*处理下棋动作*/room_statu statu();int player_count();void add_white_user(uint64_t uid);void add_black_user(uint64_t uid);uint64_t get_white_user();uint64_t get_black_user();void handle_chess(Json::Value &req);/*处理聊天动作*/Json::Value handle_chat(Json::Value &req);/*处理玩家退出房间动作*/void handle_exit(uint64_t uid);/*将指定的信息广播给房间中所有玩家*/void broadcast(Json::Value &rsp);
};

五、游戏房间管理类基本框架

using room_ptr = std::shared_ptr<room>;class room_manager {private:uint64_t _next_rid;std::mutex _mutex;user_table *_tb_user;online_manager *_online_user;std::unordered_map<uint64_t, room_ptr> _rooms;std::unordered_map<uint64_t, uint64_t> _users;room_manager();~room_manager();//为两个用户创建房间,并返回房间的智能指针管理对象room_ptr create_room(uint64_t uid1, uint64_t uid2);/*通过房间ID获取房间信息*/room_ptr get_room_by_rid(uint64_t rid);/*通过用户ID获取房间信息*/room_ptr get_room_by_uid(uint64_t uid);/*通过房间ID销毁房间*/void remove_room(uint64_t rid);/*删除房间中指定用户,如果房间中没有用户了,则销毁房间,用户连接断开时被调用*/void remove_room_user(uint64_t uid);
};

七、游戏房间类代码

#ifndef __M_ROOM_H__
#define __M_ROOM_H__
#include "util.hpp"
#include "logger.hpp"
#include "online.hpp"
#include "db.hpp"
#define BOARD_ROW 15
#define BOARD_COL 15
#define CHESS_WHITE 1
#define CHESS_BLACK 2
typedef enum { GAME_START, GAME_OVER }room_statu;
class room {private:// 1. 房间的ID// 2. 房间的状态(决定了一个玩家退出房间时所作的动作)// 3. 房间中玩家的数量(决定了玩家什么时候销毁)// 4. 白棋玩家id// 5. 黑棋玩家id// 6. 用户信息表的句柄(当玩家胜利/失败的时候更新用户数据)// 7. 棋盘信息(二维数组)uint64_t _room_id;room_statu _statu;int _player_count;uint64_t _white_id;uint64_t _black_id;user_table *_tb_user; online_manager *_online_user;std::vector<std::vector<int>> _board;private: bool five(int row, int col, int row_off, int col_off, int color) {//row和col是下棋位置,  row_off和col_off是偏移量,也是方向int count = 1;int search_row = row + row_off;int search_col = col + col_off;while(search_row >= 0 && search_row < BOARD_ROW &&search_col >= 0 && search_col < BOARD_COL &&_board[search_row][search_col] == color) {//同色棋子数量++count++;//检索位置继续向后偏移search_row += row_off;search_col += col_off;}search_row = row - row_off;search_col = col - col_off;while(search_row >= 0 && search_row < BOARD_ROW &&search_col >= 0 && search_col < BOARD_COL &&_board[search_row][search_col] == color) {//同色棋子数量++count++;//检索位置继续向后偏移search_row -= row_off;search_col -= col_off;}return (count >= 5);}uint64_t check_win(int row, int col, int color) {// 从下棋位置的四个不同方向上检测是否出现了5个及以上相同颜色的棋子(横行,纵列,正斜,反斜)if (five(row, col, 0, 1, color) || five(row, col, 1, 0, color) ||five(row, col, -1, 1, color)||five(row, col, -1, -1, color)) {//任意一个方向上出现了true也就是五星连珠,则设置返回值return color == CHESS_WHITE ? _white_id : _black_id;}return 0;}public:room(uint64_t room_id, user_table *tb_user, online_manager *online_user):_room_id(room_id), _statu(GAME_START), _player_count(0),_tb_user(tb_user), _online_user(online_user),_board(BOARD_ROW, std::vector<int>(BOARD_COL, 0)){DLOG("%lu 房间创建成功!!", _room_id);}~room() {DLOG("%lu 房间销毁成功!!", _room_id);}uint64_t id() { return _room_id; }room_statu statu() { return _statu; }int player_count() { return _player_count; }void add_white_user(uint64_t uid) { _white_id = uid; _player_count++;}void add_black_user(uint64_t uid) {_black_id = uid; _player_count++; }uint64_t get_white_user() { return _white_id; }uint64_t get_black_user() { return _black_id; }// 处理下棋动作Json::Value handle_chess(Json::Value &req) {Json::Value json_resp = req;// 2. 判断房间中两个玩家是否都在线,任意一个不在线,就是另一方胜利。int chess_row = req["row"].asInt();int chess_col = req["col"].asInt();uint64_t cur_uid = req["uid"].asUInt64();if (_online_user -> is_in_game_room(_white_id) == false) {json_resp["result"] = true;json_resp["reason"] = "运气真好!对方掉线,不战而胜!";json_resp["winner"] = (Json::UInt64)_black_id;return json_resp;}if (_online_user->is_in_game_room(_black_id) == false) {json_resp["result"] = true;json_resp["reason"] = "运气真好!对方掉线,不战而胜!";json_resp["winner"] = (Json::UInt64)_white_id;return json_resp;}// 3. 获取走棋位置,判断当前走棋是否合理(位置是否已经被占用)if (_board[chess_row][chess_col] != 0) {json_resp["result"] = false;json_resp["reason"] = "当前位置已经有了其他棋子!";return json_resp;}int cur_color = cur_uid == _white_id ? CHESS_WHITE : CHESS_BLACK;_board[chess_row][chess_col] = cur_color;// 4. 判断是否有玩家胜利(从当前走棋位置开始判断是否存在五星连珠)uint64_t winner_id = check_win(chess_row, chess_col, cur_color);if (winner_id != 0) {json_resp["reason"] = "五星连珠,您获胜了!";}json_resp["result"] = true;json_resp["winner"] = (Json::UInt64)winner_id;return json_resp;}/*处理聊天动作*/Json::Value handle_chat(Json::Value &req) {Json::Value json_resp = req;// 检查消息中是否包含敏感词std::string msg = req["message"].asString();size_t pos = msg.find("sb");if (pos != std::string::npos) {json_resp["result"] = false;json_resp["reason"] = "消息中包含敏感词,不能发送!";return json_resp;}//广播消息---返回消息json_resp["result"] = true;return json_resp;}/*处理玩家退出房间动作*/void handle_exit(uint64_t uid) {//如果是下棋中退出,则对方胜利,否则下棋结束了退出,则是正常退出Json::Value json_resp;if (_statu == GAME_START) {uint64_t winner_id = (Json::UInt64)(uid == _white_id ? _black_id : _white_id);json_resp["optype"] = "put_chess";json_resp["result"] = true;json_resp["reason"] = "对方掉线,不战而胜!";json_resp["room_id"] = (Json::UInt64)_room_id;json_resp["uid"] = (Json::UInt64)uid;json_resp["row"] = -1;json_resp["col"] = -1;json_resp["winner"] = (Json::UInt64)winner_id;uint64_t loser_id = winner_id == _white_id ? _black_id : _white_id;_tb_user->win(winner_id);_tb_user->lose(loser_id);_statu = GAME_OVER;broadcast(json_resp);}//房间中玩家数量--_player_count--;return;}void handle_request(Json::Value &req) {//1. 校验房间号是否匹配Json::Value json_resp;uint64_t room_id = req["room_id"].asUInt64();if (room_id != _room_id) {json_resp["optype"] = req["optype"].asString();json_resp["result"] = false;json_resp["reason"] = "房间号不匹配!";return broadcast(json_resp);}//2. 根据不同的请求类型调用不同的处理函数if (req["optype"].asString() == "put_chess") {json_resp = handle_chess(req);if (json_resp["winner"].asUInt64() != 0) {uint64_t winner_id = json_resp["winner"].asUInt64();uint64_t loser_id = winner_id == _white_id ? _black_id : _white_id;_tb_user->win(winner_id);_tb_user->lose(loser_id);_statu = GAME_OVER;}}else if (req["optype"].asString() == "chat") {json_resp = handle_chat(req);}else {json_resp["optype"] = req["optype"].asString();json_resp["result"] = false;json_resp["reason"] = "未知请求类型";}std::string body;json_util::serialize(json_resp, body);DLOG("房间-广播动作: %s", body.c_str());return broadcast(json_resp);}/*将指定的信息广播给房间中所有玩家*/void broadcast(Json::Value &rsp) {//1. 对要响应的信息进行序列化,将Json::Value中的数据序列化成为json格式字符串std::string body;json_util::serialize(rsp, body);//2. 获取房间中所有用户的通信连接//3. 发送响应信息wsserver_t::connection_ptr wconn = _online_user->get_conn_from_room(_white_id);if (wconn.get() != nullptr) {wconn->send(body);}else {DLOG("房间-白棋玩家连接获取失败");}wsserver_t::connection_ptr bconn = _online_user->get_conn_from_room(_black_id);if (bconn.get() != nullptr) {bconn->send(body);}else {DLOG("房间-黑棋玩家连接获取失败");}return;}
};

八、游戏房间管理类代码

using room_ptr = std::shared_ptr<room>;class room_manager {
private:uint64_t _next_rid;std::mutex _mutex;user_table *_tb_user;online_manager *_online_user;std::unordered_map<uint64_t, room_ptr> _rooms;std::unordered_map<uint64_t, uint64_t> _users;
public:/*初始化房间ID计数器*/room_manager(user_table *ut, online_manager *om):_next_rid(1), _tb_user(ut), _online_user(om) {DLOG("房间管理模块初始化完毕!");}~room_manager() { DLOG("房间管理模块即将销毁!"); }//为两个用户创建房间,并返回房间的智能指针管理对象room_ptr create_room(uint64_t uid1, uint64_t uid2) {// 两个用户在游戏大厅中进行对战匹配,匹配成功后创建房间// 1. 校验两个用户是否都还在游戏大厅中,只有都在才需要创建房间。if (_online_user->is_in_game_hall(uid1) == false) {DLOG("用户:%lu 不在大厅中,创建房间失败!", uid1);return room_ptr();}if (_online_user->is_in_game_hall(uid2) == false) {DLOG("用户:%lu 不在大厅中,创建房间失败!", uid2);return room_ptr();}// 2. 创建房间,将用户信息添加到房间中std::unique_lock<std::mutex> lock(_mutex);room_ptr rp(new room(_next_rid,_tb_user,_online_user));rp->add_white_user(uid1);rp->add_black_user(uid2);//3. 将房间信息管理起来_rooms.insert(std::make_pair(_next_rid, rp));_users.insert(std::make_pair(uid1, _next_rid));_users.insert(std::make_pair(uid2, _next_rid));_next_rid++;//4. 返回房间信息return rp;}/*通过房间ID获取房间信息*/room_ptr get_room_by_rid(uint64_t rid) {std::unique_lock<std::mutex> lock(_mutex);auto it = _rooms.find(rid);if (it == _rooms.end()) {return room_ptr();}return it->second;}/*通过用户ID获取房间信息*/room_ptr get_room_by_uid(uint64_t uid) {std::unique_lock<std::mutex> lock(_mutex);//1. 通过用户ID获取房间IDauto uit = _users.find(uid);if (uit == _users.end()) {return room_ptr();}uint64_t rid = uit->second;//2. 通过房间ID获取房间信息auto rit = _rooms.find(rid);if (rit == _rooms.end()) {return room_ptr();}return rit->second;}/*通过房间ID销毁房间*/void remove_room(uint64_t rid) {//因为房间信息,是通过shared_ptr在_rooms中进行管理,因此只要将shared_ptr从_rooms中移除//则shared_ptr计数器==0,外界没有对房间信息进行操作保存的情况下就会释放//1. 通过房间ID,获取房间信息room_ptr rp = get_room_by_rid(rid);if (rp.get() == nullptr)return ;//2. 通过房间信息,获取房间中所有用户的IDuint64_t uid1 = rp->get_white_user();uint64_t uid2 = rp->get_black_user();//3. 移除房间管理中的用户信息std::unique_lock<std::mutex> lock(_mutex);_users.erase(uid1);_users.erase(uid2);//4. 移除房间管理信息_rooms.erase(rid);}/*删除房间中指定用户,如果房间中没有用户了,则销毁房间,用户连接断开时被调用*/void remove_room_user(uint64_t uid) {room_ptr rp = get_room_by_rid(uid);if (rp.get() == nullptr)return ;rp->handle_exit(uid);if (rp->player_count() == 0) {remove_room(rp->id());}return ;}
};#endif

相关文章:

2.6.C++项目:网络版五子棋对战之数据管理模块-游戏房间管理模块的设计

文章目录 一、意义二、功能三、作用四、游戏房间类基本框架五、游戏房间管理类基本框架七、游戏房间类代码八、游戏房间管理类代码 一、意义 对匹配成功的玩家创建房间&#xff0c;建立起一个小范围的玩家之间的关联关系&#xff01; 房间里一个玩家产生的动作将会广播给房间里…...

计算机视觉中的数据预处理与模型训练技巧总结

计算机视觉主要问题有图像分类、目标检测和图像分割等。针对图像分类任务&#xff0c;提升准确率的方法路线有两条&#xff0c;一个是模型的修改&#xff0c;另一个是各种数据处理和训练的技巧(tricks)。图像分类中的各种技巧对于目标检测、图像分割等任务也有很好的作用&#…...

GeoHash分享

写在前边 复制的一个内部分享&#xff0c;所以可能更偏向PPT性质&#xff0c;本文提出的问题&#xff0c;在末尾参考材料中都会有所提及&#xff0c;包括更深层次的实现原理和各大API对于GeoHash的优化。感兴趣的读者可以拓展看一下。 START GeoHash是一种地址编码&#xff…...

【超详细】CentOS 7安装MySQL 5.7【安装及密码配置、字符集配置、远程连接配置】

准备工作&#xff1a;CentOS 7系统&#xff0c;并确保可以联通网络 1、获取MySQL 5.7 Community Repository软件包 注意&#xff1a;这里使用的是root用户身份。 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2、安装软件包 rpm -ivh mysql5…...

Elasticsearch 8.X 分词插件版本更新不及时解决方案

1、关于 Elasticsearch 8.X IK 分词插件相关问题 球友在 ElasticSearch 版本选型问题中提及&#xff1a;如果要使用ik插件&#xff0c;是不是就使用目前最新的IK对应elasticsearch的版本“8.8.2”&#xff1f; https://github.com/medcl/elasticsearch-analysis-ik/releases/ta…...

Delete `␍`eslintprettier/prettier

将CRLF改为LF 然后就消失了 除此之外,也可以修改git全局配置 git config --global core.autocrlf false...

4种实用的制作URL 文件的方法

很多小伙伴有自己的博客、淘宝或者共享文件网站&#xff0c;想要分享、推广自己的网址做成url文件&#xff0c;让别人点击这个url文件直接访问自己的网站。URL文件其实就一个超级链接&#xff0c;制作的方法很多&#xff0c;这里列举4种。 收藏网站直接拖拽 1.第一种&#xf…...

css总结

记录做项目经常会写到的css 1、左边导航栏固定&#xff0c;右边div占满剩余宽度 <template><div class"entrance"><div class"left"></div><div class"right"><div class"content"></div>…...

[C语言]排序的大乱炖——喵喵的成长记

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…...

Docker 网络与Cgroup资源限制

目录 一、Docker 网络实现原理&#xff1a; 二、Docker 的网络模式&#xff1a; 三、网络模式详解&#xff1a; 1. host模式&#xff1a; 2. container模式&#xff1a; 3. none模式: 4&#xff0e;bridge模式: 5&#xff0e;自定义网络: 四、Cgroup资源控制&#xff1a; …...

D - United We Stand

思路&#xff1a; &#xff08;1&#xff09;题目要求将集合A划分为B&#xff0c;C两组&#xff0c;使得C中任意数都不是B中的除数 &#xff08;2&#xff09;直观感受&#xff0c;只要让C中数比B中大&#xff0c;则满足条件&#xff0c;不妨只取最大的放入C中&#xff1b; …...

【1.总纲】

目录 知识框架No.0 总纲安排No.1课程安排一、目标二、内容三、 学到 No.2 深度学习介绍一、AI地图二、图片分类三、物体检测和分割四、样式迁移五、人脸合成六、文字生成图片七、文字生成-GPT八、无人驾驶九、广告点击 No.3 安装No.3 安装 知识框架 No.0 总纲安排 B站网址&…...

I/O模型之非阻塞IO

简介 五种IO模型   阻塞IO   非阻塞IO   信号驱动IO   IO多路转接    异步IO 代码书写 非阻塞IO 再次理解IO 什么是IO&#xff1f;什么是高效的IO&#xff1f; 为了理解后面的一个问题&#xff0c;我们首先要再重新理解一下什么是IO 在之前的网络介绍中&#xff…...

2023版 STM32实战11 SPI总线读写W25Q

SPI全称 英文全称&#xff1a;Serial peripheral Interface 串行外设接口 SPI特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 全双工(收发可同时进行) -4- 通信只能由主机发起(一主,多从机) 开发使用习惯和理解 -1- CS片选一般配置为软件控制 -2- 片选低电平有效,从…...

Spring Security认证源码解析(示意图)

建议先看完Spring Security总体架构介绍和Spring Security认证架构介绍&#xff0c;然后从FilterChainProxy的doFilterInternal函数开始&#xff0c;配合文章进行debug以理解Spring Security认证源码的执行流程。 在之前的Spring Security认证架构介绍中&#xff0c;我们已经知…...

2023.10.22 关于 定时器(Timer) 详解

目录 引言 标准库定时器使用 自己实现定时器的代码 模拟实现的两大方面 核心思路 重点理解 自己实现的定时器代码最终代码版本 引言 定时器用于在 预定的时间间隔之后 执行特定的任务或操作 实例理解&#xff1a; 在服务器开发中&#xff0c;客户端向服务器发送请求&#…...

【STM32】GPIO控制LED(寄存器版)

在开始之前记得先准备好环境&#xff1a; STM32F103核心板下载教程.pdf 林何/STM32F103C8 - 码云 - 开源中国 (gitee.com) 一、STM32的GPIO模块数据手册详解 每个GPIO端口对应16个引脚&#xff0c;例GPIOA&#xff08;PA0~PA15&#xff09;内核cpu就可以通过APB2总线对寄存器…...

Spring Boot OAuth 2.0整合—高级配置

一、概述 HttpSecurity.oauth2Login() 为定制OAuth 2.0登录提供了大量的配置选项。主要的配置选项被分组到它们的协议端点对应处。 例如&#xff0c;oauth2Login().authorizationEndpoint() 允许配置授权端点&#xff0c;而 oauth2Login().tokenEndpoint() 允许配置令牌端点。…...

软考-虚拟专用网原理与应用

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 虚拟专用网概念 虚拟专用网&#xff08;Virtual Private Network&#xff09;是一种通过…...

clock_property 时钟的常用属性

get_property [get_clocks] property_option 1. period get_property [get_clocks] period 查询所有clock 的周期&#xff0c;如果存在loops会生成CTE_loops.rpt 2.clock_network_pins 查询clock所有的pins 3.generated_clocks_extended 查询clock分频产生的generate…...

OpenClaw学术伦理:Qwen3.5-9B论文辅助使用边界

OpenClaw学术伦理&#xff1a;Qwen3.5-9B论文辅助使用边界 1. 学术自动化工具的伦理困境 去年帮导师整理文献时&#xff0c;我第一次意识到自动化工具在学术场景中的边界问题。当时用Python脚本批量下载了300篇PDF&#xff0c;第二天就收到图书馆的IP封禁通知——原来触发了数…...

FPN实战:用PyTorch从零搭建特征金字塔网络(附代码)

FPN实战&#xff1a;用PyTorch从零搭建特征金字塔网络&#xff08;附代码&#xff09; 在计算机视觉领域&#xff0c;处理多尺度目标检测一直是个棘手的问题。想象一下&#xff0c;当你需要同时识别图像中近处的大象和远处的小鸟时&#xff0c;传统卷积神经网络往往会顾此失彼—…...

Windows系统的MBR磁盘分区

对于逻辑类数据恢复技术的学习&#xff0c;最重要的就是对各种系统下的分区结构及文件系统结构的学习。作为目前主流的操作系统Windows&#xff0c;它能够支持的分区结构包括MBR磁盘分区、动态磁盘分区及GPT磁盘分区&#xff1a;它能够支持的文件系统结构包括FAT12、FAT16、FAT…...

5分钟上手libhv:用自带httpd和curl工具快速搭建本地测试服务

5分钟实战libhv&#xff1a;零配置构建高效本地HTTP测试环境 第一次听说libhv时&#xff0c;我正被一个紧急的前后端联调任务逼得焦头烂额。当时需要快速搭建一个模拟API服务&#xff0c;但Node.js环境配置卡在了权限问题上&#xff0c;Python的SimpleHTTPServer又无法满足复杂…...

STM32内存优化实战:解决Keil5 L6406E报错与SRAM/FLASH分配策略

1. 认识Keil5 L6406E报错&#xff1a;内存不足的典型症状 第一次在Keil5里看到"Error: L6406E: No space in execution regions"这个红色报错时&#xff0c;我正把STM32F103的程序往STM32G0系列芯片移植。编译器的这个报错就像高速公路上的限高杆——明确告诉你装载的…...

崖山数据库的体系架构

一、 数据库与数据库实例YashanDB数据库&#xff0c;英文名称叫做Yashan Database。这里所说的数据库是一个物理上的概念&#xff0c;即指物理操作系统的文件或者磁盘的集合。换句话来说&#xff0c;YashanDB数据库是由物理硬盘上许多的文件组成。这些文件包含了数据文件、控制…...

归并排序力扣题(leetcode)萍

1.概述在人工智能快速发展的今天&#xff0c;AI不再仅仅是回答问题的聊天机器人&#xff0c;而是正在演变为能够主动完成复杂任务的智能代理。OpenAI的Codex CLI就是这一趋势的典型代表——一个跨平台的本地软件代理&#xff0c;能够在用户的机器上安全高效地生成高质量的软件变…...

艾尔登法环存档安全迁移工具:解决跨设备数据流转难题的专业方案

艾尔登法环存档安全迁移工具&#xff1a;解决跨设备数据流转难题的专业方案 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 一、当数字冒险遭遇数据断层&#xff1a;玩家必须面对的存档危机 你是否经历过这样…...

终极启动盘制作工具:Deepin Boot Maker 完整使用指南

终极启动盘制作工具&#xff1a;Deepin Boot Maker 完整使用指南 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker Deepin Boot Maker 是一款免费开源、简单快速的启动盘制作工具&#xff0c;专为新手和普通用户设计…...

SDD基于规范编程-OpenSpec及SuperPowers把

智能体时代的代码范式转移与 C# 的战略转型 传统的 C# 开发模式&#xff0c;即所谓的“工程导向型”开发&#xff0c;要求开发者创建一个复杂的项目结构&#xff0c;包括项目文件&#xff08;.csproj&#xff09;、解决方案文件&#xff08;.sln&#xff09;、属性设置以及依赖…...