重构输入处理:统一使用get_integer_input函数替换scanf

This commit is contained in:
2025-07-23 09:37:54 +08:00
parent 59c816767b
commit fbe4f5273c
5 changed files with 65 additions and 150 deletions
+21 -104
View File
@@ -146,27 +146,10 @@ void display_current_config()
void config_board_size() void config_board_size()
{ {
printf("\n当前棋盘大小: %d x %d\n", BOARD_SIZE, BOARD_SIZE); printf("\n当前棋盘大小: %d x %d\n", BOARD_SIZE, BOARD_SIZE);
printf("请输入新的棋盘大小 (%d-%d): ", MIN_BOARD_SIZE, MAX_BOARD_SIZE);
int new_size; int new_size = get_integer_input("请输入新的棋盘大小: ", MIN_BOARD_SIZE, MAX_BOARD_SIZE);
if (scanf("%d", &new_size) == 1) BOARD_SIZE = new_size;
{ printf("棋盘大小已设置为: %d x %d\n", BOARD_SIZE, BOARD_SIZE);
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');
}
} }
/** /**
@@ -175,19 +158,10 @@ void config_board_size()
void config_forbidden_moves() void config_forbidden_moves()
{ {
printf("\n当前禁手规则: %s\n", use_forbidden_moves ? "开启" : "关闭"); printf("\n当前禁手规则: %s\n", use_forbidden_moves ? "开启" : "关闭");
printf("是否启用禁手规则?(1=开启, 0=关闭): ");
int choice; int choice = get_integer_input("是否启用禁手规则?(1=开启, 0=关闭): ", 0, 1);
if (scanf("%d", &choice) == 1) use_forbidden_moves = (choice != 0);
{ printf("禁手规则已%s\n", use_forbidden_moves ? "开启" : "关闭");
use_forbidden_moves = (choice != 0);
printf("禁手规则已%s\n", use_forbidden_moves ? "开启" : "关闭");
}
else
{
printf("输入格式错误!\n");
while (getchar() != '\n');
}
} }
/** /**
@@ -196,36 +170,18 @@ void config_forbidden_moves()
void config_timer() void config_timer()
{ {
printf("\n当前计时器: %s\n", use_timer ? "开启" : "关闭"); printf("\n当前计时器: %s\n", use_timer ? "开启" : "关闭");
printf("是否启用计时器?(1=开启, 0=关闭): ");
int choice; int choice = get_integer_input("是否启用计时器?(1=开启, 0=关闭): ", 0, 1);
if (scanf("%d", &choice) == 1) use_timer = choice;
if (use_timer)
{ {
use_timer = choice; int new_limit = get_integer_input("请输入时间限制(分钟): ", 1, 999);
if (use_timer) time_limit = new_limit * 60; // 转换为秒数存储
{ printf("计时器已开启,时间限制: %d 分钟\n", time_limit / 60);
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");
}
} }
else else
{ {
printf("输入格式错误!\n"); printf("计时器已关闭\n");
while (getchar() != '\n');
} }
} }
@@ -238,45 +194,13 @@ void config_network()
printf("当前网络端口: %d\n", network_port); printf("当前网络端口: %d\n", network_port);
printf("当前网络超时: %d 毫秒\n", network_timeout); printf("当前网络超时: %d 毫秒\n", network_timeout);
printf("\n请输入新的网络端口 (%d-%d): ", MIN_NETWORK_PORT, MAX_NETWORK_PORT); int new_port = get_integer_input("请输入新的网络端口: ", MIN_NETWORK_PORT, MAX_NETWORK_PORT);
int new_port; network_port = new_port;
if (scanf("%d", &new_port) == 1) printf("网络端口已设置为: %d\n", network_port);
{
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');
}
printf("\n请输入网络超时时间(毫秒, 建议1000-10000): "); int new_timeout = get_integer_input("请输入网络超时时间(毫秒, 建议1000-10000): ", 1000, 60000);
int new_timeout; network_timeout = new_timeout;
if (scanf("%d", &new_timeout) == 1) printf("网络超时已设置为: %d 毫秒\n", network_timeout);
{
if (new_timeout > 0)
{
network_timeout = new_timeout;
printf("网络超时已设置为: %d 毫秒\n", network_timeout);
}
else
{
printf("无效的超时时间!\n");
}
}
else
{
printf("输入格式错误!\n");
while (getchar() != '\n');
}
} }
/** /**
@@ -292,14 +216,7 @@ void config_management_menu()
display_settings_menu(); display_settings_menu();
display_current_config(); display_current_config();
printf("请选择操作: "); choice = get_integer_input("请选择操作(0-5): ", 0, 5);
if (scanf("%d", &choice) != 1)
{
printf("输入格式错误!\n");
while (getchar() != '\n');
pause_for_input("按任意键继续...");
continue;
}
switch (choice) switch (choice)
{ {
@@ -318,7 +235,7 @@ void config_management_menu()
case 5: case 5:
printf("AI难度设置功能开发中...\n"); printf("AI难度设置功能开发中...\n");
break; break;
case 6: case 0:
save_game_config(); save_game_config();
return; return;
default: default:
+22 -22
View File
@@ -32,36 +32,36 @@
#define INPUT_SURRENDER -4 // 认输 #define INPUT_SURRENDER -4 // 认输
//---------- 游戏设置默认值 ----------// //---------- 游戏设置默认值 ----------//
#define DEFAULT_USE_FORBIDDEN_MOVES false // 默认不启用禁手规则 #define DEFAULT_USE_FORBIDDEN_MOVES false // 默认不启用禁手规则
#define DEFAULT_USE_TIMER 0 // 默认不启用计时器 #define DEFAULT_USE_TIMER 0 // 默认不启用计时器
#define DEFAULT_TIME_LIMIT 30 // 默认时间限制为30秒(内部存储) #define DEFAULT_TIME_LIMIT 30 // 默认时间限制为30秒(内部存储)
//---------- AI参数 ----------// //---------- AI参数 ----------//
#define DEFAULT_AI_DEPTH 5 // 默认AI搜索深度 #define DEFAULT_AI_DEPTH 5 // 默认AI搜索深度
#define DEFAULT_DEFENSE_COEFFICIENT 1.5 // 默认防守系数 #define DEFAULT_DEFENSE_COEFFICIENT 1.5 // 默认防守系数
//---------- 网络参数 ----------// //---------- 网络参数 ----------//
#define DEFAULT_NETWORK_PORT 8888 // 默认网络端口 #define DEFAULT_NETWORK_PORT 8888 // 默认网络端口
#define MIN_NETWORK_PORT 1024 // 最小网络端口 #define MIN_NETWORK_PORT 1024 // 最小网络端口
#define MAX_NETWORK_PORT 65535 // 最大网络端口 #define MAX_NETWORK_PORT 65535 // 最大网络端口
#define NETWORK_TIMEOUT_MS 5000 // 网络超时时间(毫秒) #define NETWORK_TIMEOUT_MS 5000 // 网络超时时间(毫秒)
#define NETWORK_BUFFER_SIZE 1024 // 网络缓冲区大小 #define NETWORK_BUFFER_SIZE 1024 // 网络缓冲区大小
// 网络配置 // 网络配置
#define DEFAULT_PORT 8888 // 默认端口(与DEFAULT_NETWORK_PORT保持一致) #define DEFAULT_PORT 8888 // 默认端口(与DEFAULT_NETWORK_PORT保持一致)
#define BUFFER_SIZE 1024 // 缓冲区大小(与NETWORK_BUFFER_SIZE保持一致) #define BUFFER_SIZE 1024 // 缓冲区大小(与NETWORK_BUFFER_SIZE保持一致)
#define MAX_IP_LENGTH 16 // 最大IP地址长度 #define MAX_IP_LENGTH 16 // 最大IP地址长度
// 网络消息类型 // 网络消息类型
#define MSG_MOVE 1 // 落子消息 #define MSG_MOVE 1 // 落子消息
#define MSG_CHAT 2 // 聊天消息 #define MSG_CHAT 2 // 聊天消息
#define MSG_SURRENDER 3 // 认输消息 #define MSG_SURRENDER 3 // 认输消息
#define MSG_UNDO_REQUEST 4 // 悔棋请求 #define MSG_UNDO_REQUEST 4 // 悔棋请求
#define MSG_UNDO_RESPONSE 5 // 悔棋回应 #define MSG_UNDO_RESPONSE 5 // 悔棋回应
#define MSG_GAME_START 6 // 游戏开始 #define MSG_GAME_START 6 // 游戏开始
#define MSG_GAME_END 7 // 游戏结束 #define MSG_GAME_END 7 // 游戏结束
#define MSG_HEARTBEAT 8 // 心跳包 #define MSG_HEARTBEAT 8 // 心跳包
#define MSG_DISCONNECT 9 // 断线消息 #define MSG_DISCONNECT 9 // 断线消息
//---------- 评分参数 ----------// //---------- 评分参数 ----------//
// 棋型评分 - 用于calculate_step_score函数 // 棋型评分 - 用于calculate_step_score函数
+1 -3
View File
@@ -289,10 +289,8 @@ void display_game_scores(int game_mode)
*/ */
void handle_save_record(int game_mode) void handle_save_record(int game_mode)
{ {
int save_choice = 0;
printf("===== 游戏结束 =====\n"); printf("===== 游戏结束 =====\n");
printf("是否保存游戏记录? (1-是, 0-否): "); int save_choice = get_integer_input("是否保存游戏记录? (1-是, 0-否): ", 0, 1);
scanf("%d", &save_choice);
if (save_choice == 1) if (save_choice == 1)
{ {
+20 -20
View File
@@ -23,9 +23,9 @@
* @brief 记录一步棋的详细信息 * @brief 记录一步棋的详细信息
*/ */
typedef struct { typedef struct {
int player; // 执行该步的玩家标识 int player; // 执行该步的玩家标识
int x; // 落子的行坐标 (0-based) int x; // 落子的行坐标 (0-based)
int y; // 落子的列坐标 (0-based) int y; // 落子的列坐标 (0-based)
} Step; } Step;
/** /**
@@ -33,9 +33,9 @@ typedef struct {
* @details 用于评估棋形,例如判断活三、冲四等关键形态 * @details 用于评估棋形,例如判断活三、冲四等关键形态
*/ */
typedef struct { typedef struct {
int continuous_chess; // 连续同色棋子的数量 int continuous_chess; // 连续同色棋子的数量
bool check_start; // 棋子序列的起始端是否为空位(即是否开放) bool check_start; // 棋子序列的起始端是否为空位(即是否开放)
bool check_end; // 棋子序列的末尾端是否为空位(即是否开放) bool check_end; // 棋子序列的末尾端是否为空位(即是否开放)
} DirInfo; } DirInfo;
// ==================== AI相关数据结构 ==================== // ==================== AI相关数据结构 ====================
@@ -45,8 +45,8 @@ typedef struct {
* @details 用于AI移动排序,存储候选移动及其评估分数 * @details 用于AI移动排序,存储候选移动及其评估分数
*/ */
typedef struct { typedef struct {
int x, y; // 位置坐标 int x, y; // 位置坐标
int score; // 评估分数 int score; // 评估分数
} ScoredMove; } ScoredMove;
/** /**
@@ -54,12 +54,12 @@ typedef struct {
* @details 用于AI威胁检测系统 * @details 用于AI威胁检测系统
*/ */
typedef enum { typedef enum {
THREAT_NONE = 0, // 无威胁 THREAT_NONE = 0, // 无威胁
THREAT_WIN = 5, // 直接获胜 THREAT_WIN = 5, // 直接获胜
THREAT_FOUR = 4, // 活四/冲四 THREAT_FOUR = 4, // 活四/冲四
THREAT_THREE = 3, // 活三 THREAT_THREE = 3, // 活三
THREAT_DOUBLE = 2, // 双威胁 THREAT_DOUBLE = 2, // 双威胁
THREAT_POTENTIAL = 1 // 潜在威胁 THREAT_POTENTIAL = 1 // 潜在威胁
} ThreatLevel; } ThreatLevel;
// ==================== 网络相关数据结构 ==================== // ==================== 网络相关数据结构 ====================
@@ -69,11 +69,11 @@ typedef enum {
* @details 用于网络对战中的消息传输 * @details 用于网络对战中的消息传输
*/ */
typedef struct { typedef struct {
int type; // 消息类型 int type; // 消息类型
int player_id; // 玩家ID int player_id; // 玩家ID
int x, y; // 坐标(用于落子) int x, y; // 坐标(用于落子)
char message[256]; // 消息内容(用于聊天等) char message[256]; // 消息内容(用于聊天等)
time_t timestamp; // 时间戳 time_t timestamp; // 时间戳
} NetworkMessage; } NetworkMessage;
/** /**
@@ -87,7 +87,7 @@ typedef struct {
int local_player_id; // 本地玩家ID int local_player_id; // 本地玩家ID
int remote_player_id; // 远程玩家ID int remote_player_id; // 远程玩家ID
char remote_ip[16]; // 远程IP地址(MAX_IP_LENGTH = 16 char remote_ip[16]; // 远程IP地址(MAX_IP_LENGTH = 16
int port; // 端口号 int port; // 端口号
} NetworkGameState; } NetworkGameState;
#endif // TYPE_H #endif // TYPE_H
+1 -1
View File
@@ -123,7 +123,7 @@ void display_settings_menu()
printf("3. 计时器设置\n"); printf("3. 计时器设置\n");
printf("4. 网络配置设置\n"); printf("4. 网络配置设置\n");
printf("5. AI难度设置\n"); printf("5. AI难度设置\n");
printf("6. 返回主菜单\n"); printf("0. 返回主菜单\n");
printf("==================\n"); printf("==================\n");
} }