← 都来码 / Dolaima← 例程索引c/old/old_gfx_bgi.c原文

c/old/old_gfx_bgi.c · 4871 字节 · 下载原文

/* old_gfx_bgi.c —— **原样的 BGI 程序**(图形界面)
 * old_gfx_bgi.c -- **a BGI program left exactly as it was** (graphical window)
 *
 * 类别:graphic
 * Category: graphic
 * 兼容面:`graphics.h` 整条 (BGI) —— `initgraph` / `closegraph` / `cleardevice`
 * Compatibility: the whole `graphics.h` (BGI) route -- `initgraph` / `closegraph` / `cleardevice`
 *         / `setcolor` / `setfillstyle` / `line` / `moveto` / `lineto` / `rectangle`
 *         / `bar` / `bar3d` / `circle` / `fillellipse` / `drawpoly` / `fillpoly`
 *         / `outtextxy` / `getmaxx` / `getmaxy` / `delay` / `kbhit` / `getch`
 *
 * ## 这个文件的写法是**刻意的**
 * ## This file is written the way it is **on purpose**
 *
 * 它按 Turbo C / Borland C++ 时代老图形程序的原貌写:**不 include 任何平台专有头**
 * It follows the original look of Turbo C / Borland C++ era graphics programs: **no platform-specific header is included**
 * (只用 `graphics.h` 与 `conio.h`)、不用 C99 之后的语法、变量都在函数开头声明、
 * (only `graphics.h` and `conio.h` are used), no post-C99 syntax, all variables declared at the top of the function,
 * 颜色一律写调色板**索引**(`RED` / `LIGHTGREEN`,而不是 RGB)。
 * colors are always written as palette **indexes** (`RED` / `LIGHTGREEN`, not RGB).
 *
 * 它的作用是**当判据**:这份源码能不能一行不改地编过、跑出画面 ——
 * Its role is to **serve as the criterion**: whether this source compiles unchanged and draws a picture --
 * 就是 `Lib/c/graphics.h` 这层转接是否成立的唯一标准。
 * that is the only standard for whether the `Lib/c/graphics.h` shim layer works.
 *
 * 手机上跑:`vml run examples/c/old/old_gfx_bgi.c`
 * On the phone: `vml run examples/c/old/old_gfx_bgi.c`
 */
#include <vml_ui.h>
#include <graphics.h>
#include <conio.h>

int main(void)
{
    int gd = DETECT;
    int gm;
    int i;
    int lang;       /* 界面语言:开局查一次 */
                    /* UI language: queried once at start */
    int tri[8];     /* 顶点数组必须是**具名数组**:复合字面量本前端不支持(2026-10-04 复验:现在直接编译报错,不再静默) */
                    /* The vertex array must be a **named array**: compound literals are unsupported (re-checked 2026-10-04: now a compile error, no longer silent) */

    /* ── 老程序的标准开场 ── */
    /* -- The standard opening of an old program -- */
    lang = ui_scr_get_language();
    initgraph(&gd, &gm, "");
    cleardevice();

    /* ── 画个坐标系,看看 getmaxx/getmaxy 报得对不对 ── */
    /* -- Draw a coordinate system to see whether getmaxx/getmaxy report the right values -- */
    setcolor(DARKGRAY);
    line(0, getmaxy() / 2, getmaxx(), getmaxy() / 2);
    line(getmaxx() / 2, 0, getmaxx() / 2, getmaxy());

    /* ── 三种线:直线、moveto/lineto 折线 ── */
    /* -- Three kinds of lines: a straight line, and moveto/lineto polylines -- */
    setcolor(LIGHTGREEN);
    line(10, 10, 200, 10);

    setcolor(LIGHTCYAN);
    moveto(10, 30);
    for (i = 0; i < 10; i++)
        lineto(10 + i * 18, 30 + (i % 2) * 14);

    /* ── 矩形与实心条 ── */
    /* -- Rectangles and filled bars -- */
    setcolor(YELLOW);
    rectangle(10, 70, 120, 130);

    setfillstyle(SOLID_FILL, RED);
    bar(140, 70, 250, 130);

    setfillstyle(SOLID_FILL, MAGENTA);
    bar3d(270, 70, 380, 130, 8, 1);

    /* ── 圆与椭圆(填充色由 setfillstyle 决定)── */
    /* -- Circle and ellipse (the fill color is decided by setfillstyle) -- */
    setcolor(WHITE);
    circle(80, 210, 40);

    setfillstyle(SOLID_FILL, LIGHTBLUE);
    fillellipse(220, 210, 55, 35);

    /* ── 多边形 ── */
    /* -- Polygons -- */
    tri[0] = 320; tri[1] = 250;
    tri[2] = 260; tri[3] = 170;
    tri[4] = 380; tri[5] = 170;
    tri[6] = 320; tri[7] = 250;
    setfillstyle(SOLID_FILL, LIGHTGREEN);
    fillpoly(4, tri);

    /* ── 文字(BGI 的 outtextxy 收的是左上角坐标)── */
    /* -- Text (BGI's outtextxy takes the top-left corner coordinates) -- */
    setcolor(WHITE);
    outtextxy(10, 270, lang == 0 ? "BGI 兼容层:initgraph / line / bar / circle / fillpoly"
                                : "BGI shim: initgraph / line / bar / circle / fillpoly");

    /* ── 老程序收尾:等一个键再退 ── */
    /* -- Old-program ending: wait for one key before exiting -- */
    outtextxy(10, 300, lang == 0 ? "按任意键退出(手机上点一下画面)"
                                : "Press any key to exit (tap the screen on a phone)");
    getch();
    closegraph();
    return 0;
}