首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux ncurses 實作貪吃蛇遊戲:終端機圖形界面、信號驅動移動與碰撞偵測

     編輯:關於C語言

Linux ncurses 實作貪吃蛇遊戲:終端機圖形界面、信號驅動移動與碰撞偵測

ncurses 核心概念

  • 提供終端機無關的游標控制、色彩、鍵盤非阻塞輸入。
  • 兩個虛擬螢幕:stdscr (邏輯/更新緩衝)、curscr (物理/顯示緩衝)。refresh() 將邏輯複製到物理。
  • 常用函數:initscr(), cbreak(), noecho(), keypad(stdscr,TRUE), getch(), mvaddch(), mvprintw()。

遊戲架構

  1. 資料結構:環狀佇列 (大陣列) 儲存蛇身座標 (row,col),頭尾指標。
  2. 移動驅動:SIGALRM 定時信號 (預設 200ms) 觸發移動函數 gogo()。主迴圈阻塞於 getch() 處理按鍵。
  3. 方向控制:按鍵更新 g_key_forward,移動時複製到 real_g_forward,防止 180 度反向。
  4. 碰撞檢測:牆壁、自身、食物。食物隨機生成避開蛇身。
  5. 升級機制:吃滿特定數量加速 (縮短 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

特色

  • 終端機原生,SSH 遠程也能完美運行 (如 vim)。
  • 無閃爍 (雙緩衝)、低資源佔用。
  • 信號驅動分離輸入與遊戲邏輯,單執行緒並發模型。

完整原始碼包含 tanchishe.c, init_tcs.c, tanchishe.h,可直接編譯學習。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved