重构项目结构:将源文件和头文件分别移动到src和include目录

This commit is contained in:
2025-09-22 22:53:14 +08:00
parent ae0629ef6e
commit 205e943bcb
25 changed files with 185 additions and 504 deletions
+83
View File
@@ -0,0 +1,83 @@
/**
* @file ai.h
* @note 本文件定义了AI模块的函数和变量
* @note 包括:
* 1. 评估一个落子位置的综合得分(结合进攻和防守)
* 2. 评估指定位置的价值
* 3. 评估棋盘价值
*/
#ifndef AI_H
#define AI_H
#include "gobang.h"
#include "type.h"
/**
* @brief 评估一个落子位置的综合得分(结合进攻和防守)
*
* @param x 行坐标
* @param y 列坐标
* @return int 综合得分
*/
int evaluate_move(int x, int y);
/**
* @brief 评估指定位置的价值
*
* @param x 位置x坐标
* @param y 位置y坐标
* @param player 玩家标识(PLAYER/AI)
* @return int 位置价值
*/
int evaluate_pos(int x, int y, int player);
/**
* @brief 评估棋盘价值
*
* @param player 玩家标识(PLAYER/AI)
*/
int dfs(int x, int y, int player, int depth, int alpha, int beta, bool is_maximizing);
/**
* @brief AI下棋
*
* @param depth
*/
void ai_move(int depth);
// ==================== AI增强:新增函数声明 ====================
/**
* @brief 生成候选移动并按评估分数排序
* @param moves 存储候选移动的数组
* @param player 当前玩家
* @return 候选移动数量
*/
int generate_candidate_moves(ScoredMove *moves, int player);
/**
* @brief 检查位置是否在已有棋子附近
* @param x, y 要检查的位置
* @return 如果附近有棋子返回true
*/
bool is_near_stones(int x, int y);
/**
* @brief 检测在指定位置落子的威胁等级
* @param x, y 落子位置
* @param player 落子玩家
* @return 威胁等级
*/
ThreatLevel detect_threat(int x, int y, int player);
/**
* @brief 计算指定方向的威胁数量
* @param x, y 起始位置
* @param dx, dy 方向向量
* @param player 玩家
* @return 威胁数量
*/
int count_threats_in_direction(int x, int y, int dx, int dy, int player);
#endif // AI_H
+186
View File
@@ -0,0 +1,186 @@
/**
* @file config.h
* @brief 五子棋游戏参数配置头文件
* @note 本文件集中定义了五子棋游戏的所有参数配置,便于统一管理和修改
*/
#ifndef CONFIG_H
#define CONFIG_H
//---------- 棋盘相关参数 ----------//
#define MAX_BOARD_SIZE 25 // 支持的最大棋盘尺寸
#define MIN_BOARD_SIZE 5 // 支持的最小棋盘尺寸
#define DEFAULT_BOARD_SIZE 15 // 默认棋盘尺寸
#define MAX_STEPS (MAX_BOARD_SIZE * MAX_BOARD_SIZE) // 游戏最大步数
//---------- 游戏模式参数 ----------//
#define GAME_MODE_AI 1 // 人机对战模式
#define GAME_MODE_PVP 2 // 双人对战模式
#define GAME_MODE_NETWORK 3 // 网络对战模式
//---------- 玩家标识参数 ----------//
#define EMPTY 0 // 棋盘空位标识
#define PLAYER 1 // 玩家标识 (用于人机对战模式)
#define AI 2 // AI标识 (用于人机对战模式)
#define PLAYER1 1 // 玩家1标识 (用于双人对战模式)
#define PLAYER2 2 // 玩家2标识 (用于双人对战模式)
//---------- 特殊输入命令 ----------//
#define INPUT_UNDO -1 // 悔棋
#define INPUT_SAVE -2 // 保存
#define INPUT_EXIT -3 // 退出
#define INPUT_SURRENDER -4 // 认输
//---------- 游戏设置默认值 ----------//
#define DEFAULT_USE_FORBIDDEN_MOVES false // 默认不启用禁手规则
#define DEFAULT_USE_TIMER 0 // 默认不启用计时器
#define DEFAULT_TIME_LIMIT 30 // 默认时间限制为30秒(内部存储)
//---------- AI参数 ----------//
#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_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 // 断线消息
//---------- 评分参数 ----------//
// 棋型评分 - 用于calculate_step_score函数
#define SCORE_FIVE 0 // 五连
#define SCORE_LIVE_FOUR 2000 // 活四
#define SCORE_RUSH_FOUR 1000 // 冲四
#define SCORE_DEAD_FOUR 300 // 死四
#define SCORE_LIVE_THREE 500 // 活三
#define SCORE_SLEEP_THREE 200 // 眠三
#define SCORE_DEAD_THREE 80 // 死三
#define SCORE_LIVE_TWO 100 // 活二
#define SCORE_SLEEP_TWO 40 // 眠二
#define SCORE_DEAD_TWO 15 // 死二
#define SCORE_LIVE_ONE 15 // 开放单子
#define SCORE_HALF_ONE 8 // 半开放单子
#define SCORE_DEAD_ONE 2 // 封闭单子
// 位置奖励系数
#define POSITION_BONUS_FACTOR 10 // 位置奖励因子
// AI评估参数 - 用于evaluate_pos函数
#define AI_SCORE_FIVE 1000000 // AI评估-五连
#define AI_SCORE_LIVE_FOUR 100000 // AI评估-活四
#define AI_SCORE_RUSH_FOUR 10000 // AI评估-冲四
#define AI_SCORE_DEAD_FOUR 500 // AI评估-死四
#define AI_SCORE_LIVE_THREE 5000 // AI评估-活三
#define AI_SCORE_SLEEP_THREE 1000 // AI评估-眠三
#define AI_SCORE_DEAD_THREE 50 // AI评估-死三
#define AI_SCORE_LIVE_TWO 500 // AI评估-活二
#define AI_SCORE_SLEEP_TWO 100 // AI评估-眠二
#define AI_SCORE_DEAD_TWO 10 // AI评估-死二
#define AI_SCORE_LIVE_ONE 50 // AI评估-开放单子
#define AI_SCORE_HALF_ONE 10 // AI评估-半开放单子
#define AI_SCORE_DEAD_ONE 1 // AI评估-封闭单子
// AI位置奖励系数
#define AI_POSITION_BONUS_FACTOR 50 // AI位置奖励因子
// 搜索算法参数
#define SEARCH_MAX_SCORE 1000000 // 搜索最大分数
#define SEARCH_WIN_BONUS 1000000 // 获胜奖励分数
#define AI_NEARBY_RANGE 3 // AI搜索的邻近范围
#define AI_SEARCH_RANGE_THRESHOLD 8 // AI开始限制搜索范围的步数阈值
// 组合棋型评分 - AI增强新增
#define AI_SCORE_DOUBLE_THREE 50000 // 双三
#define AI_SCORE_FOUR_THREE 200000 // 四三
#define AI_SCORE_THREAT_SEQUENCE 80000 // 威胁序列
#define AI_SCORE_POTENTIAL_FIVE 300000 // 潜在五连
// 评分权重参数
#define TIME_WEIGHT_FACTOR 0.5 // 时间权重因子
#define WIN_BONUS 2000 // 胜利奖励分数
//---------- GUI界面参数 ----------//
// 窗口和棋盘配置
#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}
//---------- 文件路径参数 ----------//
#define RECORDS_DIR "records" // 记录文件目录
#define CONFIG_FILE "gobang_config.ini" // 配置文件路径
#define MAX_PATH_LENGTH 256 // 最大路径长度
//---------- 配置管理函数声明 ----------//
/**
* @brief 加载游戏配置
*/
void load_game_config();
/**
* @brief 保存游戏配置
*/
void save_game_config();
/**
* @brief 重置为默认配置
*/
void reset_to_default_config();
/**
* @brief 显示当前配置
*/
void display_current_config();
/**
* @brief 配置棋盘大小
*/
void config_board_size();
/**
* @brief 配置禁手规则
*/
void config_forbidden_moves();
/**
* @brief 配置计时器
*/
void config_timer();
/**
* @brief 配置网络参数
*/
void config_network();
/**
* @brief 配置管理主菜单
*/
void config_management_menu();
#endif // CONFIG_H
+108
View File
@@ -0,0 +1,108 @@
/**
* @file game_mode.h
* @brief 五子棋游戏框架头文件
* @note 本文件定义了五子棋游戏的四种主要模式:
* 1. AI对战模式
* 2. 双人对战模式
* 3. 网络对战模式
* 4. 复盘模式
*/
#ifndef GAME_MODE_H
#define GAME_MODE_H
#include "gobang.h"
#include "config.h"
/**
* @brief 从用户获取整数输入
*
* @param prompt 提示信息
* @param min 最小值
* @param max 最大值
* @return int 输入的整数
*/
int get_integer_input(const char *prompt, int min, int max);
/**
* @brief 处理玩家回合
*
* @param x 玩家输入的横坐标
* @param y 玩家输入的纵坐标
* @return true 输入有效
* @return false 输入无效
*/
bool parse_player_input(int *x, int *y);
/**
* @brief 解析网络对战模式下的玩家输入
* @param x 行坐标指针
* @param y 列坐标指针
* @return true 有效坐标输入
* @return false 特殊命令或无效输入
*/
bool parse_network_player_input(int *x, int *y);
/**
* @brief 处理AI回合
*
* @param current_player 当前玩家
*/
bool handle_player_turn(int current_player);
/**
* @brief AI对战模式
* 实现玩家与AI的对战逻辑
*/
void run_ai_game();
/**
* @brief 双人对战模式
* 实现两个玩家之间的对战逻辑
*/
void run_pvp_game();
/**
* @brief 复盘模式
* 加载并重现历史对局
*/
void run_review_mode();
/**
* @brief 网络对战模式
* 实现两台设备之间的在线对战
*/
void run_network_game();
/**
* @brief 处理网络玩家回合
* @param current_player 当前玩家
* @param is_local_turn 是否为本地玩家回合
* @return true 回合处理成功
* @return false 游戏结束或网络错误
*/
bool handle_network_player_turn(int current_player, bool is_local_turn);
/**
* @brief 网络游戏主循环
* @return true 游戏正常结束
* @return false 网络错误
*/
bool network_game_loop();
/**
* @brief 显示游戏规则
*/
void show_game_rules();
/**
* @brief 显示关于游戏信息
*/
void show_about_game();
/**
* @brief 启动图形化界面
*/
void run_gui_mode();
#endif // GAME_MODE_H
+50
View File
@@ -0,0 +1,50 @@
/**
* @file globals.h
* @brief 全局变量声明头文件
* @note 集中管理所有全局变量的声明,提高代码可维护性
*/
#ifndef GLOBALS_H
#define GLOBALS_H
#include "type.h"
#include "gobang.h"
#include "network.h"
#include <stdbool.h>
#include <SDL3/SDL.h>
// ==================== 游戏核心变量 ====================
extern int BOARD_SIZE; // 当前实际使用的棋盘尺寸
extern int board[MAX_BOARD_SIZE][MAX_BOARD_SIZE]; // 棋盘状态存储数组
extern Step steps[MAX_STEPS]; // 存储所有落子步骤的数组
extern const int direction[4][2]; // 四个方向:向下、向右、右下、左下
extern int step_count; // 当前步数计数器
// ==================== 游戏配置变量 ====================
extern bool use_forbidden_moves; // 是否启用禁手规则的标志
extern int use_timer; // 是否启用计时器的标志
extern int time_limit; // 每回合的时间限制(秒,内部存储)
extern int network_port; // 网络端口
extern int network_timeout; // 网络超时时间
// ==================== AI相关变量 ====================
extern double defense_coefficient; // 防守系数
// ==================== 网络相关变量 ====================
extern NetworkGameState network_state; // 网络游戏状态
// ==================== GUI相关变量 ====================
extern SDL_Window* window; // SDL窗口指针
extern SDL_Renderer* renderer; // SDL渲染器指针
extern int gui_running; // GUI运行状态标志
extern int current_player_gui; // GUI当前玩家
extern int game_over; // 游戏结束标志
extern char status_message[256]; // 状态消息
// ==================== 记录相关变量 ====================
extern int player1_final_score; // 玩家1最终得分
extern int player2_final_score; // 玩家2最终得分
extern int scores_calculated; // 评分计算标志
extern char winner_info[50]; // 存储胜负信息
#endif // GLOBALS_H
+86
View File
@@ -0,0 +1,86 @@
/**
* @file gobang.h
* @brief 五子棋游戏头文件
* @note 本文件定义了五子棋游戏的主要数据结构、函数和全局变量。
* 它包含了游戏棋盘的表示、玩家操作、规则检查以及AI决策等功能。
*/
#ifndef GO_BANG_H
#define GO_BANG_H
#include <stdio.h>
#include <stdbool.h>
#include "config.h"
#include "type.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
// 函数原型
// --- 游戏核心逻辑 ---
/**
* @brief 检查指定坐标是否为有效落子点(在棋盘内且为空)
* @param x 待检查的行坐标 (0-based)
* @param y 待检查的列坐标 (0-based)
* @return 若位置有效且为空则返回true,否则返回false
*/
bool have_space(int x, int y);
/**
* @brief 判断一个落子是否为禁手
* @param x 落子的行坐标 (0-based)
* @param y 落子的列坐标 (0-based)
* @param player 当前玩家的标识
* @return 如果是禁手则返回true,否则返回false
*/
bool is_forbidden_move(int x, int y, int player);
/**
* @brief 执行一次玩家落子操作
* @param x 落子的行坐标 (0-based)
* @param y 落子的列坐标 (0-based)
* @param player 当前玩家的标识
* @return 若落子成功则返回true,否则(位置无效或被占用)返回false
*/
bool player_move(int x, int y, int player);
/**
* @brief 计算在特定方向上的棋子连续信息
* @param x 起始点的行坐标
* @param y 起始点的列坐标
* @param dx x方向的增量 (-1, 0, or 1)
* @param dy y方向的增量 (-1, 0, or 1)
* @param player 玩家标识
* @return 返回一个包含连续棋子信息的 DirInfo 结构体
*/
DirInfo count_specific_direction(int x, int y, int dx, int dy, int player);
/**
* @brief 检查在某点落子后,该玩家是否获胜
* @param x 落子的行坐标 (0-based)
* @param y 落子的列坐标 (0-based)
* @param player 当前玩家的标识
* @return 如果获胜则返回true,否则返回false
*/
bool check_win(int x, int y, int player);
/**
* @brief 悔棋功能,撤销指定步数
* @param steps_to_undo 要撤销的步数(每步包含双方各一次落子)
* @return 若悔棋成功则返回true,否则返回false
*/
bool return_move(int steps_to_undo);
/**
* @brief 计算并返回一步棋的得分
* @param x 落子的行坐标
* @param y 落子的列坐标
* @param player 玩家标识
* @return 该步棋的得分
*/
int calculate_step_score(int x, int y, int player);
#endif // GO_BANG_H
+154
View File
@@ -0,0 +1,154 @@
/**
* @file gui.h
* @brief 图形化用户界面头文件
* @note 使用SDL3库实现五子棋的图形化界面
* @author 刘航宇
* @date 2025-01-15
*/
#ifndef GUI_H
#define GUI_H
#include <SDL3/SDL.h>
#include "gobang.h"
#include "config.h"
#include "globals.h"
// GUI函数声明
/**
* @brief 初始化GUI
* @details 初始化SDL3图形库和游戏界面组件:
* - 初始化SDL视频子系统
* - 创建游戏窗口(可调整大小)
* - 创建SDL渲染器
* - 初始化游戏状态和棋盘数据
* @return 成功返回0,失败返回-1
* @note 窗口标题为"五子棋游戏 - SDL3版本"
* 窗口尺寸由WINDOW_WIDTH和WINDOW_HEIGHT定义
* 失败时会自动清理已创建的资源
*/
int init_gui();
/**
* @brief 清理GUI资源
* @details 按顺序释放所有SDL相关资源:
* - 销毁SDL渲染器
* - 销毁SDL窗口
* - 退出SDL子系统
* @note 函数会检查资源是否存在再进行释放
* 释放后将指针设置为NULL防止重复释放
* 程序退出时必须调用此函数避免内存泄漏
*/
void cleanup_gui();
/**
* @brief 渲染游戏画面
* @details 完整的游戏画面渲染流程:
* - 清空屏幕并设置背景色
* - 绘制棋盘网格和标记点
* - 绘制所有棋子
* - 绘制UI界面元素
* - 将渲染结果显示到屏幕
* @note 使用双缓冲技术,通过SDL_RenderPresent显示最终结果
* 背景色由GUI_COLOR_BACKGROUND定义
* 每帧都会完全重绘整个画面
*/
void render_game();
/**
* @brief 处理事件
* @details 处理所有SDL事件并执行相应操作:
* - SDL_EVENT_QUIT:用户关闭窗口
* - SDL_EVENT_KEY_DOWN:键盘按键(ESC退出)
* - SDL_EVENT_MOUSE_BUTTON_DOWN:鼠标点击落子
* @return 继续运行返回1,退出返回0
* @note 鼠标左键点击会转换为棋盘坐标并尝试落子
* 落子后会检查胜负并切换玩家
* 游戏结束后不再响应落子操作
*/
int handle_events();
/**
* @brief 绘制棋盘
* @details 绘制15x15的五子棋棋盘,包括:
* - 横竖交叉的网格线
* - 天元点(棋盘中心的标记点)
* - 四个星位(棋盘上的定位点)
* @note 使用SDL3渲染器绘制线条和填充矩形
* 棋盘线条颜色由GUI_COLOR_BOARD_LINE定义
* 天元点和星位用黑色小矩形标记
*/
void draw_board();
/**
* @brief 绘制棋子
* @details 遍历整个棋盘数组,绘制所有已落下的棋子:
* - 黑子:使用GUI_COLOR_BLACK_STONE颜色
* - 白子:使用GUI_COLOR_WHITE_STONE颜色
* - 每个棋子都有边框:使用GUI_COLOR_STONE_BORDER颜色
* @note 棋子绘制为圆形,半径由STONE_RADIUS定义
* 通过draw_circle函数实现圆形绘制
* 棋子位置根据棋盘坐标和CELL_SIZE计算屏幕坐标
*/
void draw_stones();
/**
* @brief 绘制UI元素
* @details 绘制游戏界面的用户交互元素:
* - 状态信息区域背景和边框
* - 当前玩家指示器(黑子或白子圆形)
* - 游戏状态显示区域
* @note 暂时使用简单图形代替文字显示
* 需要额外字体库支持文字渲染
* 指示器位置在棋盘右侧固定区域
*/
void draw_ui_elements();
/**
* @brief 绘制圆形
* @param center_x 圆心X坐标
* @param center_y 圆心Y坐标
* @param radius 半径
* @param color 颜色
* @details 使用像素级绘制实现圆形:
* - 遍历圆形外接矩形内的所有像素点
* - 计算每个像素到圆心的距离
* - 距离小于等于半径的像素点进行着色
* @note 采用暴力算法,性能较低但实现简单
* 适用于绘制棋子等小尺寸圆形
* SDL3没有内置圆形绘制函数,需要自实现
*/
void draw_circle(int center_x, int center_y, int radius, SDL_Color color);
/**
* @brief 屏幕坐标转棋盘坐标
* @param screen_x 屏幕X坐标
* @param screen_y 屏幕Y坐标
* @param board_x 输出棋盘X坐标
* @param board_y 输出棋盘Y坐标
* @return 转换成功返回1,失败返回0
* @details 坐标转换算法:
* - 减去棋盘偏移量得到相对坐标
* - 加上半个格子尺寸实现就近取整
* - 除以格子尺寸得到棋盘坐标
* - 检查坐标是否在有效范围内
* @note 使用就近取整算法,点击格子中心附近都会定位到该格子
* 坐标范围检查确保不会越界访问棋盘数组
*/
int screen_to_board(int screen_x, int screen_y, int *board_x, int *board_y);
/**
* @brief 显示消息
* @param message 要显示的消息
* @details 消息显示功能:
* - 将消息复制到全局状态消息缓冲区
* - 同时在控制台输出消息内容
* - 确保字符串安全复制,防止缓冲区溢出
* @note 消息会存储在status_message全局变量中
* 字符串长度限制为缓冲区大小减1
* 消息可用于游戏状态提示和错误信息显示
*/
void show_message(const char *message);
#endif // GUI_H
+42
View File
@@ -0,0 +1,42 @@
/**
* @file init_board.h
* @brief 初始化游戏棋盘头文件
* @note 本文件定义了初始化游戏棋盘的相关函数和全局变量。
* 它负责设置游戏的初始状态,包括棋盘大小、玩家标识、游戏规则等。
*/
#ifndef INIT_BOARD_H
#define INIT_BOARD_H
#include "gobang.h"
// --- 游戏初始化 ---
/**
* @brief 初始化棋盘,将所有位置设置为空(EMPTY)
*/
void empty_board();
/**
* @brief 将当前棋盘状态打印到控制台
*/
void print_board();
/**
* @brief 设置当前游戏的棋盘大小
*/
void setup_board_size();
/**
* @brief 设置游戏选项,如是否启用禁手、计时器等
*/
void setup_game_options();
/**
* @brief 决定先手玩家
* @param player1 玩家1的标识
* @param player2 玩家2的标识
* @return 返回先手玩家的标识
*/
int determine_first_player(int player1, int player2);
#endif // INIT_H
+144
View File
@@ -0,0 +1,144 @@
/**
* @file network.h
* @brief 五子棋网络对战模块头文件
* @note 本文件定义了五子棋游戏的网络对战功能:
* 1. 服务器模式(主机)
* 2. 客户端模式(加入游戏)
* 3. 网络消息传输
*/
#ifndef NETWORK_H
#define NETWORK_H
#include "gobang.h"
#include "type.h"
#include "config.h"
#include <stdbool.h>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define SOCKET int
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket close
#endif
// 函数声明
/**
* @brief 初始化网络模块
* @return true 初始化成功
* @return false 初始化失败
*/
bool init_network();
/**
* @brief 清理网络模块
*/
void cleanup_network();
/**
* @brief 创建服务器(主机模式)
* @param port 监听端口
* @return true 创建成功
* @return false 创建失败
*/
bool create_server(int port);
/**
* @brief 连接到服务器(客户端模式)
* @param ip 服务器IP地址
* @param port 服务器端口
* @return true 连接成功
* @return false 连接失败
*/
bool connect_to_server(const char* ip, int port);
/**
* @brief 发送网络消息
* @param msg 要发送的消息
* @return true 发送成功
* @return false 发送失败
*/
bool send_network_message(const NetworkMessage* msg);
/**
* @brief 接收网络消息
* @param msg 接收消息的缓冲区
* @param timeout_ms 超时时间(毫秒),0表示阻塞等待
* @return true 接收成功
* @return false 接收失败或超时
*/
bool receive_network_message(NetworkMessage* msg, int timeout_ms);
/**
* @brief 断开网络连接
*/
void disconnect_network();
/**
* @brief 检查网络连接状态
* @return true 连接正常
* @return false 连接断开
*/
bool is_network_connected();
/**
* @brief 获取本机IP地址
* @param ip_buffer 存储IP地址的缓冲区
* @param buffer_size 缓冲区大小
* @return true 获取成功
* @return false 获取失败
*/
bool get_local_ip(char* ip_buffer, int buffer_size);
/**
* @brief 发送落子消息
* @param x 行坐标
* @param y 列坐标
* @param player_id 玩家ID
* @return true 发送成功
* @return false 发送失败
*/
bool send_move(int x, int y, int player_id);
/**
* @brief 发送聊天消息
* @param message 聊天内容
* @return true 发送成功
* @return false 发送失败
*/
bool send_chat_message(const char* message);
/**
* @brief 发送认输消息
* @return true 发送成功
* @return false 发送失败
*/
bool send_surrender();
/**
* @brief 发送悔棋请求
* @param steps 悔棋步数
* @return true 发送成功
* @return false 发送失败
*/
bool send_undo_request(int steps);
/**
* @brief 发送悔棋回应
* @param accepted 是否同意悔棋
* @param steps 悔棋步数
* @return true 发送成功
* @return false 发送失败
*/
bool send_undo_response(bool accepted, int steps);
#endif // NETWORK_H
+51
View File
@@ -0,0 +1,51 @@
/**
* @file record.h
* @brief 游戏复盘与记录头文件
* @note 本文件定义了游戏复盘与记录相关的函数和数据结构。
* 它负责管理游戏的历史记录、加载和保存游戏文件、计算游戏评分等功能。
*/
#ifndef RECORD_H
#define RECORD_H
#include "gobang.h"
// --- 复盘与记录功能 ---
/**
* @brief 进入复盘流程,回顾整局游戏
* @param game_mode 游戏模式(1为人机对战,2为双人对战)
*/
void review_process(int game_mode);
/**
* @brief 将当前对局记录保存到文件
* @param filename 要保存到的文件名
* @param game_mode 游戏模式
* @return 0表示成功,非0表示失败
*/
int save_game_to_file(const char *filename, int game_mode);
/**
* @brief 处理保存游戏记录的逻辑
* @param game_mode 游戏模式
*/
void handle_save_record(int game_mode);
/**
* @brief 从文件加载游戏记录
* @param filename 要加载的文件名
* @return 游戏模式(1或2),0表示失败
*/
int load_game_from_file(const char *filename);
/**
* @brief 计算游戏评分
*/
void calculate_game_scores();
/**
* @brief 显示游戏评分结果和MVP评选
* @param game_mode 游戏模式(1-人机对战,2-双人对战)
*/
void display_game_scores(int game_mode);
#endif // RECORD_H
+93
View File
@@ -0,0 +1,93 @@
/**
* @file type.h
* @brief 五子棋游戏数据类型定义头文件
* @note 本文件集中定义了五子棋游戏中使用的所有数据结构和枚举类型
* @author 刘航宇
*/
#ifndef TYPE_H
#define TYPE_H
#include <stdbool.h>
#include <time.h>
#ifdef _WIN32
#include <winsock2.h>
#else
#define SOCKET int
#endif
// ==================== 游戏核心数据结构 ====================
/**
* @brief 记录一步棋的详细信息
*/
typedef struct {
int player; // 执行该步的玩家标识
int x; // 落子的行坐标 (0-based)
int y; // 落子的列坐标 (0-based)
} Step;
/**
* @brief 存储在特定方向上棋子连续性的信息
* @details 用于评估棋形,例如判断活三、冲四等关键形态
*/
typedef struct {
int continuous_chess; // 连续同色棋子的数量
bool check_start; // 棋子序列的起始端是否为空位(即是否开放)
bool check_end; // 棋子序列的末尾端是否为空位(即是否开放)
} DirInfo;
// ==================== AI相关数据结构 ====================
/**
* @brief 移动排序结构体
* @details 用于AI移动排序,存储候选移动及其评估分数
*/
typedef struct {
int x, y; // 位置坐标
int score; // 评估分数
} ScoredMove;
/**
* @brief 威胁类型枚举
* @details 用于AI威胁检测系统
*/
typedef enum {
THREAT_NONE = 0, // 无威胁
THREAT_WIN = 5, // 直接获胜
THREAT_FOUR = 4, // 活四/冲四
THREAT_THREE = 3, // 活三
THREAT_DOUBLE = 2, // 双威胁
THREAT_POTENTIAL = 1 // 潜在威胁
} ThreatLevel;
// ==================== 网络相关数据结构 ====================
/**
* @brief 网络消息结构
* @details 用于网络对战中的消息传输
*/
typedef struct {
int type; // 消息类型
int player_id; // 玩家ID
int x, y; // 坐标(用于落子)
char message[256]; // 消息内容(用于聊天等)
time_t timestamp; // 时间戳
} NetworkMessage;
/**
* @brief 网络游戏状态结构
* @details 用于管理网络游戏状态
*/
typedef struct {
SOCKET socket; // 套接字
bool is_server; // 是否为服务器
bool is_connected; // 是否已连接
int local_player_id; // 本地玩家ID
int remote_player_id; // 远程玩家ID
char remote_ip[16]; // 远程IP地址(MAX_IP_LENGTH = 16
int port; // 端口号
} NetworkGameState;
#endif // TYPE_H
+69
View File
@@ -0,0 +1,69 @@
/**
* @file ui.h
* @brief
* @note 本文件定义了用户界面相关的函数和数据结构。
* 它负责处理用户输入、显示游戏界面、提示信息等与用户交互的功能。
*/
#ifndef UI_H
#define UI_H
#include "gobang.h"
/**
* @brief UI模块 - 用户界面相关功能
* @author 刘航宇
* @date 2025-07-10
* @version 5.0
*/
/**
* @brief 显示游戏主菜单
*/
void display_main_menu();
/**
* @brief 显示棋盘
*/
void display_board();
/**
* @brief 显示游戏状态信息
* @param current_player 当前玩家
* @param step_count 当前步数
*/
void display_game_status(int current_player, int step_count);
/**
* @brief 显示获胜信息
* @param winner 获胜者
*/
void display_winner(int winner);
/**
* @brief 显示游戏设置菜单
*/
void display_settings_menu();
/**
* @brief 清屏函数
*/
void clear_screen();
/**
* @brief 暂停等待用户输入
* @param prompt 提示信息
*/
void pause_for_input(const char* prompt);
/**
* @brief 显示游戏规则
*/
void display_game_rules();
/**
* @brief 显示关于信息
*/
void display_about();
#endif // UI_H