【五子棋在线对战】二.项目结构设计 实用工具类模板的实现

项目结构设计

  • 1.项目模块划分
  • 2.业务处理模块子模块的划分
  • 3.实用工具类模板的实现
    • 3.1 日志宏的实现
    • 3.2 mysql工具
    • 3.3 JsonCpp工具
    • 3.4 string-Split工具 && file_util工具

1.项目模块划分

● 数据管理模块:依托 MySQL 数据库,负责用户数据的存储与管理,如注册信息、游戏记录等,为系统提供数据支撑。
● 前端界面模块:基于 JavaScript 开发,实现注册、登录、游戏大厅、游戏房间等页面的动态交互,同时处理与服务器的通信,确保用户操作(如匹配、对战、聊天)的实时反馈。
● 业务处理模块:搭建 WebSocket 服务器,作为客户端与服务器的通信桥梁,接收并处理各类业务请求(如用户认证、对战逻辑、消息转发等),是系统的核心业务处理层。

2.业务处理模块子模块的划分

  1. 网络通信模块
    ○ 基于websocketpp库,搭建 HTTP 和 WebSocket 服务器,提供网络通信能力,支持客户端与服务器的实时数据传输,是系统的通信基础。
  2. 会话管理模块
    ○ 利用cookie&session机制,在 HTTP 短连接场景下识别客户端身份,维持会话状态,解决 HTTP 无状态特性,确保用户身份一致性。
  3. 在线管理模块
    ○ 管理游戏大厅和房间内用户,监控在线状态,提供连接获取接口,支持实时对战和聊天的用户状态跟踪,确保离线用户不参与实时交互。
  4. 房间管理模块
    ○ 为匹配成功用户创建对战房间,处理五子棋对战(落子校验、胜负判断、棋盘同步)和聊天业务(消息广播),封装房间内业务逻辑,隔离多房间状态。
  5. 用户匹配模块
    ○ 按天梯分数分层匹配玩家,匹配成功后创建房间并加入用户,实现公平高效的玩家匹配,减少等待时间,提升对战体验。

3.实用工具类模板的实现

实用工具类模板主要负责提前实现一些代码中会用到的边缘代码,提前实现了就可以在项目中直接使用了。

3.1 日志宏的实现

在实现项目中,肯定会遇到bug,以及在项目上线之后也要定期观察项目的情况
所以日志的实现大致思想就是:设置一些日志等级,在测试项目的时候要打印出信息,项目上限之后把日志打印到文件中。
介绍一下关于时间戳的一些函数

time_t time(NULL) 获取时间戳
struct tm localtime(time_t * t) 根据时间戳生成时间格式
char strftime (char
buff,int max,char* format, struct tm tm) 组织结构
int fprintf(FILE
fp,char* fromat,…) 写入文件

#define INF 0
#define DBG 1
#define ERR 2
#define DEFAULT_LOG_LEVEL INF
//获得时间戳,将时间戳转换为一个时间结构,按照一定的格式放在指定空间中
#define LOG(level,format,...) do{\if(DEFAULT_LOG_LEVEL>level) break;\time_t t=time(NULL);\struct tm* lt=localtime(&t);\char buff[32]={0};\strftime(buff,31,"%H:%M:%S",lt);\fprintf(stdout,"[%s %s:%d] " format "\n",buff,__FILE__,__LINE__, ##__VA_ARGS__);\
}while(0)
//使用 do-while(0) 结构, 将多条语句组合成一个代码块,确保宏在展开时能够像一条语句一样使用
//##__VA_ARGS__是可变参数列表的占位符,## 用于处理可变参数为空的情况
#define ILOG(format,...) LOG(INF,format,##__VA_ARGS__)
#define DLOG(format,...) LOG(DBG,format,##__VA_ARGS__)
#define ELOG(format,...) LOG(ERR,format,##__VA_ARGS__)

3.2 mysql工具

这个工具主要用于数据库的连接&&初始化,句柄的销毁,语句的执行
在这里插入图片描述

3.3 JsonCpp工具

实现序列化和反序列化
在这里插入图片描述

3.4 string-Split工具 && file_util工具

一个是对字符串的分割,一个是文件数据的读取功能(对html文件数据进行读取)

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

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

相关文章

53 python akshare(获取金融数据)

在金融数据获取与分析领域,AkShare是一个强大且灵活的开源库,它提供了丰富的金融数据接口,覆盖股票、期货、期权、基金、债券、外汇等多个金融市场。AkShare更专注于中国金融市场数据,并且支持从多个数据源获取数据,具有更高的稳定性和更全面的数据覆盖。 一、安装akshar…

蓝桥杯17114 残缺的数字

问题描述 七段码显示器是一种常见的显示数字的电子元件,它由七个发光管组成: 图依次展示了数字 0∼9 用七段码来显示的状态,其中灯管为黄色表示点亮,灰色表示熄灭。根据灯管的亮暗状态,我们可以用一个状态码(状态码是一个 7 位的…

Java观察者模式深度解析:构建松耦合事件驱动系统的艺术

目录 观察者模式基础解析核心结构与实现原理Java内置观察者实现Spring框架中的高级应用典型应用场景与实战案例观察者模式变体与优化常见问题与最佳实践总结与未来展望1. 观察者模式基础解析 1.1 模式定义与核心思想 观察者模式(Observer Pattern)是一种行为型设计模式,它…

NocoBase v1.7.0 正式版发布

原文链接:https://www.nocobase.com/cn/blog/nocobase-1-7-0。 新特性 用户角色并集 角色并集是一种权限管理模式,根据系统设置,系统开发者可以选择使用独立角色、允许角色并集,或者仅使用角色并集,以满足不同的权限…

破解通信难题,modbus转profibus网关在高炉水冲渣系统中稳定好用

基于在高炉水冲渣传动监控系统的工艺背景下,稳联技术Profibus-Modbus网关在控制系统中使支持Profibus协议的设备与支持Modbus RTU协议的设备之间进行通讯协议转换的作用,使得支持不同通讯协议的设备之间能够进行数据传递,并且给出了设计方法.应用Profibus-Modbus总线桥WL-ABD30…

开源是什么?我们为什么要开源?

本片为故事类文章推荐听音频哦 软件自由运动的背景 梦开始的地方 20世纪70年代,软件行业处于早期发展阶段,软件通常与硬件捆绑销售,用户对软件的使用、修改和分发权利非常有限。随着计算机技术的发展和互联网的普及,越来越多的开…

Educational Codeforces Round 179 (Rated for Div. 2)(A-E)

题目链接:Dashboard - Educational Codeforces Round 179 (Rated for Div. 2) - Codeforces A. Energy Crystals 思路 贪心地模拟一下过程很容易就看出来了,每次变成尽可能大的数 1 1 0 -> 1 1 3 -> 3 3 5 -> 5 5 11....我们只需要关注最大…

React Native开发鸿蒙运动健康类应用的项目实践记录

​​项目名称​​:HarmonyFitness - 基于React Native的鸿蒙运动健康应用 ​​技术栈​​:React Native 0.72.5 TypeScript HarmonyOS API ArkTS原生模块 一、环境搭建与项目初始化 ​​双环境配置​​ ​​React Native环境​​: npx re…

Linux --UDP套接字实现简单的网络聊天室

一、Server端的实现 1.1、服务端的初始化 ①、创建套接字&#xff1a; 创建套接字接口&#xff1a; #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); //1. 这是一个创建套接字的接…

Eureka 高可用集群搭建实战:服务注册与发现的底层原理与避坑指南

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…

Spring Boot应用开发实战

Spring Boot应用开发实战&#xff1a;从零到生产级项目的深度指南 在当今Java生态中&#xff0c;Spring Boot已占据绝对主导地位——据统计&#xff0c;超过75%的新Java项目选择Spring Boot作为开发框架。本文将带您从零开始&#xff0c;深入探索Spring Boot的核心精髓&#xf…

yum更换阿里云的镜像源

步骤 1&#xff1a;备份原有源配置&#xff08;重要&#xff01;&#xff09; sudo mkdir /etc/yum.repos.d/backup sudo mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backup/步骤 2&#xff1a;下载阿里云源配置 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https:…

【算法训练营Day06】哈希表part2

文章目录 四数相加赎金信三数之和四数之和 四数相加 题目链接&#xff1a;454. 四数相加 II 这个题注意它只需要给出次数&#xff0c;而不是元组。所以我们可以分治。将前两个数组的加和情况使用map存储起来&#xff0c;再将后两个数组的加和情况使用map存储起来&#xff0c;ke…

JS手写代码篇---手写apply方法

11、手写apply方法 apply方法的作用&#xff1a; apply 是一个函数的方法&#xff0c;它允许你调用一个函数&#xff0c;同时将函数的 this 值设置为指定的值&#xff0c;并将函数的参数作为数组&#xff08;或类数组对象&#xff09;传递给该函数。 与call的区别&#xff1…

幂等性:保障系统稳定的关键设计

幂等性&#xff08;Idempotence&#xff09; 是计算机科学和分布式系统中的核心概念&#xff0c;指同一操作重复执行多次所产生的效果与执行一次的效果相同。这一特性对系统容错性、数据一致性至关重要&#xff0c;尤其在网络通信&#xff08;如HTTP&#xff09;和数据库设计中…

electron定时任务,打印内存占用情况

// 监听更新 function winUpdate(){// 每次执行完后重新设置定时器try {// 获取当前时间并格式化为易读的字符串const now new Date();const timeString now.toLocaleString();console.log(当前时间: ${timeString});// 记录内存使用情况&#xff08;可选&#xff09;const m…

华为手机开机卡在Huawei界面不动怎么办?

遇到华为手机卡在启动界面&#xff08;如HUAWEI Logo界面&#xff09;的情况&#xff0c;可依次尝试以下解决方案&#xff0c;按操作复杂度和风险由低到高排序&#xff1a; &#x1f527; 一、强制重启&#xff08;优先尝试&#xff09; 1.通用方法‌ 长按 ‌电源键 音量下键‌…

Python爬虫之数据提取

本章节主要会去学习在爬虫中的如何去解析数据的方法&#xff0c;要学习的内容有&#xff1a; 响应数据的分类结构化数据如何提取非结构化数据如何提取正则表达式的语法以及使用jsonpath解析嵌套层次比较复杂的json数据XPath语法在Python代码中借助lxml模块使用XPath语法提取非…

并行智算MaaS云平台:打造你的专属AI助手,开启智能生活新纪元

目录 引言&#xff1a;AI助手&#xff0c;未来生活的必备伙伴 并行智算云&#xff1a;大模型API的卓越平台 实战指南&#xff1a;调用并行智算云API打造个人AI助手 3.1 准备工作 3.2 API调用示例 3.3 本地智能AI系统搭建 3.4 高级功能实现 并行智算云的优势 4.1 性能卓越…

三维坐标转换

如果坐标(x,y,z)->(y,-z,-x)可以使用坐标系&#xff1a; import mathdef mat_vec_mult(matrix, vector):"""将 3x3 矩阵与 3x1 向量相乘。参数&#xff1a;matrix: 3x3 的旋转矩阵vector: 3x1 的向量返回&#xff1a;3x1 的结果向量"""resul…