使用 Borland BGI 圖形庫(graphics.h)繪製可互動的類比時鐘:
gettime/settime),三針動態轉動。錶盤中心 (Cx, Cy),半徑 R,角度 θ(弧度,12 點鐘方向為 0,順時針增加):
x = Cx + R * sin(θ)
y = Cy - R * cos(θ) // 螢幕座標 Y 軸向下
θ = value / 30 * PI(60 格對應 2π)。θ = (hour*60 + min) / 360 * PI(12 小時對應 2π,含分針微調)。setwritemode(XOR_PUT); // 1: XOR 模式
// 繪製秒針
line(Cx, Cy, sec_x, sec_y);
// 等待下一秒...
// 再次繪製同一條線 → 因 XOR 特性自動擦除
line(Cx, Cy, sec_x, sec_y);
無需重繪整個錶面,極大降低閃爍與 CPU 佔用。
bioskey 非阻塞輪詢while (hour==cur_h && min==cur_m && sec==cur_s) {
gettime(&t);
if (bioskey(1)) { // 檢查鍵盤緩衝區
int key = bioskey(0); // 讀取鍵值
count = KeyHandle(key, count); // 處理調整邏輯
}
}
鍵值定義:Up=0x4800、Down=0x5000、Tab=0x0F09、Esc=0x011B(掃描碼 << 8 | ASCII)。
| 函數 | 功能 |
|---|---|
main() | 初始化圖形模式、繪製靜態介面、啟動時鐘主循環 |
ClockHandle() | 核心動畫循環:繪製/擦除秒針、檢測分時變更、鍵盤輪詢 |
DigitalHour/Minute/Second() | 將數值轉為整數(單純返回參數,可簡化) |
DigitalClock(x,y,val) | 在指定位置以數位字體顯示時間分量 |
KeyHandle/Up_Key/Down_Key | 鍵盤事件分發與時間調整(呼叫 settime 寫入硬體) |
DrawCursor/ClearCursor | 調整模式下的游標繪製/清除 |
graphics.lib,且 initgraph 路徑指向 BGI 驅動檔目錄。若在現代 OS 開發,建議改用 SDL2、SFML、Raylib 或 Windows GDI/Direct2D:
QueryPerformanceCounter/clock_gettime)驅動每幀重繪。SDL_PollEvent/WM_KEYDOWN)。本程式作為「C 語言圖形程式設計入門」與「即時動畫基礎技巧」的經典教學範例,仍具參考價值。