{"id":29311640,"url":"https://github.com/shiweimeiya/cpp-epoll-reactor-server","last_synced_at":"2026-05-09T19:11:12.528Z","repository":{"id":302126032,"uuid":"1011351491","full_name":"shiweimeiya/cpp-epoll-reactor-server","owner":"shiweimeiya","description":"C/C++服务端项目，epoll+线程池的reactor模型，适合新手学习完服务器项目后来这里增加业务量，读者可以增加redis、MySQL提升项目框架完整性🚀 Tank Battle - 高性能多人在线坦克对战游戏 一个展示现代网络游戏架构设计的完整项目。使用C语言构建高并发服务器端（epoll + 线程池 + 多房间系统），Python+Pygame开发跨平台客户端。支持2-4人实时对战，包含动态地图生成、碰撞检测、自定义网络协议等核心功能。 ✨ 核心特性： 异步I/O网络模型 | 线程池并发处理 | 房间管理系统 | 实时状态同步 | 跨平台客户端 🛠️ 技术栈： C语言服务器 | Python客户端 | 自定义二进制协议 | Pygame图形引擎 适合学习网络编程、游戏开发、系统","archived":false,"fork":false,"pushed_at":"2025-06-30T17:36:07.000Z","size":37,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-02T00:56:11.320Z","etag":null,"topics":["c","cpp","epoll","gui","python","socket"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shiweimeiya.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-30T17:20:59.000Z","updated_at":"2025-07-07T02:23:17.000Z","dependencies_parsed_at":"2025-06-30T18:43:24.574Z","dependency_job_id":null,"html_url":"https://github.com/shiweimeiya/cpp-epoll-reactor-server","commit_stats":null,"previous_names":["shiweimeiya/-"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/shiweimeiya/cpp-epoll-reactor-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shiweimeiya%2Fcpp-epoll-reactor-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shiweimeiya%2Fcpp-epoll-reactor-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shiweimeiya%2Fcpp-epoll-reactor-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shiweimeiya%2Fcpp-epoll-reactor-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shiweimeiya","download_url":"https://codeload.github.com/shiweimeiya/cpp-epoll-reactor-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shiweimeiya%2Fcpp-epoll-reactor-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32831634,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"online","status_checked_at":"2026-05-09T02:00:06.633Z","response_time":123,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","cpp","epoll","gui","python","socket"],"created_at":"2025-07-07T08:15:40.298Z","updated_at":"2026-05-09T19:11:12.510Z","avatar_url":"https://github.com/shiweimeiya.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Tank Battle - 多人在线坦克大战游戏（项目，C/C++后端）\nC/C++选手使用学习了服务端开发项目后，觉得业务代码不够的可以学习这个项目。增加redis、MySQL后会更加适合找工作。\n\n一个基于客户端-服务器架构的多人在线坦克对战游戏，支持2~4名玩家同时在线同一房间对战。游戏使用C语言开发高性能服务器端，Python+Pygame开发友好的客户端界面。\n\n## 📋 目录\n\n- [游戏特色](#-游戏特色)\n- [技术架构](#-技术架构)\n- [系统要求](#-系统要求)\n- [快速开始](#-快速开始)\n- [详细安装指南](#-详细安装指南)\n- [游戏玩法](#-游戏玩法)\n- [网络协议](#-网络协议)\n- [技术实现](#-技术实现)\n- [配置说明](#-配置说明)\n- [故障排除](#-故障排除)\n- [开发指南](#-开发指南)\n- [贡献指南](#-贡献指南)\n- [许可证](#-许可证)\n\n## 🎮 游戏特色\n\n### 核心功能\n- **多人在线对战**: 支持2-4名玩家同时游戏\n- **房间系统**: 自动房间分配，支持多个房间并发运行\n- **实时对战**: 流畅的实时移动、射击和碰撞检测\n- **动态地图**: 每局游戏生成不同的随机地图\n- **可破坏墙体**: 战术性地破坏障碍物开辟新路径\n\n### 技术特色\n- **高性能服务器**: 使用epoll的异步I/O模型\n- **线程池架构**: 高效处理并发连接\n- **跨平台客户端**: 基于Pygame的图形界面\n- **自定义网络协议**: 二进制协议确保低延迟\n- **资源管理**: 支持自定义图片资源\n\n## 🏗️ 技术架构\n\n### 服务器端 (C语言)\n```\n┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐\n│   主线程         │    │   线程池         │    │   房间线程        │\n│  - 网络监听      │───▶│  - 客户端处理    │───▶│  - 游戏逻辑      │\n│  - 连接管理      │    │  - 消息分发      │    │  - 碰撞检测      │\n│  - epoll事件     │    │  - 工作队列      │    │  - 状态同步      │\n└─────────────────┘    └─────────────────┘    └─────────────────┘\n```\n\n### 客户端 (Python)\n```\n┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐\n│   主线程         │    │   网络线程       │    │   渲染引擎        │\n│  - 游戏循环      │◀──▶│  - 数据接收      │───▶│  - 图像渲染      │\n│  - 事件处理      │    │  - 协议解析      │    │  - 动画显示      │\n│  - 用户输入      │    │  - 状态更新      │    │  - UI绘制        │\n└─────────────────┘    └─────────────────┘    └─────────────────┘\n```\n\n## 💻 系统要求\n\n### 服务器端\n- **操作系统**: Linux (推荐 Ubuntu 18.04+, CentOS 7+)\n- **编译器**: GCC 7.0+ \n- **系统库**: pthread, epoll (Linux系统自带)\n- **内存**: 最少128MB RAM\n- **网络**: 支持TCP连接的网络环境\n\n### 客户端\n- **操作系统**: Windows 10+, macOS 10.14+, Linux\n- **Python版本**: Python 3.7+\n- **依赖库**: pygame 2.0+\n- **内存**: 最少256MB RAM\n- **显示**: 支持800x600以上分辨率\n\n## 🚀 快速开始\n\n### 1. 克隆项目\n```bash\ngit clone https://github.com/yourusername/tank-battle.git\ncd tank-battle\n```\n\n### 2. 启动服务器\n```bash\n# 编译服务器\ngcc -o tank_server server.c -lpthread\n\n# 运行服务器\n./tank_server\n```\n\n### 3. 启动客户端\n```bash\n# 安装依赖\npip install pygame\n\n# 运行客户端\npython client.py\n```\n\n### 4. 开始游戏\n- 输入用户名\n- 等待其他玩家加入\n- 使用方向键移动，空格键射击\n\n## 📦 详细安装指南\n\n### 服务器端安装\n\n#### Ubuntu/Debian\n```bash\n# 更新包管理器\nsudo apt update\n\n# 安装编译工具\nsudo apt install build-essential\n\n# 克隆项目\ngit clone https://github.com/yourusername/tank-battle.git\ncd tank-battle\n\n# 编译服务器\ngcc -o tank_server server.c -lpthread -std=c99\n\n# 运行服务器\n./tank_server\n```\n\n#### CentOS/RHEL\n```bash\n# 安装编译工具\nsudo yum groupinstall \"Development Tools\"\n\n# 克隆项目\ngit clone https://github.com/yourusername/tank-battle.git\ncd tank-battle\n\n# 编译服务器\ngcc -o tank_server server.c -lpthread -std=c99\n\n# 运行服务器\n./tank_server\n```\n\n### 客户端安装\n\n#### Windows\n```bash\n# 安装Python (从python.org下载)\n# 安装pip (通常随Python一起安装)\n\n# 安装依赖\npip install pygame\n\n# 运行客户端\npython client.py\n```\n\n#### macOS\n```bash\n# 安装Homebrew (如果还没安装)\n/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"\n\n# 安装Python\nbrew install python\n\n# 安装依赖\npip3 install pygame\n\n# 运行客户端\npython3 client.py\n```\n\n#### Linux\n```bash\n# Ubuntu/Debian\nsudo apt install python3 python3-pip\npip3 install pygame\n\n# CentOS/RHEL\nsudo yum install python3 python3-pip\npip3 install pygame\n\n# 运行客户端\npython3 client.py\n```\n\n## 🎯 游戏玩法\n\n### 基本操作\n- **移动**: 使用方向键 ↑↓←→ 控制坦克移动\n- **射击**: 按空格键发射子弹\n- **目标**: 击败所有其他玩家成为最后的胜利者\n\n### 游戏规则\n1. **玩家数量**: 每个房间支持2-4名玩家\n2. **胜利条件**: 成为最后存活的玩家\n3. **死亡条件**: 被其他玩家的子弹击中\n4. **重生机制**: 游戏结束后自动开始新的一轮\n\n### 地图元素\n- **🟫 墙体**: 不可穿越，子弹无法穿透\n- **🟤 可破坏墙体**: 可被子弹摧毁\n- **🟢 空地**: 可自由移动的区域\n- **🔴🔵🟡🟢 坦克**: 不同颜色代表不同玩家\n\n### 战术提示\n- 利用墙体作为掩护\n- 战略性地破坏墙体开辟新路径\n- 预判敌人移动方向\n- 控制好射击时机\n\n## 🌐 网络协议\n\n### 协议设计\n游戏使用自定义的二进制协议进行通信，确保低延迟和高效率。\n\n### 客户端到服务器\n```\n登录消息: 'L' + 用户名(UTF-8字符串)\n移动消息: 'M' + 玩家ID + 方向(0-3)\n射击消息: 'S' + 玩家ID\n```\n\n### 服务器到客户端\n```\n房间分配: 'R' + 房间ID + 玩家ID\n游戏更新: 'U' + 房间ID + 地图数据 + 玩家数据 + 子弹数据 + 游戏状态\n游戏开始: 'G' + 房间ID\n游戏结束: 'O' + 获胜者ID\n```\n\n### 数据结构\n- **方向码**: 上(0), 右(1), 下(2), 左(3)\n- **地图码**: 空地(0), 墙体(1), 可破坏墙体(2), 坦克(3-6)\n- **玩家状态**: 位置(x,y), 方向, 存活状态, ID, 用户名\n\n## 🔧 技术实现\n\n### 服务器端核心技术\n\n#### 1. 异步I/O模型\n```c\n// 使用epoll实现高效的事件驱动编程\nint epoll_fd = epoll_create1(0);\nstruct epoll_event events[MAX_EVENTS];\n\nwhile (1) {\n    int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, 50);\n    // 处理网络事件\n}\n```\n\n#### 2. 线程池管理\n- 预创建16个工作线程\n- 使用条件变量进行线程同步\n- 工作队列管理客户端请求\n\n#### 3. 房间管理系统\n- 动态房间创建和销毁\n\n#### 4. 碰撞检测算法\n```c\n// 子弹与玩家碰撞检测\nfor (int j = 0; j \u003c room-\u003egame.player_count; j++) {\n    Player *p = \u0026room-\u003egame.players[j];\n    if (p-\u003ealive \u0026\u0026 p-\u003ex == b-\u003ex \u0026\u0026 p-\u003ey == b-\u003ey \u0026\u0026 \n        b-\u003eowner_id != p-\u003eid) {\n        // 处理碰撞\n    }\n}\n```\n\n### 客户端核心技术\n\n#### 1. 多线程架构\n- 主线程处理游戏逻辑和渲染\n- 网络线程负责数据接收和处理\n- 线程间通过共享状态通信\n\n#### 2. 资源管理系统\n```python\ndef load_resources(self):\n    # 支持自定义图片资源\n    if os.path.exists(\"tank.png\"):\n        base_tank = pygame.image.load(\"tank.png\")\n    else:\n        # 使用程序生成的默认图像\n        base_tank = self.create_default_tank()\n```\n\n#### 3. 状态同步机制\n- 服务器权威的游戏状态\n- 客户端预测和回滚\n- 平滑的插值显示\n\n## ⚙️ 配置说明\n\n### 服务器配置\n```c\n#define MAX_PLAYERS 4        // 每房间最大玩家数\n#define MAX_ROOMS 10         // 最大房间数\n#define MAP_WIDTH 20         // 地图宽度\n#define MAP_HEIGHT 20        // 地图高度\n#define MAX_BULLETS 32       // 最大子弹数\n#define SERVER_PORT 8888     // 服务器端口\n#define THREAD_POOL_SIZE 16  // 线程池大小\n```\n\n### 客户端配置\n```python\nMAP_WIDTH = 20              # 地图宽度\nMAP_HEIGHT = 20             # 地图高度\nTILE_SIZE = 30              # 瓦片大小\nSCREEN_WIDTH = 600          # 屏幕宽度\nSCREEN_HEIGHT = 640         # 屏幕高度\nSERVER_PORT = 8888          # 服务器端口\n```\n\n### 自定义资源\n将以下图片文件放在客户端目录中可替换默认图像：\n- `tank.png`: 坦克图像 (30x30像素)\n- `bullet.png`: 子弹图像 (10x10像素)\n- `block.png`: 可破坏墙体图像 (30x30像素)\n\n## 🛠️ 故障排除\n\n### 常见问题\n\n#### 1. 服务器无法启动\n**问题**: `bind: Address already in use`\n**解决**: \n```bash\n# 查找占用端口的进程\nlsof -i :8888\n# 终止进程\nkill -9 \u003cPID\u003e\n```\n\n#### 2. 客户端连接失败\n**问题**: `Connection refused`\n**解决**: \n- 确认服务器已启动\n- 检查防火墙设置\n- 验证IP地址和端口\n\n#### 3. 游戏卡顿\n**问题**: 游戏画面不流畅\n**解决**: \n- 关闭其他占用资源的程序\n- 降低游戏分辨率\n- 检查网络延迟\n\n#### 4. 编译错误\n**问题**: `undefined reference to pthread_create`\n**解决**: \n```bash\ngcc -o tank_server server.c -lpthread\n```\n\n### 调试模式\n启用详细日志输出：\n```bash\n# 服务器调试\n./tank_server --debug\n\n# 客户端调试\npython client.py --debug\n```\n\n## 👨‍💻 开发指南\n\n### 代码结构\n```\ntank-battle/\n├── server.c              # 服务器端源码\n├── client.py             # 客户端源码\n├── README.md             # 项目文档\n├── LICENSE               # 许可证\n│── tank.png              # 游戏资源\n│── bullet.png\n│── block.png\n\n```\n\n### 添加新功能\n\n#### 1. 添加新的游戏元素\n```c\n// 在服务器端定义新元素\n#define POWER_UP 7\n\n// 在地图生成中添加\nif (rand() % 100 \u003c 5) {\n    room-\u003egame.map[y][x] = POWER_UP;\n}\n```\n\n#### 2. 扩展网络协议\n```c\n// 添加新的命令类型\n#define CMD_POWER_UP 'P'\n\n// 在消息处理中添加case\ncase CMD_POWER_UP:\n    handle_power_up(client_fd, buffer, len);\n    break;\n```\n\n### 性能优化\n\n#### 1. 服务器优化\n- 使用内存池减少内存分配\n- 优化数据结构布局\n- 实现更高效的碰撞检测算法\n\n#### 2. 客户端优化\n- 实现精灵批处理\n- 使用脏矩形更新\n- 优化网络数据解析\n\n## 🤝 贡献指南\n\n### 如何贡献\n1. Fork 本项目\n2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)\n3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)\n4. 推送到分支 (`git push origin feature/AmazingFeature`)\n5. 创建Pull Request\n\n### 贡献规范\n- 遵循现有的代码风格\n- 添加适当的注释\n- 包含必要的测试\n- 更新相关文档\n\n### 报告问题\n使用GitHub Issues报告bug或建议新功能：\n1. 使用清晰的标题\n2. 提供详细的问题描述\n3. 包含重现步骤\n4. 附上相关的日志信息\n\n## 📈 路线图\n\n### 版本 1.1 (计划中)\n- [ ] 添加道具系统\n- [ ] 实现观战模式\n- [ ] 支持自定义地图\n- [ ] 添加排行榜功能\n\n### 版本 1.2 (计划中)\n- [ ] 支持团队模式\n- [ ] 添加AI机器人\n- [ ] 实现回放系统\n- [ ] 优化网络协议\n\n### 版本 2.0 (远期计划)\n- [ ] 3D图形界面\n- [ ] 语音聊天功能\n- [ ] 账户系统\n- [ ] 移动端支持\n\n## 📄 许可证\n\n本项目采用MIT许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。\n\n## 👥 贡献者\n\n感谢所有为这个项目做出贡献的开发者！\n\n\n## 🙏 致谢\n\n- 感谢Pygame社区提供的优秀游戏开发框架\n- 感谢所有测试者和反馈者\n- 灵感来源于经典坦克大战游戏\n\n---\n\n⭐ 如果这个项目对你有帮助，请给它一个星标！\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshiweimeiya%2Fcpp-epoll-reactor-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshiweimeiya%2Fcpp-epoll-reactor-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshiweimeiya%2Fcpp-epoll-reactor-server/lists"}