From fbe4f5273c5db264c487396fffa2f06804fae6f5 Mon Sep 17 00:00:00 2001 From: LHY20 <3364451258@qq.com> Date: Wed, 23 Jul 2025 09:37:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=BE=93=E5=85=A5=E5=A4=84?= =?UTF-8?q?=E7=90=86=EF=BC=9A=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8get=5Fint?= =?UTF-8?q?eger=5Finput=E5=87=BD=E6=95=B0=E6=9B=BF=E6=8D=A2scanf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.c | 125 ++++++++++--------------------------------------------- config.h | 44 ++++++++++---------- record.c | 4 +- type.h | 40 +++++++++--------- ui.c | 2 +- 5 files changed, 65 insertions(+), 150 deletions(-) diff --git a/config.c b/config.c index 1d90e16..1bd9013 100644 --- a/config.c +++ b/config.c @@ -146,27 +146,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 +158,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 +170,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 +194,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 +216,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 +235,7 @@ void config_management_menu() case 5: printf("AI难度设置功能开发中...\n"); break; - case 6: + case 0: save_game_config(); return; default: diff --git a/config.h b/config.h index 50f87f0..29cfd1f 100644 --- a/config.h +++ b/config.h @@ -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搜索深度 -#define DEFAULT_DEFENSE_COEFFICIENT 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函数 diff --git a/record.c b/record.c index 468f337..5732280 100644 --- a/record.c +++ b/record.c @@ -289,10 +289,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) { diff --git a/type.h b/type.h index 7c36243..ebab0b1 100644 --- a/type.h +++ b/type.h @@ -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 \ No newline at end of file diff --git a/ui.c b/ui.c index 53f36da..a0301ca 100644 --- a/ui.c +++ b/ui.c @@ -123,7 +123,7 @@ void display_settings_menu() printf("3. 计时器设置\n"); printf("4. 网络配置设置\n"); printf("5. AI难度设置\n"); - printf("6. 返回主菜单\n"); + printf("0. 返回主菜单\n"); printf("==================\n"); }