stdscr (邏輯/更新緩衝)、curscr (物理/顯示緩衝)。refresh() 將邏輯複製到物理。initscr(), cbreak(), noecho(), keypad(stdscr,TRUE), getch(), mvaddch(), mvprintw()。(row,col),頭尾指標。SIGALRM 定時信號 (預設 200ms) 觸發移動函數 gogo()。主迴圈阻塞於 getch() 處理按鍵。g_key_forward,移動時複製到 real_g_forward,防止 180 度反向。ticker)。// 信號處理:移動一步
void gogo(int sig) {
int dir = g_key_forward;
move_snake(dir);
check_collision();
}
// 移動:更新頭座標,佇列 push 頭、pop 尾
void move_snake(int dir) {
// 根據 dir 更新 row/col
mvaddstr(tail_row, tail_col, " "); // 擦除尾
snake[++head].row = row; snake[head].col = col; // push 頭
mvaddstr(row, col, "#"); // 繪製頭
refresh();
}
// 主迴圈
int main() {
initscr(); cbreak(); noecho(); keypad(stdscr,TRUE); curs_set(0);
init_game();
signal(SIGALRM, gogo); set_ticker(200);
while(1) { int ch=getch(); handle_key(ch); }
endwin(); return 0;
}
gcc snake.c -o snake -lncurses
./snake
完整原始碼包含 tanchishe.c, init_tcs.c, tanchishe.h,可直接編譯學習。