| 函數 | 作用範圍 | 光標行為 | 備註 |
|---|---|---|---|
int clear(void) | 整個標準畫面 | 移至 (0,0) | 自動呼叫 clearok(),強制下次 refresh() 重繪物理屏幕,清除 curses 無法追蹤的殘留字符 |
int erase(void) | 整個標準畫面 | 不動 | 僅清除 curses 內部緩衝區,**不**呼叫 clearok(),速度較快但可能留下殘影 |
int clrtobot(void) | 當前光標至屏幕底部 | 不動 | 包含當前行光標右側所有字符及之後所有行 |
int clrtoeol(void) | 當前光標至行尾 | 不動 | 僅清除當前行光標位置及右側字符 |
int wclear(WINDOW *win) | 指定窗口 | 移至窗口 (0,0) | 窗口版 clear() |
int werase(WINDOW *win) | 指定窗口 | 不動 | 窗口版 erase() |
int wclrtobot(WINDOW *win) | 窗口光標至窗口底部 | 不動 | |
int wclrtoeol(WINDOW *win) | 窗口光標至窗口行尾 | 不動 |
clear() / wclear()(最徹底)。erase() / werase()(無 clearok() 開銷)。move(y, x); clrtoeol(); 或 wmove(win, y, x); wclrtoeol(win);。clrtobot() / wclrtobot()。#include <curses.h>
#include <unistd.h>
#define WIDTH 60
#define HEIGHT 20
int main() {
initscr(); cbreak(); noecho(); curs_set(0); keypad(stdscr, TRUE);
nodelay(stdscr, TRUE); // 非阻塞輸入
WINDOW *game_win = newwin(HEIGHT, WIDTH, 2, 5);
box(game_win, 0, 0);
int x = 1, y = 1, dx = 1, dy = 1;
int ch;
while ((ch = getch()) != 'q') {
// 1. 清除上一幀軌跡(僅清除小球區域更高效,此處示範全窗口)
werase(game_win);
box(game_win, 0, 0); // 重繪邊框
// 2. 更新位置
x += dx; y += dy;
if (x <= 1 || x >= WIDTH-2) dx = -dx;
if (y <= 1 || y >= HEIGHT-2) dy = -dy;
// 3. 繪製新幀
mvwaddch(game_win, y, x, 'O');
// 4. 刷新
wrefresh(game_win);
usleep(30000); // 30ms ~ 33 FPS
}
delwin(game_win);
endwin();
return 0;
}
clearok(stdscr, TRUE) 配合 refresh(),或改用 ncurses 的 newterm/set_term 實現雙緩衝。wclrtoeol 逐行清除,比 werase 快數倍。clear() 會重置屬性;若需保留底色/邊框屬性,先 wbkgdset(win, ' ' | COLOR_PAIR(n)) 再 werase。clear() 可能較慢,建議統一用 werase + 手動重繪邊框/背景。參考來源:「暗日」博客 原文連結