C语言国际象棋时钟开发求助:按键切换后双方计时同时递减
国际象棋时钟代码问题排查与可读性评级
问题描述
我用C语言开发了一款国际象棋时钟,但第三次按下按键l切换计时方后,双方的计时开始同时递减。我认为自己已正确切换指针,请求帮忙排查问题,同时请对代码的可读性进行评级。
代码实现
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<stdbool.h> #include<time.h> #include<string.h> #include<windows.h> const int milisec = 1000; int main() { char cc = '\0'; int wsec, wmin, bsec, bmin, choice; wsec = 0; bsec = 0; int* mp = &wmin; int* sp = &wsec; do { printf("\nReloj de Ajedrez de Leo, seleccione un ritmo de juego:\n"); printf("1.-Blitz (3:00)\n"); printf("2.-Blitz (5:00)\n"); printf("3.-Rapida (10:00)"); printf("\nSeleccione su opcion:"); scanf("%d", &choice); system("cls"); switch (choice) { case 1: wmin = 3; bmin = 3; break; case 2: wmin = 5; bmin = 5; break; case 3: wmin = 10, bmin = 10; break; default: printf("\nOpcion Incorrecta, seleccione nuevamente.\n"); } } while (choice > 3 || choice < 1); while (true) { if (kbhit()) { cc = getch(); } printf("\nWHITE: %d:%d BLACK: %d:%d", wmin, wsec, bmin, bsec); Sleep(milisec); if (*sp == 0) { --*mp; } //////////////////////////////////////////////WHY ? *sp == 0 ? *sp = 59 : --*sp; system("cls"); if (cc == 'l') { mp == &wmin ? mp = &bmin : mp = &wmin; sp == &wsec ? sp = &bsec : sp = &wsec; } } return 0; }
问题排查
核心问题
按下l切换计时方后,没有重置cc变量,导致后续每一次循环都会执行指针切换逻辑。
具体过程
- 初始状态:指针指向白方时间(
mp=&wmin,sp=&wsec) - 第一次按
l:cc='l',执行切换,指针转向黑方 - 由于
cc未被重置,下一次循环会再次执行切换逻辑,指针切回白方 - 后续每一次循环都会重复切换指针的操作,导致白方和黑方的时间被交替递减,视觉上表现为“同时递减”
修复方案
在执行完指针切换后,将cc重置为初始值'\0',确保只有按下l的那次循环才会切换指针:
if (cc == 'l') { mp == &wmin ? mp = &bmin : mp = &wmin; sp == &wsec ? sp = &bsec : sp = &wsec; cc = '\0'; // 重置按键变量 }
可读性评级:C-
扣分点
- 变量命名模糊:
mp、sp这类缩写没有明确含义,应改为current_min_ptr、current_sec_ptr这类直观名称 - 注释缺失:仅在疑惑处加了
WHY ?注释,核心逻辑(如按键功能、计时规则)无说明 - 代码结构臃肿:菜单选择、计时逻辑全部堆在
main函数中,未拆分独立函数 - 魔法值硬编码:按键
l、时间选项3/5/10未用宏定义,后续修改不便 - 逻辑可读性差:用三元运算符处理秒数递减,不如
if-else直观;计时逻辑的顺序(打印→休眠→减时)容易让人混淆 - 边界情况未处理:未判断时间耗尽(分钟为负)的终止逻辑
优化建议
- 拆分函数:将菜单选择、计时循环拆分为
select_time_control()、run_chess_clock()等独立函数 - 宏定义常量:用
#define SWITCH_KEY 'l'、BLITZ_3MIN 3等宏替代硬编码值 - 重命名变量:让变量名直接表达用途,如
white_sec、black_min - 替换三元运算符:用
if-else重构秒数递减逻辑,提升可读性 - 添加注释:为核心逻辑块、关键变量添加说明注释
内容的提问来源于stack exchange,提问作者Leonardo Contreras
相关产品推荐
相关产品推荐

