You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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变量,导致后续每一次循环都会执行指针切换逻辑。

具体过程

  1. 初始状态:指针指向白方时间(mp=&wmin,sp=&wsec)
  2. 第一次按l:cc='l',执行切换,指针转向黑方
  3. 由于cc未被重置,下一次循环会再次执行切换逻辑,指针切回白方
  4. 后续每一次循环都会重复切换指针的操作,导致白方和黑方的时间被交替递减,视觉上表现为“同时递减”

修复方案

在执行完指针切换后,将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直观;计时逻辑的顺序(打印→休眠→减时)容易让人混淆
  • 边界情况未处理:未判断时间耗尽(分钟为负)的终止逻辑

优化建议

  1. 拆分函数:将菜单选择、计时循环拆分为select_time_control()、run_chess_clock()等独立函数
  2. 宏定义常量:用#define SWITCH_KEY 'l'、BLITZ_3MIN 3等宏替代硬编码值
  3. 重命名变量:让变量名直接表达用途,如white_sec、black_min
  4. 替换三元运算符:用if-else重构秒数递减逻辑,提升可读性
  5. 添加注释:为核心逻辑块、关键变量添加说明注释

内容的提问来源于stack exchange,提问作者Leonardo Contreras

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:54:54