傳統 cls 或 clrscr() 僅提供瞬間清屏,缺乏視覺美感。本文提供六種藝術清屏子函數,透過光標定位與逐字符覆蓋空格,實現開屏、閉幕、上掃、下掃、矩形邊框、中心擴散等動態效果,適合 DOS 時代字符界面程式的視覺強化。
goto_xy使用 BIOS 中斷 0x10 功能 2(設置光標位置),參數為行 dh、列 dl,頁碼 bh=0。
void goto_xy(int x, int y) {
union REGS r;
r.h.ah = 2;
r.h.dl = y; // 列
r.h.dh = x; // 行
r.h.bh = 0;
int86(0x10, &r, &r);
}
puta將整個 24×79 文字模式螢幕填入字符 'a',供清屏動畫演示對比。
zcls —— 由中心向四角擴散根據螢幕長寬比,計算擴散步數 d,從中心矩形逐層向外呼叫 recls 清除矩形邊框,形成同心矩形收縮動畫。
recls —— 周邊逐行/列掃描依序清除左、右兩直欄(上→下),再清除上、下兩橫列(左→右),每步 delay(10) 產生動畫感。
kcls —— 上下同時向中間展開從垂直中心線 t/s 起始,雙向向上/下掃描每一行,逐列寫入空格,呈現「雙頁打開」效果。
bcls —— 上下同時向兩側收合從頂底 t=y1, s=y2 向中間推進,逐行清除,模擬「雙頁合上」動畫。
dcls —— 從右向左、由上而下掃描外層列遞減 j=x2→x1,內層行遞增 i=y1→y2,逐點寫空格,形成「右上角掃向左下」的掃描線效果。
main() {
puta(); getch(); // 填滿 'a'
dcls(0,4,0,79); getch(); // 自下清屏前 4 行
puta(); getch();
bcls(0,25,0,79); getch(); // 閉幕式全屏
puta(); getch();
zcls(0,25,0,79); getch(); // 中心擴散全屏
}
goto_xy + putchar(' ') + delay 組合。x 為行 (0~24),y 為列 (0~79),對應 BIOS 中斷慣例。<dos.h>、<conio.h> 以使用 int86、delay、getch。SetConsoleCursorPosition) 移植。可進一步封裝為通用動畫引擎:傳入矩形區域、幀回調函數、幀間隔,支援任意字符、顏色漸變、非矩形路徑(圓形、對角線)等更豐富的視覺特效。