mirror of
https://github.com/LHY0125/Gobang-Game.git
synced 2026-05-10 02:19:46 +08:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0e53b09d9b | |||
| 1d8e2e25cf | |||
| 6d4de737c4 | |||
| b413f7254a | |||
| cb81105809 | |||
| fbe4f5273c | |||
| 59c816767b | |||
| 504868c739 |
+7
-1
@@ -39,4 +39,10 @@ Thumbs.db
|
||||
# 动态库文件
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
*.dylib
|
||||
|
||||
# 资源文件
|
||||
*.res
|
||||
*.ico
|
||||
|
||||
# 打包文件
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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图形库,提供现代化用户界面
|
||||
|
||||
### 预期收益
|
||||
- 减少代码重复和冗余
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
# 为五子棋游戏添加图标指南
|
||||
|
||||
## 问题说明
|
||||
|
||||
在尝试为可执行文件添加图标时,发现icon文件夹中的图标文件格式不正确:
|
||||
- `gobang_icon1.ico` 和 `gobang_icon2.ico` 实际上是HTML文件和PNG文件,而不是真正的ICO格式文件
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 方法一:获取正确的ICO文件
|
||||
|
||||
1. **下载或创建真正的ICO文件**
|
||||
- 使用在线ICO转换工具将PNG/JPG转换为ICO格式
|
||||
- 推荐网站:https://www.icoconverter.com/
|
||||
- 或使用GIMP、Photoshop等图像编辑软件导出ICO格式
|
||||
|
||||
2. **替换现有文件**
|
||||
- 将正确的ICO文件保存为 `icon/gobang_icon.ico`
|
||||
- 确保文件是真正的ICO格式(文件头应为 00 00 01 00)
|
||||
|
||||
3. **修改资源文件**
|
||||
- 编辑 `gobang.rc` 文件
|
||||
- 取消注释图标行:`IDI_APPLICATION ICON "icon\\gobang_icon.ico"`
|
||||
|
||||
4. **重新编译**
|
||||
```bash
|
||||
windres gobang.rc -o gobang.res
|
||||
gcc -std=c17 -o gobang.exe *.c gobang.res -lws2_32
|
||||
```
|
||||
|
||||
### 方法二:使用现有PNG文件(需要转换)
|
||||
|
||||
如果你有PNG格式的图标文件,可以:
|
||||
|
||||
1. **在线转换**
|
||||
- 访问 https://convertio.co/png-ico/
|
||||
- 上传PNG文件并转换为ICO格式
|
||||
- 下载转换后的ICO文件
|
||||
|
||||
2. **使用ImageMagick(如果已安装)**
|
||||
```bash
|
||||
magick convert icon/your_image.png icon/gobang_icon.ico
|
||||
```
|
||||
|
||||
### 方法三:使用Windows资源编辑器
|
||||
|
||||
1. 编译不带图标的exe文件(当前状态)
|
||||
2. 使用Resource Hacker等工具后期添加图标
|
||||
3. 下载Resource Hacker:http://www.angusj.com/resourcehacker/
|
||||
|
||||
## 当前状态
|
||||
|
||||
- ✅ 程序可以正常编译和运行
|
||||
- ✅ 包含版本信息资源
|
||||
- ❌ 暂时没有应用程序图标
|
||||
- ✅ 提供了完整的构建脚本
|
||||
|
||||
## 编译指令
|
||||
|
||||
### 不带图标版本(当前可用)
|
||||
```bash
|
||||
gcc -std=c17 -o gobang.exe *.c -lws2_32
|
||||
```
|
||||
|
||||
### 带图标版本(需要正确的ICO文件)
|
||||
```bash
|
||||
windres gobang.rc -o gobang.res
|
||||
gcc -std=c17 -o gobang.exe *.c gobang.res -lws2_32
|
||||
```
|
||||
|
||||
## 验证ICO文件格式
|
||||
|
||||
可以使用以下PowerShell命令检查文件是否为真正的ICO格式:
|
||||
```powershell
|
||||
Get-Content icon/gobang_icon.ico -AsByteStream -TotalCount 4 | ForEach-Object { '{0:X2}' -f $_ }
|
||||
```
|
||||
|
||||
正确的ICO文件应该显示:`00 00 01 00`
|
||||
+17
-3
@@ -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链接库参数
|
||||
|
||||
## 使用方法
|
||||
|
||||
|
||||
@@ -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库已正确配置。
|
||||
@@ -2,13 +2,23 @@
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
> 🎯 **最新版本 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
@@ -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
@@ -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模块管理
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
项目要求文档 - 五子棋游戏 (v8.0)
|
||||
|
||||
1. 项目概述
|
||||
- 开发一个基于C语言的五子棋游戏,支持本地多人、AI对战和网络对战模式。
|
||||
- v8.0版本实现双版本架构:支持命令行界面和SDL3图形化界面。
|
||||
- 包括游戏配置、记录保存、复盘功能和专业安装包。
|
||||
- 提供现代化的可视化用户体验和传统控制台体验。
|
||||
|
||||
2. 功能需求
|
||||
- **游戏模式**:
|
||||
- 单人模式:玩家 vs AI
|
||||
- 双人模式:本地两人对战
|
||||
- 网络模式:通过TCP/IP进行远程对战
|
||||
- **棋盘和规则**:
|
||||
- 默认15x15棋盘,支持自定义大小(5-25)
|
||||
- 支持禁手规则选项
|
||||
- 先手黑子,五连珠获胜
|
||||
- **AI功能**:
|
||||
- 实现AI算法,支持不同难度级别(1-5级)
|
||||
- AI应能计算最佳落子位置
|
||||
- 支持Alpha-Beta剪枝算法和威胁检测
|
||||
- **配置管理**:
|
||||
- 支持修改棋盘大小、禁手规则、计时器、网络端口等
|
||||
- 配置保存到INI文件
|
||||
- 默认配置和重置功能
|
||||
- 统一的输入验证机制
|
||||
- **游戏记录**:
|
||||
- 自动保存对局记录到CSV文件
|
||||
- 支持复盘功能,查看历史对局
|
||||
- 记录包含时间戳、玩家信息、棋局步骤等
|
||||
- **用户界面**:
|
||||
- **控制台界面**:传统命令行界面显示棋盘
|
||||
- **图形化界面**(v8.0新增):基于SDL3的现代化GUI界面
|
||||
- **鼠标交互**:支持点击落子操作
|
||||
- **窗口管理**:自动居中、响应式设计
|
||||
- **事件驱动**:流畅的用户交互体验
|
||||
- 支持坐标输入落子(数字格式:行 列)
|
||||
- 显示当前玩家、计时、游戏状态等信息
|
||||
- 菜单系统和配置界面
|
||||
- **网络功能**:
|
||||
- 支持服务器/客户端模式
|
||||
- 实时传输棋子位置
|
||||
- 超时和断线处理
|
||||
- 支持端口配置
|
||||
|
||||
3. 技术要求
|
||||
- 使用C语言开发
|
||||
- Windows平台,包含Winsock网络库(-lws2_32链接)
|
||||
- **SDL3图形库**(v8.0新增):用于GUI界面开发
|
||||
- **双版本架构**:控制台版本和GUI版本并行支持
|
||||
- 模块化设计:分离游戏逻辑、AI、配置、网络、UI、GUI等模块
|
||||
- **安装包制作**:支持Inno Setup专业安装程序
|
||||
- 错误处理和统一的输入验证
|
||||
- 支持跨平台编译(Windows/Linux)
|
||||
|
||||
4. 非功能需求
|
||||
- 性能:响应时间<1秒(AI计算除外)
|
||||
- 可维护性:代码模块化,注释清晰
|
||||
- 兼容性:Windows 11,支持GCC编译器
|
||||
- 可扩展性:易于添加新的AI算法和游戏模式
|
||||
|
||||
5. 交付物
|
||||
- 源代码文件(.c/.h文件)
|
||||
- 配置文件(gobang_config.ini)
|
||||
- 记录文件夹(records/)
|
||||
- 文档:README.md、AI增强指南、架构重构指南、网络功能说明、图标指南等
|
||||
- 代码统计报告和项目简介
|
||||
@@ -1,3 +1,12 @@
|
||||
/**
|
||||
* @file ai.c
|
||||
* @note 本文件定义了AI模块的函数和变量
|
||||
* @note 包括:
|
||||
* 1. 评估一个落子位置的综合得分(结合进攻和防守)
|
||||
* 2. 评估指定位置的价值
|
||||
* 3. 评估棋盘价值
|
||||
*/
|
||||
|
||||
#include "gobang.h"
|
||||
#include "ai.h"
|
||||
#include "config.h"
|
||||
|
||||
@@ -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
|
||||
@@ -1,3 +1,9 @@
|
||||
/**
|
||||
* @file config.c
|
||||
* @brief 五子棋游戏参数配置源文件
|
||||
* @note 本文件集中定义了五子棋游戏的所有参数配置,便于统一管理和修改
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "ui.h"
|
||||
#include "game_mode.h"
|
||||
@@ -146,27 +152,10 @@ void display_current_config()
|
||||
void config_board_size()
|
||||
{
|
||||
printf("\n当前棋盘大小: %d x %d\n", BOARD_SIZE, BOARD_SIZE);
|
||||
printf("请输入新的棋盘大小 (%d-%d): ", MIN_BOARD_SIZE, MAX_BOARD_SIZE);
|
||||
|
||||
int new_size;
|
||||
if (scanf("%d", &new_size) == 1)
|
||||
{
|
||||
if (new_size >= MIN_BOARD_SIZE && new_size <= MAX_BOARD_SIZE)
|
||||
{
|
||||
BOARD_SIZE = new_size;
|
||||
printf("棋盘大小已设置为: %d x %d\n", BOARD_SIZE, BOARD_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("无效的棋盘大小!\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("输入格式错误!\n");
|
||||
// 清除输入缓冲区
|
||||
while (getchar() != '\n');
|
||||
}
|
||||
int new_size = get_integer_input("请输入新的棋盘大小: ", MIN_BOARD_SIZE, MAX_BOARD_SIZE);
|
||||
BOARD_SIZE = new_size;
|
||||
printf("棋盘大小已设置为: %d x %d\n", BOARD_SIZE, BOARD_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -175,19 +164,10 @@ void config_board_size()
|
||||
void config_forbidden_moves()
|
||||
{
|
||||
printf("\n当前禁手规则: %s\n", use_forbidden_moves ? "开启" : "关闭");
|
||||
printf("是否启用禁手规则?(1=开启, 0=关闭): ");
|
||||
|
||||
int choice;
|
||||
if (scanf("%d", &choice) == 1)
|
||||
{
|
||||
use_forbidden_moves = (choice != 0);
|
||||
printf("禁手规则已%s\n", use_forbidden_moves ? "开启" : "关闭");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("输入格式错误!\n");
|
||||
while (getchar() != '\n');
|
||||
}
|
||||
int choice = get_integer_input("是否启用禁手规则?(1=开启, 0=关闭): ", 0, 1);
|
||||
use_forbidden_moves = (choice != 0);
|
||||
printf("禁手规则已%s\n", use_forbidden_moves ? "开启" : "关闭");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -196,36 +176,18 @@ void config_forbidden_moves()
|
||||
void config_timer()
|
||||
{
|
||||
printf("\n当前计时器: %s\n", use_timer ? "开启" : "关闭");
|
||||
printf("是否启用计时器?(1=开启, 0=关闭): ");
|
||||
|
||||
int choice;
|
||||
if (scanf("%d", &choice) == 1)
|
||||
int choice = get_integer_input("是否启用计时器?(1=开启, 0=关闭): ", 0, 1);
|
||||
use_timer = choice;
|
||||
if (use_timer)
|
||||
{
|
||||
use_timer = choice;
|
||||
if (use_timer)
|
||||
{
|
||||
printf("请输入时间限制(分钟): ");
|
||||
int new_limit;
|
||||
if (scanf("%d", &new_limit) == 1 && new_limit > 0)
|
||||
{
|
||||
time_limit = new_limit * 60; // 转换为秒数存储
|
||||
printf("计时器已开启,时间限制: %d 分钟\n", time_limit / 60);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("无效的时间限制!\n");
|
||||
while (getchar() != '\n');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("计时器已关闭\n");
|
||||
}
|
||||
int new_limit = get_integer_input("请输入时间限制(分钟): ", 1, 999);
|
||||
time_limit = new_limit * 60; // 转换为秒数存储
|
||||
printf("计时器已开启,时间限制: %d 分钟\n", time_limit / 60);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("输入格式错误!\n");
|
||||
while (getchar() != '\n');
|
||||
printf("计时器已关闭\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -238,45 +200,13 @@ void config_network()
|
||||
printf("当前网络端口: %d\n", network_port);
|
||||
printf("当前网络超时: %d 毫秒\n", network_timeout);
|
||||
|
||||
printf("\n请输入新的网络端口 (%d-%d): ", MIN_NETWORK_PORT, MAX_NETWORK_PORT);
|
||||
int new_port;
|
||||
if (scanf("%d", &new_port) == 1)
|
||||
{
|
||||
if (new_port >= MIN_NETWORK_PORT && new_port <= MAX_NETWORK_PORT)
|
||||
{
|
||||
network_port = new_port;
|
||||
printf("网络端口已设置为: %d\n", network_port);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("无效的端口号!端口范围: %d-%d\n", MIN_NETWORK_PORT, MAX_NETWORK_PORT);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("输入格式错误!\n");
|
||||
while (getchar() != '\n');
|
||||
}
|
||||
int new_port = get_integer_input("请输入新的网络端口: ", MIN_NETWORK_PORT, MAX_NETWORK_PORT);
|
||||
network_port = new_port;
|
||||
printf("网络端口已设置为: %d\n", network_port);
|
||||
|
||||
printf("\n请输入网络超时时间(毫秒, 建议1000-10000): ");
|
||||
int new_timeout;
|
||||
if (scanf("%d", &new_timeout) == 1)
|
||||
{
|
||||
if (new_timeout > 0)
|
||||
{
|
||||
network_timeout = new_timeout;
|
||||
printf("网络超时已设置为: %d 毫秒\n", network_timeout);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("无效的超时时间!\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("输入格式错误!\n");
|
||||
while (getchar() != '\n');
|
||||
}
|
||||
int new_timeout = get_integer_input("请输入网络超时时间(毫秒, 建议1000-10000): ", 1000, 60000);
|
||||
network_timeout = new_timeout;
|
||||
printf("网络超时已设置为: %d 毫秒\n", network_timeout);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -292,14 +222,7 @@ void config_management_menu()
|
||||
display_settings_menu();
|
||||
display_current_config();
|
||||
|
||||
printf("请选择操作: ");
|
||||
if (scanf("%d", &choice) != 1)
|
||||
{
|
||||
printf("输入格式错误!\n");
|
||||
while (getchar() != '\n');
|
||||
pause_for_input("按任意键继续...");
|
||||
continue;
|
||||
}
|
||||
choice = get_integer_input("请选择操作(0-5): ", 0, 5);
|
||||
|
||||
switch (choice)
|
||||
{
|
||||
@@ -318,7 +241,7 @@ void config_management_menu()
|
||||
case 5:
|
||||
printf("AI难度设置功能开发中...\n");
|
||||
break;
|
||||
case 6:
|
||||
case 0:
|
||||
save_game_config();
|
||||
return;
|
||||
default:
|
||||
|
||||
@@ -32,36 +32,36 @@
|
||||
#define INPUT_SURRENDER -4 // 认输
|
||||
|
||||
//---------- 游戏设置默认值 ----------//
|
||||
#define DEFAULT_USE_FORBIDDEN_MOVES false // 默认不启用禁手规则
|
||||
#define DEFAULT_USE_TIMER 0 // 默认不启用计时器
|
||||
#define DEFAULT_TIME_LIMIT 30 // 默认时间限制为30秒(内部存储)
|
||||
#define DEFAULT_USE_FORBIDDEN_MOVES false // 默认不启用禁手规则
|
||||
#define DEFAULT_USE_TIMER 0 // 默认不启用计时器
|
||||
#define DEFAULT_TIME_LIMIT 30 // 默认时间限制为30秒(内部存储)
|
||||
|
||||
//---------- AI参数 ----------//
|
||||
#define DEFAULT_AI_DEPTH 5 // 默认AI搜索深度(从3提升到5)
|
||||
#define DEFAULT_DEFENSE_COEFFICIENT 1.5 // 默认防守系数(从1.2提升到1.5)
|
||||
#define DEFAULT_AI_DEPTH 5 // 默认AI搜索深度
|
||||
#define DEFAULT_DEFENSE_COEFFICIENT 1.5 // 默认防守系数
|
||||
|
||||
//---------- 网络参数 ----------//
|
||||
#define DEFAULT_NETWORK_PORT 8888 // 默认网络端口
|
||||
#define MIN_NETWORK_PORT 1024 // 最小网络端口
|
||||
#define MAX_NETWORK_PORT 65535 // 最大网络端口
|
||||
#define NETWORK_TIMEOUT_MS 5000 // 网络超时时间(毫秒)
|
||||
#define NETWORK_BUFFER_SIZE 1024 // 网络缓冲区大小
|
||||
#define DEFAULT_NETWORK_PORT 8888 // 默认网络端口
|
||||
#define MIN_NETWORK_PORT 1024 // 最小网络端口
|
||||
#define MAX_NETWORK_PORT 65535 // 最大网络端口
|
||||
#define NETWORK_TIMEOUT_MS 5000 // 网络超时时间(毫秒)
|
||||
#define NETWORK_BUFFER_SIZE 1024 // 网络缓冲区大小
|
||||
|
||||
// 网络配置
|
||||
#define DEFAULT_PORT 8888 // 默认端口(与DEFAULT_NETWORK_PORT保持一致)
|
||||
#define BUFFER_SIZE 1024 // 缓冲区大小(与NETWORK_BUFFER_SIZE保持一致)
|
||||
#define MAX_IP_LENGTH 16 // 最大IP地址长度
|
||||
#define DEFAULT_PORT 8888 // 默认端口(与DEFAULT_NETWORK_PORT保持一致)
|
||||
#define BUFFER_SIZE 1024 // 缓冲区大小(与NETWORK_BUFFER_SIZE保持一致)
|
||||
#define MAX_IP_LENGTH 16 // 最大IP地址长度
|
||||
|
||||
// 网络消息类型
|
||||
#define MSG_MOVE 1 // 落子消息
|
||||
#define MSG_CHAT 2 // 聊天消息
|
||||
#define MSG_SURRENDER 3 // 认输消息
|
||||
#define MSG_UNDO_REQUEST 4 // 悔棋请求
|
||||
#define MSG_UNDO_RESPONSE 5 // 悔棋回应
|
||||
#define MSG_GAME_START 6 // 游戏开始
|
||||
#define MSG_GAME_END 7 // 游戏结束
|
||||
#define MSG_HEARTBEAT 8 // 心跳包
|
||||
#define MSG_DISCONNECT 9 // 断线消息
|
||||
#define MSG_MOVE 1 // 落子消息
|
||||
#define MSG_CHAT 2 // 聊天消息
|
||||
#define MSG_SURRENDER 3 // 认输消息
|
||||
#define MSG_UNDO_REQUEST 4 // 悔棋请求
|
||||
#define MSG_UNDO_RESPONSE 5 // 悔棋回应
|
||||
#define MSG_GAME_START 6 // 游戏开始
|
||||
#define MSG_GAME_END 7 // 游戏结束
|
||||
#define MSG_HEARTBEAT 8 // 心跳包
|
||||
#define MSG_DISCONNECT 9 // 断线消息
|
||||
|
||||
//---------- 评分参数 ----------//
|
||||
// 棋型评分 - 用于calculate_step_score函数
|
||||
|
||||
+17
-7
@@ -1,3 +1,13 @@
|
||||
/**
|
||||
* @file game_mode.c
|
||||
* @brief 五子棋游戏框架源文件
|
||||
* @note 本文件定义了五子棋游戏的四种主要模式:
|
||||
* 1. AI对战模式
|
||||
* 2. 双人对战模式
|
||||
* 3. 网络对战模式
|
||||
* 4. 复盘模式
|
||||
*/
|
||||
|
||||
#include "game_mode.h"
|
||||
#include "init_board.h"
|
||||
#include "gobang.h"
|
||||
@@ -349,18 +359,18 @@ void run_ai_game()
|
||||
scores_calculated = 0;
|
||||
|
||||
// AI对战模式
|
||||
int AI_DEPTH = 3;
|
||||
int AI_DEPTH = DEFAULT_AI_DEPTH;
|
||||
AI_DEPTH = get_integer_input("请选择AI难度(1~5), 数字越大越强,注意数字越大AI思考时间越长!):", 1, 5);
|
||||
|
||||
/**
|
||||
* @brief AI的防守系数,系数越大越倾向于防守
|
||||
* @note 1~1.2
|
||||
* 2~1.3
|
||||
* 3~1.4
|
||||
* 4~1.5
|
||||
* 5~1.6
|
||||
* @note 1~1.5
|
||||
* 2~1.6
|
||||
* 3~1.7
|
||||
* 4~1.8
|
||||
* 5~1.9
|
||||
*/
|
||||
defense_coefficient = 1.2 + (AI_DEPTH - 1) * 0.1;
|
||||
defense_coefficient = DEFAULT_DEFENSE_COEFFICIENT + (AI_DEPTH - 1) * 0.1;
|
||||
|
||||
empty_board();
|
||||
int current_player = determine_first_player(PLAYER, AI);
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
* @file globals.c
|
||||
* @author 刘航宇(3364451258@qq.com、15236416560@163.com、lhy3364451258@outlook.com)
|
||||
* @brief 全局变量定义和初始化文件
|
||||
* @version 6.0
|
||||
* @date 2025-07-10
|
||||
* @note 集中管理所有全局变量的定义和初始化,提高代码可维护性
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
/**
|
||||
* @file gobang.c
|
||||
* @brief 五子棋游戏源文件
|
||||
* @note 本文件定义了五子棋游戏的主要数据结构、函数和全局变量。
|
||||
* 它包含了游戏棋盘的表示、玩家操作、规则检查以及AI决策等功能。
|
||||
*/
|
||||
|
||||
#include "game_mode.h"
|
||||
#include "init_board.h"
|
||||
#include "gobang.h"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* @note 本文件定义了五子棋游戏的主要数据结构、函数和全局变量。
|
||||
* 它包含了游戏棋盘的表示、玩家操作、规则检查以及AI决策等功能。
|
||||
*/
|
||||
|
||||
#ifndef GO_BANG_H
|
||||
#define GO_BANG_H
|
||||
|
||||
|
||||
@@ -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, ¢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);
|
||||
}
|
||||
@@ -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
|
||||
@@ -1,3 +1,10 @@
|
||||
/**
|
||||
* @file init_board.c
|
||||
* @brief 初始化游戏棋盘源文件
|
||||
* @note 本文件定义了初始化游戏棋盘的相关函数。
|
||||
* 它负责设置游戏的初始状态,包括棋盘大小、玩家标识、游戏规则等。
|
||||
*/
|
||||
|
||||
#include "init_board.h"
|
||||
#include "gobang.h"
|
||||
#include "game_mode.h"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* @note 本文件定义了初始化游戏棋盘的相关函数和全局变量。
|
||||
* 它负责设置游戏的初始状态,包括棋盘大小、玩家标识、游戏规则等。
|
||||
*/
|
||||
|
||||
#ifndef INIT_BOARD_H
|
||||
#define INIT_BOARD_H
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
; NSIS Installation Script
|
||||
!include "MUI2.nsh"
|
||||
|
||||
; Basic Information
|
||||
Name "Gobang Game"
|
||||
OutFile "..\\Gobang_Setup.exe"
|
||||
InstallDir "$PROGRAMFILES\Gobang"
|
||||
RequestExecutionLevel admin
|
||||
|
||||
; Interface Settings
|
||||
!define MUI_ABORTWARNING
|
||||
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
|
||||
|
||||
; Installation Pages
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
|
||||
; Language Settings
|
||||
!insertmacro MUI_LANGUAGE "SimpChinese"
|
||||
|
||||
; Installation Section
|
||||
Section "Main"
|
||||
SetOutPath "$INSTDIR"
|
||||
|
||||
; Copy configuration and documentation files
|
||||
File "..\\gobang_config.ini"
|
||||
File "..\\README.md"
|
||||
|
||||
; 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_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"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gobang" \
|
||||
"DisplayName" "Gobang Game"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gobang" \
|
||||
"UninstallString" "$\"$INSTDIR\Uninstall.exe$\""
|
||||
SectionEnd
|
||||
|
||||
; Uninstall Section
|
||||
Section "Uninstall"
|
||||
RMDir /r "$INSTDIR"
|
||||
Delete "$DESKTOP\Gobang.lnk"
|
||||
RMDir /r "$SMPROGRAMS\Gobang"
|
||||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gobang"
|
||||
SectionEnd
|
||||
@@ -0,0 +1,55 @@
|
||||
; Inno Setup Script for Gobang Game
|
||||
; Generated by Inno Setup Script Wizard
|
||||
|
||||
[Setup]
|
||||
; NOTE: The value of AppId uniquely identifies this application.
|
||||
; Do not use the same AppId value in installers for other applications.
|
||||
AppId={{A92AAE42-5C7E-4C8E-9F2B-8D4E5F6A7B8C}
|
||||
AppName=Gobang Game
|
||||
AppVersion=1.0
|
||||
AppPublisher=Gobang Game Developer
|
||||
DefaultDirName={autopf}\Gobang
|
||||
DefaultGroupName=Gobang Game
|
||||
AllowNoIcons=yes
|
||||
OutputDir=..
|
||||
OutputBaseFilename=Gobang_Setup
|
||||
SetupIconFile=compiler:SetupClassicIcon.ico
|
||||
Compression=lzma
|
||||
SolidCompression=yes
|
||||
WizardStyle=modern
|
||||
|
||||
[Languages]
|
||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||
|
||||
[Tasks]
|
||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||
|
||||
[Files]
|
||||
; 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
|
||||
|
||||
; 指定的TXT文件
|
||||
Source: "..\\TXT\\*"; DestDir: "{app}\TXT"; Flags: ignoreversion
|
||||
|
||||
; 文档文件
|
||||
Source: "..\\README.md"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
[Dirs]
|
||||
; 创建空的records目录(不包含存档文件)
|
||||
Name: "{app}\records"
|
||||
|
||||
[Icons]
|
||||
Name: "{group}\Gobang Game"; Filename: "{app}\gobang_gui.exe"
|
||||
Name: "{group}\{cm:UninstallProgram,Gobang Game}"; Filename: "{uninstallexe}"
|
||||
Name: "{autodesktop}\Gobang Game"; Filename: "{app}\gobang_gui.exe"; Tasks: desktopicon
|
||||
|
||||
[Run]
|
||||
Filename: "{app}\gobang_gui.exe"; Description: "{cm:LaunchProgram,Gobang Game}"; Flags: nowait postinstall skipifsilent
|
||||
|
||||
|
||||
@@ -1,5 +1,27 @@
|
||||
/**
|
||||
* @file main.c
|
||||
* @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 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
|
||||
@@ -7,13 +29,6 @@
|
||||
#include <direct.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief 将指令复制到powershell
|
||||
* gcc -std=c17 -o gobang.exe *.c -lws2_32
|
||||
.\gobang.exe
|
||||
* gcc 为编译器,添加了network.c网络模块,-lws2_32链接Windows网络库
|
||||
*/
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 设置控制台编码为UTF-8
|
||||
@@ -26,57 +41,78 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,10 +2,6 @@
|
||||
* @file network.c
|
||||
* @author 刘航宇(3364451258@qq.com、15236416560@163.com、lhy3364451258@outlook.com)
|
||||
* @brief 五子棋网络对战模块实现
|
||||
* @version 6.0
|
||||
* @date 2025-07-10
|
||||
*
|
||||
* @copyright Copyright (c) 2025
|
||||
*/
|
||||
|
||||
#include "network.h"
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
/**
|
||||
* @file record.c
|
||||
* @brief 游戏复盘与记录源文件
|
||||
* @note 本文件定义了游戏复盘与记录相关的函数和数据结构。
|
||||
* 它负责管理游戏的历史记录、加载和保存游戏文件、计算游戏评分等功能。
|
||||
*/
|
||||
|
||||
#include "record.h"
|
||||
#include "game_mode.h"
|
||||
#include "gobang.h"
|
||||
@@ -289,10 +296,8 @@ void display_game_scores(int game_mode)
|
||||
*/
|
||||
void handle_save_record(int game_mode)
|
||||
{
|
||||
int save_choice = 0;
|
||||
printf("===== 游戏结束 =====\n");
|
||||
printf("是否保存游戏记录? (1-是, 0-否): ");
|
||||
scanf("%d", &save_choice);
|
||||
int save_choice = get_integer_input("是否保存游戏记录? (1-是, 0-否): ", 0, 1);
|
||||
|
||||
if (save_choice == 1)
|
||||
{
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
* @brief 记录一步棋的详细信息
|
||||
*/
|
||||
typedef struct {
|
||||
int player; // 执行该步的玩家标识
|
||||
int x; // 落子的行坐标 (0-based)
|
||||
int y; // 落子的列坐标 (0-based)
|
||||
int player; // 执行该步的玩家标识
|
||||
int x; // 落子的行坐标 (0-based)
|
||||
int y; // 落子的列坐标 (0-based)
|
||||
} Step;
|
||||
|
||||
/**
|
||||
@@ -33,9 +33,9 @@ typedef struct {
|
||||
* @details 用于评估棋形,例如判断活三、冲四等关键形态
|
||||
*/
|
||||
typedef struct {
|
||||
int continuous_chess; // 连续同色棋子的数量
|
||||
bool check_start; // 棋子序列的起始端是否为空位(即是否开放)
|
||||
bool check_end; // 棋子序列的末尾端是否为空位(即是否开放)
|
||||
int continuous_chess; // 连续同色棋子的数量
|
||||
bool check_start; // 棋子序列的起始端是否为空位(即是否开放)
|
||||
bool check_end; // 棋子序列的末尾端是否为空位(即是否开放)
|
||||
} DirInfo;
|
||||
|
||||
// ==================== AI相关数据结构 ====================
|
||||
@@ -45,8 +45,8 @@ typedef struct {
|
||||
* @details 用于AI移动排序,存储候选移动及其评估分数
|
||||
*/
|
||||
typedef struct {
|
||||
int x, y; // 位置坐标
|
||||
int score; // 评估分数
|
||||
int x, y; // 位置坐标
|
||||
int score; // 评估分数
|
||||
} ScoredMove;
|
||||
|
||||
/**
|
||||
@@ -54,12 +54,12 @@ typedef struct {
|
||||
* @details 用于AI威胁检测系统
|
||||
*/
|
||||
typedef enum {
|
||||
THREAT_NONE = 0, // 无威胁
|
||||
THREAT_WIN = 5, // 直接获胜
|
||||
THREAT_FOUR = 4, // 活四/冲四
|
||||
THREAT_THREE = 3, // 活三
|
||||
THREAT_DOUBLE = 2, // 双威胁
|
||||
THREAT_POTENTIAL = 1 // 潜在威胁
|
||||
THREAT_NONE = 0, // 无威胁
|
||||
THREAT_WIN = 5, // 直接获胜
|
||||
THREAT_FOUR = 4, // 活四/冲四
|
||||
THREAT_THREE = 3, // 活三
|
||||
THREAT_DOUBLE = 2, // 双威胁
|
||||
THREAT_POTENTIAL = 1 // 潜在威胁
|
||||
} ThreatLevel;
|
||||
|
||||
// ==================== 网络相关数据结构 ====================
|
||||
@@ -69,11 +69,11 @@ typedef enum {
|
||||
* @details 用于网络对战中的消息传输
|
||||
*/
|
||||
typedef struct {
|
||||
int type; // 消息类型
|
||||
int player_id; // 玩家ID
|
||||
int x, y; // 坐标(用于落子)
|
||||
char message[256]; // 消息内容(用于聊天等)
|
||||
time_t timestamp; // 时间戳
|
||||
int type; // 消息类型
|
||||
int player_id; // 玩家ID
|
||||
int x, y; // 坐标(用于落子)
|
||||
char message[256]; // 消息内容(用于聊天等)
|
||||
time_t timestamp; // 时间戳
|
||||
} NetworkMessage;
|
||||
|
||||
/**
|
||||
@@ -87,7 +87,7 @@ typedef struct {
|
||||
int local_player_id; // 本地玩家ID
|
||||
int remote_player_id; // 远程玩家ID
|
||||
char remote_ip[16]; // 远程IP地址(MAX_IP_LENGTH = 16)
|
||||
int port; // 端口号
|
||||
int port; // 端口号
|
||||
} NetworkGameState;
|
||||
|
||||
#endif // TYPE_H
|
||||
@@ -1,3 +1,10 @@
|
||||
/**
|
||||
* @file ui.c
|
||||
* @brief
|
||||
* @note 本文件定义了用户界面相关的函数和数据结构。
|
||||
* 它负责处理用户输入、显示游戏界面、提示信息等与用户交互的功能。
|
||||
*/
|
||||
|
||||
#include "ui.h"
|
||||
#include "gobang.h"
|
||||
#include "config.h"
|
||||
@@ -24,6 +31,7 @@ void display_main_menu()
|
||||
printf("5. 游戏设置\n");
|
||||
printf("6. 游戏规则\n");
|
||||
printf("7. 关于游戏\n");
|
||||
printf("8. 图形化界面\n");
|
||||
printf("0. 退出游戏\n");
|
||||
printf("=====================\n");
|
||||
}
|
||||
@@ -123,7 +131,7 @@ void display_settings_menu()
|
||||
printf("3. 计时器设置\n");
|
||||
printf("4. 网络配置设置\n");
|
||||
printf("5. AI难度设置\n");
|
||||
printf("6. 返回主菜单\n");
|
||||
printf("0. 返回主菜单\n");
|
||||
printf("==================\n");
|
||||
}
|
||||
|
||||
@@ -186,7 +194,7 @@ void display_about()
|
||||
{
|
||||
printf("\n===== 关于五子棋游戏 =====\n");
|
||||
printf("🎮 游戏名称:五子棋人机对战\n");
|
||||
printf("📦 版本:4.0\n");
|
||||
printf("📦 版本:7.0\n");
|
||||
printf("👨💻 开发者:刘航宇\n");
|
||||
printf("📧 联系邮箱:3364451258@qq.com\n");
|
||||
printf("🌐 项目主页:https://github.com/LHY0125/Gobang-Game\n\n");
|
||||
|
||||
Reference in New Issue
Block a user