v8.0版本更新:添加SDL3图形化界面功能和完善文档

This commit is contained in:
2025-09-18 19:08:37 +08:00
parent 1d8e2e25cf
commit 0e53b09d9b
16 changed files with 827 additions and 100 deletions
+4 -2
View File
@@ -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层)
+12 -2
View File
@@ -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)
+4 -2
View File
@@ -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图形库,提供现代化用户界面
### 预期收益
- 减少代码重复和冗余
+17 -3
View File
@@ -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链接库参数
## 使用方法
+147
View File
@@ -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库已正确配置。
+62 -6
View File
@@ -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主题和棋盘样式
- [ ] **音效系统**:添加落子音效和背景音乐
- [ ] **动画效果**:添加落子动画和界面过渡效果
- [ ] **多语言支持**:支持中英文界面切换
#### 🌐 网络功能
- [ ] **在线对战模式**:实现网络多人对战功能
+38 -11
View File
@@ -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/ - 游戏记录存储目录
开发环境:
+13 -4
View File
@@ -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模块管理
+13 -5
View File
@@ -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
+36
View File
@@ -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
+334
View File
@@ -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 <stdio.h>
#include <stdlib.h>
#include <math.h>
// 全局变量
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, &center_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);
}
+50
View File
@@ -0,0 +1,50 @@
/**
* @file gui.h
* @brief 图形化用户界面头文件
* @note 使用SDL3库实现五子棋的图形化界面
* @author 刘航宇
* @date 2025-01-15
*/
#ifndef GUI_H
#define GUI_H
#include <SDL3/SDL.h>
#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
+10 -6
View File
@@ -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"
+9 -11
View File
@@ -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;
+32 -3
View File
@@ -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
*/
#include "game_mode.h"
#include "ui.h"
#include "gui.h"
#include "config.h"
#include <stdio.h>
#ifdef _WIN32
@@ -39,7 +47,7 @@ int main(int argc, char *argv[])
{
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)
{
@@ -75,6 +83,27 @@ int main(int argc, char *argv[])
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();
+1
View File
@@ -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");
}