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

C語言終端圖形編程:可移動邊框與約束點實現

     編輯:關於C語言

C語言終端圖形編程:可移動邊框與約束點實現

功能描述

  • 終端繪製矩形邊框,指定原點座標與寬高
  • 邊框內一個點(*),可用W/A/S/D鍵移動
  • 點不能超出邊框邊界
  • 實時刷新顯示,按Ctrl+C退出

核心技術:終端原始模式

typedef struct { int x, y; } Point;

int main() {
    int width, height, origin_x, origin_y;
    // 輸入邊框參數...
    
    Point box_origin = {origin_x, origin_y};
    Point box_size = {width, height};
    Point dot = {origin_x + 5, origin_y + 5};  // 初始點位置
    
    term_init();
    system("clear");
    draw_frame(&box_origin, &box_size, &dot);
    
    char c;
    while (read(STDIN_FILENO, &c, 1) == 1) {
        Point new_dot = dot;
        switch (c) {
            case 'w': case 'W': if (dot.y > box_origin.y + 1) new_dot.y--; break;
            case 's': case 'S': if (dot.y < box_origin.y + box_size.y - 2) new_dot.y++; break;
            case 'a': case 'A': if (dot.x > box_origin.x + 1) new_dot.x--; break;
            case 'd': case 'D': if (dot.x < box_origin.x + box_size.x - 2) new_dot.x++; break;
            case 'q': case 'Q': goto exit_loop;
        }
        dot = new_dot;
        system("clear");
        draw_frame(&box_origin, &box_size, &dot);
    }
exit_loop:
    term_restore();
    return 0;
}

void draw_frame(Point *o, Point *sz, Point *dot) {
    for (int y = o->y; y < o->y + sz->y; y++) {
        for (int x = o->x; x < o->x + sz->x; x++) {
            bool is_border = (y == o->y || y == o->y + sz->y - 1 || 
                              x == o->x || x == o->x + sz->x - 1);
            bool is_dot = (x == dot->x && y == dot->y);
            putchar(is_border || is_dot ? '*' : ' ');
        }
        putchar('\n');
    }
}

關鍵點解析

  1. 邊界檢查:dot.x > origin.x + 1 確保不覆蓋左邊框(+1跳過邊框列)
  2. system("clear"):跨平台清屏(Linux/macOS),Windows用system("cls")
  3. termios 設置:VMIN=1, VTIME=0實現阻塞單字符讀取
  4. 座標系:終端(0,0)在左上角,x向右,y向下

改進方向

  • 用ncurses替代system("clear"),無閃爍、高效刷新
  • 用select()或非阻塞IO實現定時自動更新/動畫
  • 支持鼠標事件(需終端支持X10/X11鼠標協議)
  • 封裝為可復用的TerminalUI庫

總結

通過termios切換終端到原始模式,配合system("clear")重繪,實現了交互式終端圖形程序。這是理解終端控制、原始輸入、座標繪製、邊界約束的優秀入門項目,也是ncurses、vim、tmux等工具的核心原理縮影。

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