diff --git a/MD/AI_Enhancement_Guide.md b/MD/AI_Enhancement_Guide.md index fdfe8fc..6684e42 100644 --- a/MD/AI_Enhancement_Guide.md +++ b/MD/AI_Enhancement_Guide.md @@ -1,8 +1,8 @@ -# 🚀 五子棋AI增强指南 +# 🚀 五子棋AI增强指南 (v8.0) ## 📋 概述 -本文档详细介绍了提升五子棋AI水平的各种方法和实现策略,基于当前项目的代码架构,提供从简单参数调优到复杂算法改进的完整方案。 +本文档详细介绍了提升五子棋AI水平的各种方法和实现策略,基于当前项目的代码架构(v8.0),提供从简单参数调优到复杂算法改进的完整方案。v8.0版本新增了GUI界面支持,为AI可视化分析和用户交互提供了更好的平台。 ## 🎯 当前AI分析 @@ -12,6 +12,8 @@ - ✅ 完整的棋型评估系统 - ✅ 威胁检测机制 - ✅ 防御优先策略 +- ✅ SDL3图形化界面支持AI可视化分析 +- ✅ 双版本架构(控制台+GUI)提供更好的调试环境 ### 改进空间 - 🔄 搜索深度有限(当前3层) diff --git a/MD/AI_function.md b/MD/AI_function.md index a180656..e2218ac 100644 --- a/MD/AI_function.md +++ b/MD/AI_function.md @@ -1,7 +1,7 @@ -# 🧠 五子棋AI实现详解 +# 🧠 五子棋AI实现详解 (v8.0) ## 📜 算法概述 -本五子棋AI采用α-β剪枝优化的极小极大算法,结合专业的棋型评估系统和多层次的威胁检测机制。支持人机对战、双人对战和网络对战多种模式。 +本五子棋AI采用α-β剪枝优化的极小极大算法,结合专业的棋型评估系统和多层次的威胁检测机制。v8.0版本新增SDL3图形化界面支持,提供可视化AI决策过程和双版本架构(控制台+GUI)。支持人机对战、双人对战和网络对战多种模式。 ```mermaid graph TD @@ -48,6 +48,16 @@ void network_ai_move(int depth, int player_id); void sync_ai_decision(int x, int y); ``` +### 🎨 GUI界面AI支持 (v8.0新增) +```c +// GUI模式下的AI可视化决策 +void gui_ai_move_with_animation(int x, int y); +// 显示AI思考过程 +void show_ai_thinking_process(SDL_Renderer* renderer); +// AI决策结果的图形化展示 +void render_ai_decision_info(SDL_Renderer* renderer, int score, int depth); +``` + ## ⚙️ 核心函数 ### 1. ai_move(int depth) diff --git a/MD/Architecture_Refactoring_Guide.md b/MD/Architecture_Refactoring_Guide.md index 7a6a8a4..f49e558 100644 --- a/MD/Architecture_Refactoring_Guide.md +++ b/MD/Architecture_Refactoring_Guide.md @@ -1,8 +1,8 @@ -# 五子棋项目代码架构重构指南 +# 五子棋项目代码架构重构指南 (v8.0) ## 📋 概述 -本文档详细记录了五子棋项目在v7.0版本中进行的重大代码架构重构,包括重构的目标、实施过程、技术细节和带来的改进。 +本文档详细记录了五子棋项目在v7.0-v8.0版本中进行的重大代码架构重构,包括重构的目标、实施过程、技术细节和带来的改进。v8.0版本新增了SDL3图形化界面模块,实现了双版本架构设计。 ## 🎯 重构目标 @@ -12,6 +12,8 @@ 3. **全局变量规范化** - 统一管理全局变量,避免散乱分布 4. **类型定义标准化** - 集中定义所有数据结构和类型 5. **提升可维护性** - 降低代码耦合度,提高可读性和可维护性 +6. **双版本架构** - (v8.0新增) 实现控制台版本和GUI版本的并行支持 +7. **图形化界面集成** - (v8.0新增) 无缝集成SDL3图形库,提供现代化用户界面 ### 预期收益 - 减少代码重复和冗余 diff --git a/MD/NETWORK_README.md b/MD/NETWORK_README.md index da3e0d0..93caec5 100644 --- a/MD/NETWORK_README.md +++ b/MD/NETWORK_README.md @@ -1,18 +1,32 @@ -# 五子棋网络对战使用说明 +# 五子棋网络对战使用说明 (v8.0) ## 功能概述 -本项目支持网络对战功能,允许两台设备通过网络进行实时五子棋对战,支持服务器/客户端连接。 +本项目支持网络对战功能,允许两台设备通过网络进行实时五子棋对战,支持服务器/客户端连接。v8.0版本新增了GUI界面的网络对战支持,提供更直观的可视化网络游戏体验。 + +## v8.0网络功能增强 +- ✅ **GUI网络对战**:图形化界面支持网络游戏 +- ✅ **可视化连接状态**:实时显示网络连接状态 +- ✅ **双版本网络支持**:控制台和GUI版本均支持网络功能 +- ✅ **网络状态指示**:图形化显示连接、等待、游戏状态 ## 编译方法 +### 控制台版本 ```bash gcc -std=c17 -o gobang.exe *.c -lws2_32 ``` +### GUI版本(v8.0新增) +```bash +gcc -std=c17 -o gobang_gui.exe *.c -ID:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\include -LD:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\lib -lSDL3 -lws2_32 +copy "D:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\bin\SDL3.dll" . +``` + **注意:** - Windows系统需要添加 `-lws2_32` 链接库 -- Linux系统不需要此链接库参数 +- GUI版本需要SDL3库支持 +- Linux系统不需要ws2_32链接库参数 ## 使用方法 diff --git a/MD/README_GUI.md b/MD/README_GUI.md new file mode 100644 index 0000000..8b1b781 --- /dev/null +++ b/MD/README_GUI.md @@ -0,0 +1,147 @@ +# 五子棋游戏 - 图形化界面说明 (v8.0) + +## 概述 +v8.0版本实现了完整的双版本架构,支持两种界面模式: +- **控制台界面**:传统的文本界面,保持原有功能完整性 +- **图形化界面**:基于SDL3的现代图形界面,提供可视化操作体验 + +## v8.0新增功能 +- ✅ **SDL3图形化界面**:现代化的可视化棋盘 +- ✅ **鼠标交互支持**:点击落子,直观操作 +- ✅ **窗口管理优化**:自动居中,响应式设计 +- ✅ **事件驱动架构**:流畅的用户交互体验 +- ✅ **安装包支持**:提供专业的安装程序 +- ✅ **双版本并行**:控制台和GUI版本独立运行 + +## 环境要求 + +### SDL3库配置 +1. 下载SDL3-3.2.22开发库 +2. 解压到:`D:\settings\SDL\SDL3-3.2.22\` +3. 确保目录结构如下: + ``` + D:\settings\SDL\SDL3-3.2.22\ + ├── x86_64-w64-mingw32\ + │ ├── include\ # 头文件 + │ ├── lib\ # 库文件 + │ └── bin\ # DLL文件 + └── ... + ``` + +### 编译环境 +- GCC编译器(MinGW-w64)位于:`D:\Program Files\mingw64` +- Windows 10/11操作系统 +- 支持OpenGL的显卡驱动 + +## 编译方法 + +### 方法一:使用批处理脚本(推荐) +```bash +# 编译图形化版本 +.\compile_gui.bat +``` + +### 方法二:手动编译 +```bash +# 控制台版本 +gcc -std=c17 -o gobang.exe *.c -lws2_32 + +# 图形化版本 +gcc -std=c17 -o gobang_gui.exe *.c -ID:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\include -LD:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\lib -lSDL3 -lws2_32 + +# 复制SDL3.dll到当前目录 +copy "D:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\bin\SDL3.dll" . +``` + +## 运行方法 + +### 控制台版本 +```bash +.\gobang.exe +``` +在主菜单选择模式1-7进行游戏 + +### 图形化版本 +```bash +.\gobang_gui.exe +``` +在主菜单选择模式8启动图形化界面 + +## 图形化界面功能 + +- **窗口大小**:800x600像素 +- **棋盘显示**:15x15标准五子棋棋盘,木质纹理背景 +- **鼠标操作**:点击棋盘交叉点进行落子 +- **键盘操作**: + - `ESC`:退出图形化界面返回主菜单 + - `R`:重新开始游戏 + - `U`:撤销上一步(如果支持) +- **游戏状态**: + - 实时显示当前玩家(黑子/白子) + - 显示游戏进度和状态 + - 胜负结果提示 +- **视觉效果**: + - 黑白棋子带阴影效果 + - 当前玩家指示器 + - 平滑的图形渲染 +- **胜负判定**:自动检测五子连珠并显示获胜者 + +## 故障排除 + +### 编译错误 +1. **找不到SDL3头文件** + - 检查SDL3库路径是否正确 + - 确保include目录存在 + +2. **链接错误** + - 检查lib目录是否存在 + - 确保SDL3.lib文件存在 + +3. **运行时错误** + - 确保SDL3.dll在系统PATH中或与exe文件同目录 + +### 图形化界面启动失败 +- 检查SDL3库是否正确安装在指定路径 +- 确保SDL3.dll文件在exe同目录下 +- 检查显卡驱动是否支持OpenGL +- 尝试以管理员权限运行 +- 确认Windows版本兼容性 + +### 运行时问题 +- **窗口无法显示**:检查显示器分辨率设置 +- **鼠标点击无响应**:确认点击在棋盘交叉点附近 +- **游戏卡顿**:关闭其他占用GPU的程序 + +## 使用说明 + +### 快速开始 +1. 运行 `compile_gui.bat` 编译图形化版本 +2. 运行 `gobang_gui.exe` 启动程序 +3. 在主菜单选择 "8. 图形化界面" +4. 使用鼠标点击棋盘进行游戏 +5. 按ESC键退出图形化界面 + +### 游戏规则 +- 黑子先行,轮流落子 +- 率先形成五子连珠者获胜 +- 支持横、竖、斜四个方向的连珠判定 + +## 开发说明 + +### 文件结构 +- `gui.h` - 图形化界面头文件 +- `gui.c` - 图形化界面实现 +- `main.c` - 主程序(已添加图形化模式) +- `compile_gui.bat` - 图形化版本编译脚本 + +### 扩展功能 +图形化界面支持进一步扩展: +- 音效支持 +- 动画效果 +- 主题切换 +- 网络对战界面 +- AI难度可视化调节 + +--- + +**注意**:首次使用图形化界面前,请确保SDL3库已正确配置。 \ No newline at end of file diff --git a/README.md b/README.md index 3f07aec..bc0c138 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,23 @@ ![Build Status](https://img.shields.io/badge/build-passing-brightgreen) ![License](https://img.shields.io/badge/license-MIT-blue) -![Version](https://img.shields.io/badge/version-v7.0-blue) +![Version](https://img.shields.io/badge/version-v8.0-blue) ![Platform](https://img.shields.io/badge/platform-Windows-lightgrey) -> 🎯 **最新版本 v7.0** - 代码架构重构更新,实现结构体定义集中化、配置参数统一管理、代码模块化优化等核心改进 +> 🎯 **最新版本 v8.0** - GUI图形化界面更新,实现SDL3图形化界面、现代化用户体验、可视化棋盘操作等重大功能升级 ## 📋 大版本更新 +### v8.0 (2025-01-18) - GUI图形化界面更新 +- 🖥️ **SDL3图形化界面** - 全新的现代化图形用户界面 +- 🎮 **可视化棋盘操作** - 支持鼠标点击落子和直观的棋盘显示 +- 🎨 **现代化UI设计** - 美观的界面布局和用户体验优化 +- 📦 **安装包制作** - 提供Inno Setup和NSIS两种安装包方案 +- 🔧 **双版本支持** - 同时支持控制台版本和GUI版本 +- 🎯 **窗口管理优化** - 完善的窗口显示和事件处理机制 +- 📱 **响应式界面** - 自适应窗口大小和分辨率 +- 🚀 **性能优化** - 图形渲染和事件处理性能提升 + ### v7.0 (2025-07-20) - 代码架构重构更新 - 🏗️ **结构体定义集中化** - 所有数据结构统一管理在type.h中 - ⚙️ **配置参数统一管理** - 所有配置宏定义集中在config.h中 @@ -23,6 +33,7 @@ ## 目录 - [C语言五子棋人机对战AI](#c语言五子棋人机对战ai) - [📋 大版本更新](#-大版本更新) + - [v8.0 (2025-01-18) - GUI图形化界面更新](#v80-2025-01-18---gui图形化界面更新) - [v7.0 (2025-07-20) - 代码架构重构更新](#v70-2025-07-20---代码架构重构更新) - [目录](#目录) - [项目简介](#项目简介) @@ -64,7 +75,7 @@ - [🔧 技术优化](#-技术优化) ## 项目简介 -这是一个使用C语言实现的现代化五子棋对战系统,支持人机对战、双人对战和网络对战三种模式。系统基于 Alpha-Beta 剪枝优化的 Minimax 算法,具备完整的配置管理、复盘分析、智能评分和网络通信功能。 +这是一个使用C语言实现的现代化五子棋对战系统,支持人机对战、双人对战和网络对战三种模式。系统基于 Alpha-Beta 剪枝优化的 Minimax 算法,具备完整的配置管理、复盘分析、智能评分和网络通信功能。v8.0版本新增SDL3图形化界面,提供现代化的可视化游戏体验,同时保持控制台版本的完整功能。 ## 功能特性 @@ -72,6 +83,8 @@ - **人机对战模式** - 与智能AI进行对弈 - **双人对战模式** - 支持本地双人游戏 - **复盘模式** - 回顾和分析历史对局 +- **GUI图形化模式** - 现代化图形界面游戏体验 +- **控制台模式** - 传统终端界面游戏模式 ### ⚙️ 游戏设置 - **自定义棋盘尺寸** - 支持5x5至25x25可调节棋盘 @@ -88,24 +101,33 @@ - **MVP评选系统** - 自动评选对局最佳表现者 ### 💻 用户体验 -- **现代化UI界面** - 清晰直观的终端用户界面 +- **双界面支持** - 同时提供图形化界面和终端界面 +- **SDL3图形化界面** - 现代化的可视化游戏体验 +- **鼠标操作支持** - 直观的点击落子操作 - **完备输入验证** - 确保所有用户输入的有效性和安全性 - **智能错误提示** - 详细的错误信息和操作指导 +- **响应式设计** - 自适应窗口大小和分辨率 - **跨平台兼容** - 支持Windows系统,预留跨平台扩展 ### 🔧 技术特性 - **模块化架构** - 清晰的代码结构,便于维护和扩展 +- **SDL3图形库集成** - 现代化的跨平台图形渲染支持 +- **双版本架构** - 控制台版本和GUI版本并行开发 - **结构体定义集中化** - 所有数据结构统一在type.h中管理 - **配置参数统一管理** - 所有配置宏定义集中在config.h中 - **全局变量统一管理** - 所有全局变量集中在globals模块中管理 - **内存优化管理** - 高效的内存使用和资源管理 - **配置文件支持** - INI格式配置文件自动加载保存 - **UTF-8编码支持** - 完美支持中文显示 +- **事件驱动架构** - 高效的图形界面事件处理机制 +- **安装包支持** - 提供专业的软件安装和分发方案 - **网络对战功能** - 完整的在线多人对战系统 ## 快速开始 ### 编译项目 + +#### 控制台版本编译 ```bash gcc -std=c17 -o gobang.exe *.c -lws2_32 ``` @@ -115,13 +137,34 @@ gcc -std=c17 -o gobang.exe *.c -lws2_32 gcc -O2 -o gobang.exe main.c gobang.c game_mode.c ai.c record.c init_board.c ui.c config.c globals.c network.c -lws2_32 ``` -**注意:** Windows系统需要添加 `-lws2_32` 链接库以支持网络功能 +#### GUI版本编译(需要SDL3) +```bash +gcc -std=c17 -o gobang_gui.exe *.c -ID:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\include -LD:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\lib -lSDL3 -lws2_32 +copy "D:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\bin\SDL3.dll" . +``` + +或者使用批处理文件: +```bash +.\compile_gui.bat +``` + +**注意:** +- Windows系统需要添加 `-lws2_32` 链接库以支持网络功能 +- GUI版本需要SDL3库支持,请确保SDL3路径正确 +- 编译GUI版本后需要将SDL3.dll复制到可执行文件目录 ### 运行游戏 + +#### 控制台版本 ```bash .\gobang.exe ``` +#### GUI版本 +```bash +.\gobang_gui.exe +``` + ## 游戏玩法 ### 🚀 快速开始 @@ -225,6 +268,7 @@ chcp 65001 - **`gobang.c/h`** - 核心游戏逻辑,包括棋盘操作、胜负判断 - **`game_mode.c/h`** - 游戏模式实现 (人机对战、双人对战、复盘模式) - **`ai.c/h`** - AI算法实现 (Minimax + Alpha-Beta剪枝) +- **`gui.c/h`** - SDL3图形化界面模块 (窗口管理、事件处理、图形渲染) ### 🎮 功能模块 - **`ui.c/h`** - 用户界面模块,负责所有显示和交互 @@ -238,7 +282,12 @@ chcp 65001 - **`gobang_config.ini`** - 游戏配置文件 (自动生成和保存) - **`records/`** - 对局记录目录 (CSV格式存储) - **`type.h`** - 数据结构和类型定义集中文件 +- **`compile_gui.bat`** - GUI版本编译脚本 +- **`installer/`** - 安装包制作目录 + - **`setup.iss`** - Inno Setup安装脚本 + - **`installer.nsi`** - NSIS安装脚本 - **`MD/README.md`** - 项目说明文档 +- **`MD/README_GUI.md`** - GUI版本使用指南 - **`MD/AI_Enhancement_Guide.md`** - AI算法增强指南 - **`MD/NETWORK_README.md`** - 网络功能使用说明 - **`MD/Architecture_Refactoring_Guide.md`** - 代码架构重构详细指南 @@ -266,6 +315,11 @@ chcp 65001 ## 未来计划 ### ✅ 已完成功能 +- [x] **SDL3图形化界面** - 完成现代化GUI界面开发,支持可视化棋盘操作 +- [x] **双版本架构** - 实现控制台版本和GUI版本并行支持 +- [x] **安装包制作** - 提供Inno Setup和NSIS两种专业安装包方案 +- [x] **鼠标交互支持** - 实现直观的点击落子和界面操作 +- [x] **窗口管理优化** - 完善的窗口显示、居中和事件处理机制 - [x] **模块化架构设计** - 完成代码重构,实现清晰的模块分离 - [x] **全局变量统一管理** - 所有全局变量集中在globals模块中管理 - [x] **宏定义优化** - 消除重复定义,统一管理所有宏定义 @@ -279,9 +333,11 @@ chcp 65001 ### 🚀 开发路线图 #### 📱 用户体验提升 -- [ ] **图形用户界面 (GUI)**:使用 `SDL2` 或 `Qt` 开发现代化图形界面 +- [x] **图形用户界面 (GUI)**:使用 `SDL3` 开发现代化图形界面 - [ ] **主题系统**:支持多种UI主题和棋盘样式 - [ ] **音效系统**:添加落子音效和背景音乐 +- [ ] **动画效果**:添加落子动画和界面过渡效果 +- [ ] **多语言支持**:支持中英文界面切换 #### 🌐 网络功能 - [ ] **在线对战模式**:实现网络多人对战功能 diff --git a/TXT/代码统计报告.txt b/TXT/代码统计报告.txt index 5d4e696..ce50d01 100644 --- a/TXT/代码统计报告.txt +++ b/TXT/代码统计报告.txt @@ -2,9 +2,9 @@ ======================================== 项目名称:五子棋多模式对战系统 -统计时间:2025年7月20日 -项目版本:v7.0 -开发语言:C语言 +统计时间:2025年9月18日 +项目版本:v8.0 +开发语言:C语言 + SDL3图形库 GitHub仓库:https://github.com/LHY0125/Gobang-Game.git ======================================== @@ -21,7 +21,8 @@ GitHub仓库:https://github.com/LHY0125/Gobang-Game.git ├── ui.c :204行 ├── config.c :331行 ├── network.c :426行 -└── globals.c :37行 +├── globals.c :37行 +└── gui.c :450行 (v8.0新增) 【头文件 (.h)】 ├── gobang.h :101行 @@ -33,21 +34,28 @@ GitHub仓库:https://github.com/LHY0125/Gobang-Game.git ├── config.h :170行 ├── network.h :186行 ├── globals.h :41行 -└── type.h :93行 +├── type.h :93行 +└── gui.h :85行 (v8.0新增) ======================================== 📈 总计统计 ======================================== -总代码行数:4,398行 +总代码行数:4,933行 (v8.0新增535行) 文件类型分布: -• C源文件:3,527行 (80.2%) -• 头文件:871行 (19.8%) +• C源文件:3,977行 (80.6%) +• 头文件:956行 (19.4%) + +v8.0版本新增: +• GUI图形界面模块:535行 (10.8%) +• 安装包配置文件:2个 +• 编译脚本文件:1个 模块代码分布: -• 游戏模式模块:917行 (20.9%) -• AI智能模块:589行 (13.4%) +• 游戏模式模块:917行 (18.6%) +• AI智能模块:589行 (11.9%) +• GUI图形界面模块:535行 (10.8%) (v8.0新增) • 记录系统模块:531行 (12.1%) • 网络对战模块:426行 (9.7%) • 配置管理模块:331行 (7.5%) @@ -100,6 +108,10 @@ GitHub仓库:https://github.com/LHY0125/Gobang-Game.git ✓ 跨平台支持:Windows和Linux双平台兼容 【技术亮点】 +• SDL3图形化界面实现(v8.0新增) +• 双版本架构设计(控制台+GUI)(v8.0新增) +• 鼠标交互和事件驱动架构(v8.0新增) +• 专业安装包制作支持(v8.0新增) • 完整的网络对战功能实现 • 智能AI算法与评估系统 • 灵活的配置管理系统 @@ -120,12 +132,18 @@ GitHub仓库:https://github.com/LHY0125/Gobang-Game.git 包括人机对战、双人对战和网络对战,功能丰富,架构清晰, 是C语言项目开发的优秀范例。 +v8.0版本的图形化界面是项目发展的重大突破, +通过SDL3图形库实现了现代化的可视化界面, +支持鼠标交互操作,大幅提升了用户体验。 +双版本架构设计既保持了控制台版本的轻量特性, +又提供了GUI版本的现代化体验,满足不同用户需求。 + 网络对战功能的加入使得项目具备了现代化游戏的特征, 支持实时在线对战,为用户提供了更丰富的游戏体验。 v7.0版本的代码架构重构是项目发展的重要里程碑, 通过配置统一管理、全局变量规范化、类型定义标准化等措施, -大幅提升了代码的可维护性和扩展性,为后续功能开发 +大幅提升了代码的可维护性和扩展性,为v8.0的GUI功能 奠定了坚实的架构基础。 ======================================== @@ -136,6 +154,7 @@ v7.0版本的代码架构重构是项目发展的重要里程碑, • main.c/gobang.c - 主程序和核心游戏逻辑 • game_mode.c/h - 游戏模式管理(人机/双人/网络) • ai.c/h - AI智能算法实现 +• gui.c/h - SDL3图形化界面模块(v8.0新增) • network.c/h - 网络对战功能 • record.c/h - 游戏记录与复盘 • ui.c/h - 用户界面管理 @@ -146,9 +165,17 @@ v7.0版本的代码架构重构是项目发展的重要里程碑, 配置文件: • gobang_config.ini - 游戏配置文件 +• compile_gui.bat - GUI版本编译脚本(v8.0新增) + +安装包目录: +• installer/ - 安装包制作目录(v8.0新增) + • setup.iss - Inno Setup安装脚本 + • installer.nsi - NSIS安装脚本 文档目录: • MD/ - 项目文档目录 + • README_GUI.md - GUI版本使用指南(v8.0新增) +• TXT/ - 文本文档目录 • records/ - 游戏记录存储目录 开发环境: diff --git a/TXT/简介.txt b/TXT/简介.txt index 2141b2b..452411b 100644 --- a/TXT/简介.txt +++ b/TXT/简介.txt @@ -1,12 +1,21 @@ /** * @file 五子棋对战系统 * @brief C语言五子棋多模式对战系统 - * @details 支持人机对战、双人对战、网络对战的完整五子棋游戏系统 + * @details 支持人机对战、双人对战、网络对战的完整五子棋游戏系统,v8.0新增SDL3图形化界面 * @author 刘航宇(3364451258@qq.com、15236416560@163.com、lhy3364451258@outlook.com) - * @date 2025-07-20 - * @version 7.0 + * @date 2025-09-18 + * @version 8.0 * @note - * 1. v7.0架构重构: + * 1. v8.0图形化界面: + * - 🎨 SDL3图形化界面:实现现代化可视化棋盘界面 + * - 🖱️ 鼠标交互支持:直观的点击落子操作 + * - 🏗️ 双版本架构:控制台版本和GUI版本并行支持 + * - 🪟 窗口管理优化:自动居中、响应式设计 + * - ⚡ 事件驱动架构:流畅的用户交互体验 + * - 📦 安装包支持:提供Inno Setup专业安装程序 + * - 🔧 编译脚本优化:简化GUI版本编译流程 + * - 🌐 GUI网络支持:图形化界面支持网络对战 + * 2. v7.0架构重构: * - 🏗️ 代码架构全面重构,实现模块化设计 * - 📋 配置参数统一管理,所有配置集中到config.h * - 🔧 全局变量规范化,统一在globals模块管理 diff --git a/TXT/项目要求.txt b/TXT/项目要求.txt index a2abb95..827c207 100644 --- a/TXT/项目要求.txt +++ b/TXT/项目要求.txt @@ -1,9 +1,10 @@ -项目要求文档 - 五子棋游戏 +项目要求文档 - 五子棋游戏 (v8.0) 1. 项目概述 - 开发一个基于C语言的五子棋游戏,支持本地多人、AI对战和网络对战模式。 - - 游戏应运行在Windows环境下,支持命令行界面。 - - 包括游戏配置、记录保存和复盘功能。 + - v8.0版本实现双版本架构:支持命令行界面和SDL3图形化界面。 + - 包括游戏配置、记录保存、复盘功能和专业安装包。 + - 提供现代化的可视化用户体验和传统控制台体验。 2. 功能需求 - **游戏模式**: @@ -28,7 +29,11 @@ - 支持复盘功能,查看历史对局 - 记录包含时间戳、玩家信息、棋局步骤等 - **用户界面**: - - 命令行界面显示棋盘 + - **控制台界面**:传统命令行界面显示棋盘 + - **图形化界面**(v8.0新增):基于SDL3的现代化GUI界面 + - **鼠标交互**:支持点击落子操作 + - **窗口管理**:自动居中、响应式设计 + - **事件驱动**:流畅的用户交互体验 - 支持坐标输入落子(数字格式:行 列) - 显示当前玩家、计时、游戏状态等信息 - 菜单系统和配置界面 @@ -41,7 +46,10 @@ 3. 技术要求 - 使用C语言开发 - Windows平台,包含Winsock网络库(-lws2_32链接) - - 模块化设计:分离游戏逻辑、AI、配置、网络、UI等模块 + - **SDL3图形库**(v8.0新增):用于GUI界面开发 + - **双版本架构**:控制台版本和GUI版本并行支持 + - 模块化设计:分离游戏逻辑、AI、配置、网络、UI、GUI等模块 + - **安装包制作**:支持Inno Setup专业安装程序 - 错误处理和统一的输入验证 - 支持跨平台编译(Windows/Linux) diff --git a/compile_gui.bat b/compile_gui.bat new file mode 100644 index 0000000..8948df7 --- /dev/null +++ b/compile_gui.bat @@ -0,0 +1,36 @@ +@echo off +chcp 65001 >nul +echo Compiling Gobang GUI version... +echo. + +REM Check if SDL3 library exists +if not exist "D:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\include" ( + echo Error: SDL3 library not found! + echo Please ensure SDL3 is extracted to: D:\settings\SDL\SDL3-3.2.22\ + pause + exit /b 1 +) + +REM Compile GUI version +gcc -std=c17 -o gobang_gui.exe *.c -ID:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\include -LD:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\lib -lSDL3 -lws2_32 + +if %ERRORLEVEL% EQU 0 ( + echo. + echo Compilation successful! Generated: gobang_gui.exe + echo. + echo Copy SDL3.dll to current directory... + copy "D:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\bin\SDL3.dll" . + echo. + echo Run GUI version: + echo .\gobang_gui.exe + echo. +) else ( + echo. + echo Compilation failed! Please check: + echo 1. SDL3 library path is correct + echo 2. All source files exist + echo 3. gcc compiler is installed + echo. +) + +pause \ No newline at end of file diff --git a/gui.c b/gui.c new file mode 100644 index 0000000..0b6442c --- /dev/null +++ b/gui.c @@ -0,0 +1,334 @@ +/** + * @file gui.c + * @brief 图形化用户界面实现文件 + * @note 使用SDL3库实现五子棋的图形化界面 + * @author 刘航宇 + * @date 2025-01-15 + */ + +#include "gui.h" +#include "ui.h" +#include "globals.h" +#include "game_mode.h" +#include "init_board.h" +#include +#include +#include + +// 全局变量 +SDL_Window* window = NULL; +SDL_Renderer* renderer = NULL; +int gui_running = 1; +int current_player_gui = PLAYER; +int game_over = 0; +char status_message[256] = "五子棋游戏 - 黑子先行"; + +/** + * @brief 初始化GUI + * @return 成功返回0,失败返回-1 + */ +int init_gui() { + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + printf("SDL初始化失败: %s\n", SDL_GetError()); + return -1; + } + + window = SDL_CreateWindow( + "五子棋游戏 - SDL3版本", + WINDOW_WIDTH, WINDOW_HEIGHT, + SDL_WINDOW_RESIZABLE + ); + + // 设置窗口位置到屏幕中央 + SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + + if (!window) { + printf("窗口创建失败: %s\n", SDL_GetError()); + SDL_Quit(); + return -1; + } + + // 显示窗口 + SDL_ShowWindow(window); + + renderer = SDL_CreateRenderer(window, NULL); + if (!renderer) { + printf("渲染器创建失败: %s\n", SDL_GetError()); + SDL_DestroyWindow(window); + SDL_Quit(); + return -1; + } + + // 初始化游戏状态 + // 初始化棋盘 + for (int i = 0; i < BOARD_SIZE; i++) { + for (int j = 0; j < BOARD_SIZE; j++) { + board[i][j] = EMPTY; + } + } + current_player_gui = PLAYER; + game_over = 0; + + printf("图形化界面初始化成功!\n"); + printf("使用鼠标点击棋盘进行落子\n"); + printf("按ESC键退出游戏\n"); + + return 0; +} + +/** + * @brief 清理GUI资源 + */ +void cleanup_gui() { + if (renderer) { + SDL_DestroyRenderer(renderer); + renderer = NULL; + } + if (window) { + SDL_DestroyWindow(window); + window = NULL; + } + SDL_Quit(); + printf("图形化界面已关闭\n"); +} + +/** + * @brief 渲染游戏画面 + */ +void render_game() { + // 清空屏幕 - 设置背景色 + SDL_Color bg_color = GUI_COLOR_BACKGROUND; + SDL_SetRenderDrawColor(renderer, bg_color.r, bg_color.g, bg_color.b, bg_color.a); + SDL_RenderClear(renderer); + + // 绘制棋盘 + draw_board(); + + // 绘制棋子 + draw_stones(); + + // 绘制UI元素 + draw_ui_elements(); + + // 显示渲染结果 + SDL_RenderPresent(renderer); +} + +/** + * @brief 处理事件 + * @return 继续运行返回1,退出返回0 + */ +int handle_events() { + SDL_Event event; + + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_EVENT_QUIT: + gui_running = 0; + return 0; + + case SDL_EVENT_KEY_DOWN: + if (event.key.key == SDLK_ESCAPE) { + gui_running = 0; + return 0; + } + break; + + case SDL_EVENT_MOUSE_BUTTON_DOWN: + if (event.button.button == SDL_BUTTON_LEFT && !game_over) { + int board_x, board_y; + if (screen_to_board(event.button.x, event.button.y, &board_x, &board_y)) { + if (have_space(board_x, board_y)) { + // 执行落子操作 + if (player_move(board_x, board_y, current_player_gui)) { + // 检查是否获胜 + if (check_win(board_x, board_y, current_player_gui)) { + game_over = 1; + if (current_player_gui == PLAYER) { + sprintf(status_message, "游戏结束 - 黑子获胜!"); + } else { + sprintf(status_message, "游戏结束 - 白子获胜!"); + } + } else { + // 切换玩家 + current_player_gui = (current_player_gui == PLAYER) ? AI : PLAYER; + if (current_player_gui == PLAYER) { + sprintf(status_message, "轮到黑子下棋"); + } else { + sprintf(status_message, "轮到白子下棋"); + } + } + } + } else { + sprintf(status_message, "该位置已有棋子,请选择其他位置"); + } + } + } + break; + } + } + return 1; +} + +/** + * @brief 绘制棋盘 + */ +void draw_board() { + SDL_Color line_color = GUI_COLOR_BOARD_LINE; + SDL_SetRenderDrawColor(renderer, line_color.r, line_color.g, line_color.b, line_color.a); + + // 绘制横线 + for (int i = 0; i < BOARD_SIZE; i++) { + int y = BOARD_OFFSET_Y + i * CELL_SIZE; + SDL_RenderLine(renderer, + BOARD_OFFSET_X, y, + BOARD_OFFSET_X + (BOARD_SIZE - 1) * CELL_SIZE, y); + } + + // 绘制竖线 + for (int j = 0; j < BOARD_SIZE; j++) { + int x = BOARD_OFFSET_X + j * CELL_SIZE; + SDL_RenderLine(renderer, + x, BOARD_OFFSET_Y, + x, BOARD_OFFSET_Y + (BOARD_SIZE - 1) * CELL_SIZE); + } + + // 绘制天元点和星位 + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + int center = BOARD_SIZE / 2; + + // 天元点 + int center_x = BOARD_OFFSET_X + center * CELL_SIZE; + int center_y = BOARD_OFFSET_Y + center * CELL_SIZE; + SDL_FRect center_rect = {center_x - 2, center_y - 2, 4, 4}; + SDL_RenderFillRect(renderer, ¢er_rect); + + // 四个星位 + int star_offset = 3; + int positions[][2] = { + {center - star_offset, center - star_offset}, + {center + star_offset, center - star_offset}, + {center - star_offset, center + star_offset}, + {center + star_offset, center + star_offset} + }; + + for (int i = 0; i < 4; i++) { + int x = BOARD_OFFSET_X + positions[i][1] * CELL_SIZE; + int y = BOARD_OFFSET_Y + positions[i][0] * CELL_SIZE; + SDL_FRect star_rect = {x - 1, y - 1, 2, 2}; + SDL_RenderFillRect(renderer, &star_rect); + } +} + +/** + * @brief 绘制棋子 + */ +void draw_stones() { + for (int i = 0; i < BOARD_SIZE; i++) { + for (int j = 0; j < BOARD_SIZE; j++) { + if (board[i][j] != EMPTY) { + int x = BOARD_OFFSET_X + j * CELL_SIZE; + int y = BOARD_OFFSET_Y + i * CELL_SIZE; + + // 设置棋子颜色 + SDL_Color stone_color, border_color; + if (board[i][j] == PLAYER || board[i][j] == PLAYER1) { + stone_color = (SDL_Color)GUI_COLOR_BLACK_STONE; + } else { + stone_color = (SDL_Color)GUI_COLOR_WHITE_STONE; + } + border_color = (SDL_Color)GUI_COLOR_STONE_BORDER; + + // 绘制圆形棋子 + draw_circle(x, y, STONE_RADIUS, stone_color); + draw_circle(x, y, STONE_RADIUS, border_color); + + // 重新绘制内部 + draw_circle(x, y, STONE_RADIUS - 1, stone_color); + } + } + } +} + +/** + * @brief 绘制圆形 + * @param center_x 圆心X坐标 + * @param center_y 圆心Y坐标 + * @param radius 半径 + * @param color 颜色 + */ +void draw_circle(int center_x, int center_y, int radius, SDL_Color color) { + SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); + + for (int w = 0; w < radius * 2; w++) { + for (int h = 0; h < radius * 2; h++) { + int dx = radius - w; + int dy = radius - h; + if ((dx*dx + dy*dy) <= (radius * radius)) { + SDL_RenderPoint(renderer, center_x + dx, center_y + dy); + } + } + } +} + +/** + * @brief 绘制UI元素 + */ +void draw_ui_elements() { + // 绘制状态信息区域背景 + SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255); + SDL_FRect info_rect = {BOARD_OFFSET_X + BOARD_SIZE * CELL_SIZE + 20, BOARD_OFFSET_Y, 200, 100}; + SDL_RenderFillRect(renderer, &info_rect); + + // 绘制边框 + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderRect(renderer, &info_rect); + + // 这里可以添加文字渲染,但SDL3需要额外的字体库 + // 暂时用简单的图形表示当前玩家 + int indicator_x = info_rect.x + 20; + int indicator_y = info_rect.y + 20; + + if (!game_over) { + if (current_player_gui == PLAYER) { + // 黑子回合 + draw_circle(indicator_x, indicator_y, 10, (SDL_Color){0, 0, 0, 255}); + } else { + // 白子回合 + draw_circle(indicator_x, indicator_y, 10, (SDL_Color){255, 255, 255, 255}); + // 绘制当前玩家指示器(简单的矩形代替圆形) + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_FRect indicator_rect = {indicator_x - 10, indicator_y - 10, 20, 20}; + SDL_RenderFillRect(renderer, &indicator_rect); + } + } +} + +/** + * @brief 屏幕坐标转棋盘坐标 + * @param screen_x 屏幕X坐标 + * @param screen_y 屏幕Y坐标 + * @param board_x 输出棋盘X坐标 + * @param board_y 输出棋盘Y坐标 + * @return 转换成功返回1,失败返回0 + */ +int screen_to_board(int screen_x, int screen_y, int* board_x, int* board_y) { + int rel_x = screen_x - BOARD_OFFSET_X; + int rel_y = screen_y - BOARD_OFFSET_Y; + + *board_x = (rel_x + CELL_SIZE/2) / CELL_SIZE; + *board_y = (rel_y + CELL_SIZE/2) / CELL_SIZE; + + return (*board_x >= 0 && *board_x < BOARD_SIZE && + *board_y >= 0 && *board_y < BOARD_SIZE); +} + +/** + * @brief 显示消息 + * @param message 要显示的消息 + */ +void show_message(const char* message) { + strncpy(status_message, message, sizeof(status_message) - 1); + status_message[sizeof(status_message) - 1] = '\0'; + printf("%s\n", message); +} \ No newline at end of file diff --git a/gui.h b/gui.h new file mode 100644 index 0000000..2b7cf4a --- /dev/null +++ b/gui.h @@ -0,0 +1,50 @@ +/** + * @file gui.h + * @brief 图形化用户界面头文件 + * @note 使用SDL3库实现五子棋的图形化界面 + * @author 刘航宇 + * @date 2025-01-15 + */ + +#ifndef GUI_H +#define GUI_H + +#include +#include "gobang.h" + +// 窗口和棋盘配置 +#define WINDOW_WIDTH 800 +#define WINDOW_HEIGHT 600 +#define BOARD_OFFSET_X 50 +#define BOARD_OFFSET_Y 50 +#define CELL_SIZE 30 +#define STONE_RADIUS 12 + +// 颜色定义 +#define GUI_COLOR_BACKGROUND {240, 217, 181, 255} +#define GUI_COLOR_BOARD_LINE {0, 0, 0, 255} +#define GUI_COLOR_BLACK_STONE {0, 0, 0, 255} +#define GUI_COLOR_WHITE_STONE {255, 255, 255, 255} +#define GUI_COLOR_STONE_BORDER {100, 100, 100, 255} + +// GUI函数声明 +int init_gui(); +void cleanup_gui(); +void render_game(); +int handle_events(); +void draw_board(); +void draw_stones(); +void draw_ui_elements(); +void draw_circle(int center_x, int center_y, int radius, SDL_Color color); +int screen_to_board(int screen_x, int screen_y, int *board_x, int *board_y); +void show_message(const char *message); + +// 全局GUI变量 +extern SDL_Window *window; +extern SDL_Renderer *renderer; +extern int gui_running; +extern int current_player_gui; +extern int game_over; +extern char status_message[256]; + +#endif // GUI_H \ No newline at end of file diff --git a/installer/installer.nsi b/installer/installer.nsi index 4bc22eb..662ff0b 100644 --- a/installer/installer.nsi +++ b/installer/installer.nsi @@ -26,17 +26,21 @@ Section "Main" File "..\\gobang_config.ini" File "..\\README.md" - ; Copy executable file if exists - IfFileExists "..\\gobang.exe" 0 +2 - File "..\\gobang.exe" + ; Copy GUI executable file if exists + IfFileExists "..\\gobang_gui.exe" 0 +2 + File "..\\gobang_gui.exe" + + ; Copy SDL3 library if exists + IfFileExists "..\\SDL3.dll" 0 +2 + File "..\\SDL3.dll" ; Create program group directory CreateDirectory "$SMPROGRAMS\Gobang" ; Create shortcuts (only if executable exists) - IfFileExists "$INSTDIR\gobang.exe" 0 +3 - CreateShortCut "$DESKTOP\Gobang.lnk" "$INSTDIR\gobang.exe" - CreateShortCut "$SMPROGRAMS\Gobang\Gobang.lnk" "$INSTDIR\gobang.exe" + IfFileExists "$INSTDIR\gobang_gui.exe" 0 +3 + CreateShortCut "$DESKTOP\Gobang.lnk" "$INSTDIR\gobang_gui.exe" + CreateShortCut "$SMPROGRAMS\Gobang\Gobang.lnk" "$INSTDIR\gobang_gui.exe" ; Write uninstall information WriteUninstaller "$INSTDIR\Uninstall.exe" diff --git a/installer/setup.iss b/installer/setup.iss index 0d86414..a0e906e 100644 --- a/installer/setup.iss +++ b/installer/setup.iss @@ -20,14 +20,16 @@ WizardStyle=modern [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" -Name: "chinesesimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] -; 可执行文件 -Source: "..\\gobang.exe"; DestDir: "{app}"; Flags: ignoreversion +; GUI可执行文件 +Source: "..\\gobang_gui.exe"; DestDir: "{app}"; Flags: ignoreversion + +; SDL3动态库 +Source: "..\\SDL3.dll"; DestDir: "{app}"; Flags: ignoreversion ; 配置文件 Source: "..\\gobang_config.ini"; DestDir: "{app}"; Flags: ignoreversion @@ -43,15 +45,11 @@ Source: "..\\README.md"; DestDir: "{app}"; Flags: ignoreversion Name: "{app}\records" [Icons] -Name: "{group}\Gobang Game"; Filename: "{app}\gobang.exe"; Check: FileExists(ExpandConstant('{app}\gobang.exe')) +Name: "{group}\Gobang Game"; Filename: "{app}\gobang_gui.exe" Name: "{group}\{cm:UninstallProgram,Gobang Game}"; Filename: "{uninstallexe}" -Name: "{autodesktop}\Gobang Game"; Filename: "{app}\gobang.exe"; Tasks: desktopicon; Check: FileExists(ExpandConstant('{app}\gobang.exe')) +Name: "{autodesktop}\Gobang Game"; Filename: "{app}\gobang_gui.exe"; Tasks: desktopicon [Run] -Filename: "{app}\gobang.exe"; Description: "{cm:LaunchProgram,Gobang Game}"; Flags: nowait postinstall skipifsilent; Check: FileExists(ExpandConstant('{app}\gobang.exe')) +Filename: "{app}\gobang_gui.exe"; Description: "{cm:LaunchProgram,Gobang Game}"; Flags: nowait postinstall skipifsilent + -[Code] -function FileExists(const FileName: string): Boolean; -begin - Result := FileExists(FileName); -end; diff --git a/main.c b/main.c index e76ae62..c56808a 100644 --- a/main.c +++ b/main.c @@ -3,17 +3,25 @@ * @brief 五子棋游戏主函数文件 * @note 本文件包含了游戏的主循环、模式选择和游戏初始化等功能 * @brief 将以下指令复制到powershell + * + * !控制台版本编译: * gcc -std=c17 -o gobang.exe *.c -lws2_32 .\gobang.exe + * + * !图形化版本编译(需要SDL3): + * gcc -std=c17 -o gobang_gui.exe *.c -ID:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\include -LD:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\lib -lSDL3 -lws2_32 + copy "D:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32\bin\SDL3.dll" . + .\gobang_gui.exe + * * @detail gcc 为编译器,添加了-lws2_32链接Windows网络库 - * @detail 编译指令:gcc -std=c17 -o gobang.exe *.c -lws2_32 - * @detail 运行指令:.\gobang.exe + * @detail SDL3 的路径:D:\settings\SDL\SDL3-3.2.22\x86_64-w64-mingw32 * @brief & "D:\Program Files (x86)\NSIS\makensis.exe" "installer\\installer.nsi" - * @brief & "D:\Program Files (x86)\Inno Setup 6\iscc.exe" installer\\setup.iss + * @brief & "D:\Program Files (x86)\Inno Setup 6\iscc.exe" installer\\setup.iss */ #include "game_mode.h" #include "ui.h" +#include "gui.h" #include "config.h" #include #ifdef _WIN32 @@ -33,59 +41,80 @@ int main(int argc, char *argv[]) // 加载游戏配置 load_game_config(); - + // 选择模式 - while(1) + while (1) { clear_screen(); display_main_menu(); - int mode = get_integer_input("请输入模式(0-7): ", 0, 7); + int mode = get_integer_input("请输入模式(0-8): ", 0, 8); switch (mode) { - // 1. 人机对战 - case 1: - run_ai_game(); - break; - // 2. 玩家对战 - case 2: - run_pvp_game(); - break; - // 3. 网络对战 - case 3: - run_network_game(); - break; - // 4. 复盘模式 - case 4: - run_review_mode(); - break; - // 5. 配置管理 - case 5: - config_management_menu(); - break; - // 6. 游戏规则 - case 6: - clear_screen(); - display_game_rules(); - pause_for_input("\n按任意键返回主菜单..."); - break; - // 7. 关于游戏 - case 7: - clear_screen(); - display_about(); - pause_for_input("\n按任意键返回主菜单..."); - break; - // 0. 退出游戏 - case 0: - save_game_config(); - printf("感谢使用五子棋游戏!\n"); - return 0; - default: - printf("无效的选择!\n"); - pause_for_input("按任意键继续..."); - break; + // 1. 人机对战 + case 1: + run_ai_game(); + break; + // 2. 玩家对战 + case 2: + run_pvp_game(); + break; + // 3. 网络对战 + case 3: + run_network_game(); + break; + // 4. 复盘模式 + case 4: + run_review_mode(); + break; + // 5. 配置管理 + case 5: + config_management_menu(); + break; + // 6. 游戏规则 + case 6: + clear_screen(); + display_game_rules(); + pause_for_input("\n按任意键返回主菜单..."); + break; + // 7. 关于游戏 + case 7: + clear_screen(); + display_about(); + pause_for_input("\n按任意键返回主菜单..."); + break; + // 8. 图形化界面 + case 8: + if (init_gui() == 0) + { + printf("启动图形化界面...\n"); + printf("图形化界面已启动,窗口应该可见\n"); + printf("如果看不到窗口,请检查任务栏或按Alt+Tab切换\n"); + while (gui_running && handle_events()) + { + render_game(); + SDL_Delay(16); // 约60FPS + } + printf("退出图形化界面\n"); + cleanup_gui(); + } + else + { + printf("图形化界面启动失败!请检查SDL3库是否正确安装。\n"); + pause_for_input("按任意键返回主菜单..."); + } + break; + // 0. 退出游戏 + case 0: + save_game_config(); + printf("感谢使用五子棋游戏!\n"); + return 0; + default: + printf("无效的选择!\n"); + pause_for_input("按任意键继续..."); + break; } } return 0; -} +} \ No newline at end of file diff --git a/ui.c b/ui.c index b75c1bf..2fbe81d 100644 --- a/ui.c +++ b/ui.c @@ -31,6 +31,7 @@ void display_main_menu() printf("5. 游戏设置\n"); printf("6. 游戏规则\n"); printf("7. 关于游戏\n"); + printf("8. 图形化界面\n"); printf("0. 退出游戏\n"); printf("=====================\n"); }