找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 698|回复: 10

16数字集

[复制链接]
发表于 2025-12-6 15:34:09 | 显示全部楼层 |阅读模式
本帖最后由 zzz19760225 于 2026-1-26 08:46 编辑

1234567890a,;:.(小数点不在16数字集层面考虑,而是作为载体层面上,再次十进制表达十进制里表现。又或者增加小数点.和中文句号。)
全组合的内容。1名实相对关系里选择定义的制标准单元,2单元组合的排序排列全组合地图,3地图上的选择全组合,4选择全组合里的万物生物动物人类需求循环自转的各种规律选择集合。
 楼主| 发表于 2025-12-6 15:42:15 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-6 16:42 编辑

通义:linux mint22.2 C语言SDL2建立3X5点阵,二维数组代表,二维数组的15个值为单元全组合,依次显示每个组合内容的点阵效应。不用字符,每行中文注释。
修正一个SDL_CreateWindow 函数调用语法错误
直接使用 SDL_WINDOWPOS_CENTERED
文件dotmatrix.c

  1. // 引入标准输入输出库
  2. #include <stdio.h>
  3. // 引入标准库(用于延时等)
  4. #include <stdlib.h>
  5. // 引入SDL2图形库
  6. #include <SDL2/SDL.h>

  7. // 定义点阵宽度(列数)
  8. #define WIDTH 3
  9. // 定义点阵高度(行数)
  10. #define HEIGHT 5
  11. // 定义每个点的像素大小(方便可视化)
  12. #define DOT_SIZE 40
  13. // 定义窗口宽度(含边距)
  14. #define WINDOW_WIDTH (WIDTH * DOT_SIZE + 20)
  15. // 定义窗口高度(含边距)
  16. #define WINDOW_HEIGHT (HEIGHT * DOT_SIZE + 20)
  17. // 定义每帧显示时间(毫秒)
  18. #define FRAME_DELAY 100

  19. // 主函数
  20. int main(int argc, char* argv[])
  21. {
  22.     // 初始化SDL系统
  23.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  24.         printf("无法初始化SDL:%s\n", SDL_GetError());
  25.         return -1;
  26.     }

  27.     // 创建窗口
  28.     SDL_Window* window = SDL_CreateWindow(
  29.         "3x5点阵全组合演示",               // 窗口标题
  30.         SDL_WINDOWPOS_CENTERED,          // 横向居中
  31.         SDL_WINDOWPOS_CENTERED,          // 纵向居中
  32.         WINDOW_WIDTH,                    // 窗口宽度
  33.         WINDOW_HEIGHT,                   // 窗口高度
  34.         SDL_WINDOW_SHOWN                 // 显示窗口
  35.     );
  36.     if (!window) {
  37.         printf("无法创建窗口:%s\n", SDL_GetError());
  38.         SDL_Quit();
  39.         return -1;
  40.     }

  41.     // 创建渲染器
  42.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  43.     if (!renderer) {
  44.         printf("无法创建渲染器:%s\n", SDL_GetError());
  45.         SDL_DestroyWindow(window);
  46.         SDL_Quit();
  47.         return -1;
  48.     }

  49.     // 定义点阵二维数组(初始为0)
  50.     int dot[HEIGHT][WIDTH] = {0};

  51.     // 总组合数:2的15次方
  52.     const int total = 1 << (WIDTH * HEIGHT); // 即32768

  53.     // 遍历所有组合(从0到32767)
  54.     for (int combo = 0; combo < total; combo++) {
  55.         // 清空屏幕为白色背景
  56.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  57.         SDL_RenderClear(renderer);

  58.         // 将当前组合编号转换为点阵状态
  59.         int temp = combo;
  60.         for (int y = 0; y < HEIGHT; y++) {
  61.             for (int x = 0; x < WIDTH; x++) {
  62.                 dot[y][x] = temp & 1;      // 取最低位作为该点状态(0或1)
  63.                 temp >>= 1;                // 右移一位处理下一点
  64.             }
  65.         }

  66.         // 绘制点阵
  67.         for (int y = 0; y < HEIGHT; y++) {
  68.             for (int x = 0; x < WIDTH; x++) {
  69.                 if (dot[y][x]) {
  70.                     // 若该点为1,则绘制黑色实心矩形
  71.                     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
  72.                 } else {
  73.                     // 若该点为0,则绘制浅灰色填充(可清晰看到灭点)
  74.                     SDL_SetRenderDrawColor(renderer, 220, 220, 220, 255);
  75.                 }
  76.                 // 计算矩形位置(加边距10像素)
  77.                 SDL_Rect rect = {
  78.                     10 + x * DOT_SIZE,
  79.                     10 + y * DOT_SIZE,
  80.                     DOT_SIZE - 2,  // 留1像素间隙
  81.                     DOT_SIZE - 2
  82.                 };
  83.                 SDL_RenderFillRect(renderer, &rect);
  84.             }
  85.         }

  86.         // 更新屏幕显示
  87.         SDL_RenderPresent(renderer);

  88.         // 处理退出事件(如点击关闭按钮)
  89.         SDL_Event event;
  90.         while (SDL_PollEvent(&event)) {
  91.             if (event.type == SDL_QUIT) {
  92.                 goto cleanup; // 跳出循环并清理资源
  93.             }
  94.         }

  95.         // 延迟一段时间以便观察
  96.         SDL_Delay(FRAME_DELAY);
  97.     }

  98. cleanup:
  99.     // 释放渲染器资源
  100.     SDL_DestroyRenderer(renderer);
  101.     // 释放窗口资源
  102.     SDL_DestroyWindow(window);
  103.     // 关闭SDL系统
  104.     SDL_Quit();

  105.     // 程序正常结束
  106.     return 0;
  107. }
复制代码
gcc -o dotmatrix dotmatrix.c -lSDL2
./dotmatrix
或鼠标双击dotmatrix
可以运行,产生一个页面黑色和灰色相对的快速组合递增,类似二进制有序堆积。
下面需要抽出这些组合,排序,在排序的序数序号中,提取使用4位01的16个点阵字符对应组合数组。(要不要过一百遍呢?)
所有 32768 种亮灭组合,只要其中的16种。余下的作为点阵牌使用,人怎么调用点阵牌呢。
通过指针,将3万组合里的16个提出来,怎么使用。
并行一个15点阵的线条,三个点阵为一线段,点阵需求的位置,可以相对二进制数量算出来。不需要自己算,让自动信息安排这个程序功能,点击点阵,就汇总出二进制数量。
需要手工点击点阵尝试点阵组合的各种样子,找个人认为不错的组合,然后获取对应显示的序数序号,在另一个输入框里输入,就可以调用。手工寻找,输入框再现点阵组合。
 楼主| 发表于 2025-12-6 17:16:15 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-6 17:39 编辑

通义:在上面的程序继续修改,鼠标左键点击点阵就变黑,再点击就变白,汇总显示黑色点阵所代表的数。

dotmatrix5.c

  1. // 引入标准输入输出库
  2. #include <stdio.h>
  3. // 引入标准库(用于字符串等)
  4. #include <stdlib.h>
  5. // 引入SDL2图形库
  6. #include <SDL2/SDL.h>

  7. // 定义点阵宽度(列数)
  8. #define WIDTH 3
  9. // 定义点阵高度(行数)
  10. #define HEIGHT 5
  11. // 定义每个点的像素大小
  12. #define DOT_SIZE 60
  13. // 定义边距
  14. #define MARGIN 20
  15. // 定义窗口宽度
  16. #define WINDOW_WIDTH (WIDTH * DOT_SIZE + 2 * MARGIN)
  17. // 定义窗口高度
  18. #define WINDOW_HEIGHT (HEIGHT * DOT_SIZE + 2 * MARGIN)
  19. // 定义每帧刷新间隔(毫秒)
  20. #define FRAME_DELAY 50

  21. // 主函数
  22. int main(int argc, char* argv[])
  23. {
  24.     // 初始化SDL系统
  25.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  26.         printf("无法初始化SDL:%s\n", SDL_GetError());
  27.         return -1;
  28.     }

  29.     // 创建窗口(初始标题)
  30.     SDL_Window* window = SDL_CreateWindow(
  31.         "数值: 0",
  32.         SDL_WINDOWPOS_CENTERED,
  33.         SDL_WINDOWPOS_CENTERED,
  34.         WINDOW_WIDTH,
  35.         WINDOW_HEIGHT,
  36.         SDL_WINDOW_SHOWN
  37.     );
  38.     if (!window) {
  39.         printf("无法创建窗口:%s\n", SDL_GetError());
  40.         SDL_Quit();
  41.         return -1;
  42.     }

  43.     // 创建渲染器
  44.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  45.     if (!renderer) {
  46.         printf("无法创建渲染器:%s\n", SDL_GetError());
  47.         SDL_DestroyWindow(window);
  48.         SDL_Quit();
  49.         return -1;
  50.     }

  51.     // 点阵状态数组(0=灭,1=亮)
  52.     int dot[HEIGHT][WIDTH] = {0};

  53.     // 主循环标志
  54.     int running = 1;

  55.     // 事件结构体
  56.     SDL_Event event;

  57.     while (running) {
  58.         // 处理所有待处理事件
  59.         while (SDL_PollEvent(&event)) {
  60.             if (event.type == SDL_QUIT) {
  61.                 running = 0;
  62.             }
  63.             // 处理鼠标左键点击
  64.             else if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) {
  65.                 int mouse_x = event.button.x;
  66.                 int mouse_y = event.button.y;

  67.                 // 转换为点阵坐标(减去边距)
  68.                 int grid_x = (mouse_x - MARGIN) / DOT_SIZE;
  69.                 int grid_y = (mouse_y - MARGIN) / DOT_SIZE;

  70.                 // 检查是否在有效范围内
  71.                 if (grid_x >= 0 && grid_x < WIDTH && grid_y >= 0 && grid_y < HEIGHT) {
  72.                     // 切换该点状态
  73.                     dot[grid_y][grid_x] = 1 - dot[grid_y][grid_x];
  74.                 }
  75.             }
  76.         }

  77.         // 计算当前点阵对应的整数值
  78.         unsigned int value = 0;
  79.         int bit_index = 0;
  80.         for (int y = 0; y < HEIGHT; y++) {
  81.             for (int x = 0; x < WIDTH; x++) {
  82.                 if (dot[y][x]) {
  83.                     value |= (1U << bit_index);  // 设置第 bit_index 位
  84.                 }
  85.                 bit_index++;
  86.             }
  87.         }

  88.         // 更新窗口标题(显示当前数值)
  89.         char title[64];
  90.         snprintf(title, sizeof(title), "数值: %u", value);
  91.         SDL_SetWindowTitle(window, title);

  92.         // 清屏(白色背景)
  93.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  94.         SDL_RenderClear(renderer);

  95.         // 绘制点阵
  96.         for (int y = 0; y < HEIGHT; y++) {
  97.             for (int x = 0; x < WIDTH; x++) {
  98.                 if (dot[y][x]) {
  99.                     SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);   // 黑色(亮)
  100.                 } else {
  101.                     SDL_SetRenderDrawColor(renderer, 220, 220, 220, 255); // 浅灰(灭)
  102.                 }
  103.                 SDL_Rect rect = {
  104.                     MARGIN + x * DOT_SIZE,
  105.                     MARGIN + y * DOT_SIZE,
  106.                     DOT_SIZE - 2,
  107.                     DOT_SIZE - 2
  108.                 };
  109.                 SDL_RenderFillRect(renderer, &rect);
  110.             }
  111.         }

  112.         // 更新画面
  113.         SDL_RenderPresent(renderer);

  114.         // 控制刷新率
  115.         SDL_Delay(FRAME_DELAY);
  116.     }

  117.     // 清理资源
  118.     SDL_DestroyRenderer(renderer);
  119.     SDL_DestroyWindow(window);
  120.     SDL_Quit();

  121.     return 0;
  122. }
复制代码
gcc -o dotmatrix5 dotmatrix5.c -lSDL2
./dotmatrix5
可以鼠标点击点阵,页面眉头显示对应十进制数字。
 楼主| 发表于 2025-12-21 15:14:59 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-25 10:59 编辑

以十进制为主,
是否应该修改为11个单元的排序全组合,另外一个信息间隔的逗号,一共12个单元的12元集合,12集。
0,1,2,3,4,5,6,7,8,9,
a(10),
,(逗号专门的间隔单元)
8        4,0320        ×8
9        36,2880        ×9
10        362,8800        ×10
11        3991,6800        ×11
12        4,7900,1600        ×12
11位的排序全组合总数,可以覆盖24位颜色的1677万。
人耳可听的声波20赫兹~20000赫兹,2万的1,9980。

39916800-16777216-19980=2311,9604
空闲2311万可以自由发挥。

双逗号,,为一个信息条结束或更大层面的间隔。

类似16进制去表达二进制,用相对大的数量代表数字字符集,去表达太大的排序全组合空间,量化为文字和数字代表,对接八卦64卦等排序全组合。
 楼主| 发表于 2025-12-25 10:55:21 | 显示全部楼层
9数字亿进制点阵1
可以显示两竖,每竖4个数字,八个点阵阿拉伯数字,但是没有适度的间隔开来。

  1. #include <SDL2/SDL.h>
  2. #include <stdio.h>
  3. #include <stdbool.h>  // 必须包含!

  4. #define DOT_SIZE 20
  5. #define PADDING 4   // 点与点之间,以及数字块之间的间隔

  6. // 3x5 点阵数字图案:0~9(这里只用前8个)
  7. const bool digits[10][5][3] = {
  8.     {{true, true, true}, {true, false, true}, {true, false, true}, {true, false, true}, {true, true, true}}, // 0
  9.     {{false, true, false}, {false, true, false}, {false, true, false}, {false, true, false}, {false, true, false}}, // 1
  10.     {{true, true, true}, {false, false, true}, {true, true, true}, {true, false, false}, {true, true, true}}, // 2
  11.     {{true, true, true}, {false, false, true}, {true, true, true}, {false, false, true}, {true, true, true}}, // 3
  12.     {{true, false, true}, {true, false, true}, {true, true, true}, {false, false, true}, {false, false, true}}, // 4
  13.     {{true, true, true}, {true, false, false}, {true, true, true}, {false, false, true}, {true, true, true}}, // 5
  14.     {{true, true, true}, {true, false, false}, {true, true, true}, {true, false, true}, {true, true, true}}, // 6
  15.     {{true, true, true}, {false, false, true}, {false, false, true}, {false, false, true}, {false, false, true}}, // 7
  16.     {{true, true, true}, {true, false, true}, {true, true, true}, {true, false, true}, {true, true, true}}, // 8
  17.     {{true, true, true}, {true, false, true}, {true, true, true}, {false, false, true}, {true, true, true}}  // 9
  18. };

  19. int main(int argc, char* argv[]) {
  20.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  21.         fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError());
  22.         return 1;
  23.     }

  24.     const int grid_cols = 2;  // 横向 2 个数字
  25.     const int grid_rows = 4;  // 竖向 4 个数字
  26.     const int num_digits = 8; // 显示 0~7

  27.     // 单个数字块的尺寸(含内部点阵间隙)
  28.     const int block_width  = 3 * DOT_SIZE + 2 * PADDING;
  29.     const int block_height = 5 * DOT_SIZE + 4 * PADDING;

  30.     // 整体窗口尺寸:每个块之间再加 PADDING 作为块间距
  31.     int win_width  = grid_cols * block_width  + (grid_cols - 1) * PADDING;
  32.     int win_height = grid_rows * block_height + (grid_rows - 1) * PADDING;

  33.     SDL_Window* window = SDL_CreateWindow("2x4 3x5 Digit Matrix",
  34.                                           SDL_WINDOWPOS_CENTERED,
  35.                                           SDL_WINDOWPOS_CENTERED,
  36.                                           win_width, win_height,
  37.                                           SDL_WINDOW_SHOWN);
  38.     if (!window) {
  39.         fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError());
  40.         SDL_Quit();
  41.         return 1;
  42.     }

  43.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  44.     if (!renderer) {
  45.         fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError());
  46.         SDL_DestroyWindow(window);
  47.         SDL_Quit();
  48.         return 1;
  49.     }

  50.     bool quit = false;
  51.     SDL_Event e;

  52.     while (!quit) {
  53.         while (SDL_PollEvent(&e)) {
  54.             if (e.type == SDL_QUIT) {
  55.                 quit = true;
  56.             }
  57.         }

  58.         // 白色背景
  59.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  60.         SDL_RenderClear(renderer);

  61.         // 绘制每个数字块
  62.         for (int idx = 0; idx < num_digits; ++idx) {
  63.             int row = idx / grid_cols;   // 当前数字在网格中的行
  64.             int col = idx % grid_cols;   // 当前数字在网格中的列

  65.             // 计算该数字块左上角坐标
  66.             int block_x = col * (block_width + PADDING);
  67.             int block_y = row * (block_height + PADDING);

  68.             // 绘制该数字的 3x5 点阵
  69.             for (int y = 0; y < 5; ++y) {
  70.                 for (int x = 0; x < 3; ++x) {
  71.                     if (digits[idx][y][x]) {
  72.                         int px = block_x + x * (DOT_SIZE + PADDING);
  73.                         int py = block_y + y * (DOT_SIZE + PADDING);
  74.                         SDL_Rect r = {px, py, DOT_SIZE, DOT_SIZE};
  75.                         SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 黑色点亮
  76.                         SDL_RenderFillRect(renderer, &r);
  77.                     }
  78.                 }
  79.             }
  80.         }

  81.         SDL_RenderPresent(renderer);
  82.         SDL_Delay(16);
  83.     }

  84.     SDL_DestroyRenderer(renderer);
  85.     SDL_DestroyWindow(window);
  86.     SDL_Quit();
  87.     return 0;
  88. }
复制代码
 楼主| 发表于 2025-12-25 18:09:54 | 显示全部楼层

  1. #include <SDL2/SDL.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h> // for usleep

  7. #define GRID_SIZE 16
  8. #define CELL_SIZE 20
  9. #define WINDOW_WIDTH  (GRID_SIZE * CELL_SIZE)
  10. #define WINDOW_HEIGHT (GRID_SIZE * CELL_SIZE)

  11. const char* filename = "16x16_1.txt";

  12. int grid[GRID_SIZE][GRID_SIZE] = {0};
  13. time_t last_mtime = 0;

  14. // 创建默认文件(全0)
  15. void create_default_file() {
  16.     FILE* fp = fopen(filename, "w");
  17.     if (!fp) {
  18.         fprintf(stderr, "Cannot create default file %s\n", filename);
  19.         return;
  20.     }
  21.     for (int y = 0; y < GRID_SIZE; y++) {
  22.         for (int x = 0; x < GRID_SIZE; x++) {
  23.             fputc('0', fp);
  24.         }
  25.         fputc('\n', fp);
  26.     }
  27.     fclose(fp);
  28.     printf("Created default %s (all zeros).\n", filename);
  29. }

  30. // 加载位图文件到 grid
  31. int load_bitmap() {
  32.     FILE* fp = fopen(filename, "r");
  33.     if (!fp) {
  34.         printf("File %s not found.\n", filename);
  35.         create_default_file();
  36.         fp = fopen(filename, "r");
  37.         if (!fp) return -1;
  38.     }

  39.     char line[32];
  40.     int y = 0;
  41.     while (fgets(line, sizeof(line), fp) && y < GRID_SIZE) {
  42.         for (int x = 0; x < GRID_SIZE && line[x]; x++) {
  43.             grid[y][x] = (line[x] == '1') ? 1 : 0;
  44.         }
  45.         y++;
  46.     }
  47.     fclose(fp);

  48.     // 补全不足16行的情况(安全处理)
  49.     for (; y < GRID_SIZE; y++) {
  50.         for (int x = 0; x < GRID_SIZE; x++) {
  51.             grid[y][x] = 0;
  52.         }
  53.     }

  54.     // 获取当前修改时间
  55.     struct stat st;
  56.     if (stat(filename, &st) == 0) {
  57.         last_mtime = st.st_mtime;
  58.     }
  59.     return 0;
  60. }

  61. // 渲染点阵
  62. void render(SDL_Renderer* renderer) {
  63.     SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  64.     SDL_RenderClear(renderer);

  65.     for (int y = 0; y < GRID_SIZE; y++) {
  66.         for (int x = 0; x < GRID_SIZE; x++) {
  67.             SDL_Rect rect = { x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE };
  68.             SDL_SetRenderDrawColor(renderer,
  69.                 grid[y][x] ? 0 : 255,
  70.                 grid[y][x] ? 0 : 255,
  71.                 grid[y][x] ? 0 : 255,
  72.                 255
  73.             );
  74.             SDL_RenderFillRect(renderer, &rect);
  75.         }
  76.     }

  77.     // 可选:网格线
  78.     SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255);
  79.     for (int i = 0; i <= GRID_SIZE; i++) {
  80.         SDL_RenderDrawLine(renderer, i * CELL_SIZE, 0, i * CELL_SIZE, WINDOW_HEIGHT);
  81.         SDL_RenderDrawLine(renderer, 0, i * CELL_SIZE, WINDOW_WIDTH, i * CELL_SIZE);
  82.     }

  83.     SDL_RenderPresent(renderer);
  84. }

  85. // 检查文件是否被修改
  86. int file_modified() {
  87.     struct stat st;
  88.     if (stat(filename, &st) != 0) {
  89.         // 文件被删除?当作已修改(下次加载会重建)
  90.         return 1;
  91.     }
  92.     return (st.st_mtime != last_mtime);
  93. }

  94. int main(int argc, char* argv[]) {
  95.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  96.         fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError());
  97.         return 1;
  98.     }

  99.     SDL_Window* window = SDL_CreateWindow(
  100.         "16x16 Dot Matrix Auto-Refresh Viewer",
  101.         SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
  102.         WINDOW_WIDTH, WINDOW_HEIGHT,
  103.         SDL_WINDOW_SHOWN
  104.     );
  105.     if (!window) {
  106.         fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError());
  107.         SDL_Quit();
  108.         return 1;
  109.     }

  110.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  111.     if (!renderer) {
  112.         fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError());
  113.         SDL_DestroyWindow(window);
  114.         SDL_Quit();
  115.         return 1;
  116.     }

  117.     // 初次加载
  118.     if (load_bitmap() != 0) {
  119.         fprintf(stderr, "Failed to load bitmap.\n");
  120.         SDL_DestroyRenderer(renderer);
  121.         SDL_DestroyWindow(window);
  122.         SDL_Quit();
  123.         return 1;
  124.     }
  125.     render(renderer);

  126.     int running = 1;
  127.     SDL_Event e;
  128.     const Uint32 CHECK_INTERVAL_MS = 500; // 每500毫秒检查一次
  129.     Uint32 last_check = SDL_GetTicks();

  130.     while (running) {
  131.         while (SDL_PollEvent(&e)) {
  132.             if (e.type == SDL_QUIT) {
  133.                 running = 0;
  134.             } else if (e.type == SDL_KEYDOWN) {
  135.                 if (e.key.keysym.sym == SDLK_r) {
  136.                     printf("Manual reload triggered.\n");
  137.                     if (load_bitmap() == 0) render(renderer);
  138.                 } else if (e.key.keysym.sym == SDLK_ESCAPE) {
  139.                     running = 0;
  140.                 }
  141.             }
  142.         }

  143.         // 自动检查文件是否被外部修改
  144.         Uint32 now = SDL_GetTicks();
  145.         if (now - last_check >= CHECK_INTERVAL_MS) {
  146.             last_check = now;
  147.             if (file_modified()) {
  148.                 printf("Detected change in %s, reloading...\n", filename);
  149.                 if (load_bitmap() == 0) {
  150.                     render(renderer);
  151.                 }
  152.             }
  153.         }

  154.         SDL_Delay(16); // ~60 FPS
  155.     }

  156.     SDL_DestroyRenderer(renderer);
  157.     SDL_DestroyWindow(window);
  158.     SDL_Quit();
  159.     return 0;
  160. }

  161. //gcc -o 16x16点阵刷新1 16x16点阵刷新1.c -lSDL2
复制代码
编译后生成执行文件,运行执行文件会生成16x16_1.txt文本。
用nano修改16x16_1.txt,保存修改后,会对应点阵显示出变化。达到显存效应的需求
 楼主| 发表于 2025-12-29 10:46:38 | 显示全部楼层
本帖最后由 zzz19760225 于 2025-12-29 11:32 编辑

16x16点阵全组合的鼠标点击自定义点阵选择,输出数值信息。

  1. //gcc -o dotmatrix dotmatrix.c -lSDL2

  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <SDL2/SDL.h>

  5. #define WIDTH 16
  6. #define HEIGHT 16
  7. #define DOT_SIZE 30
  8. #define MARGIN 20
  9. #define WINDOW_WIDTH (WIDTH * DOT_SIZE + 2 * MARGIN)
  10. #define WINDOW_HEIGHT (HEIGHT * DOT_SIZE + 2 * MARGIN)
  11. #define FRAME_DELAY 50

  12. // 自定义16进制字符映射(0~15)
  13. const char* hex_map[16] = {
  14.     "一", "二", "三", "四", "五", "六", "七", "八",
  15.     "九", "十", "壹", "贰", "叁", "肆", "伍", "陆"
  16. };

  17. // 将点阵写入 2.txt
  18. void save_dot_to_file(int dot[HEIGHT][WIDTH]) {
  19.     FILE* fp = fopen("2.txt", "w");
  20.     if (!fp) {
  21.         fprintf(stderr, "无法创建文件 2.txt\n");
  22.         return;
  23.     }

  24.     // 设置UTF-8编码(可选,Linux/macOS默认UTF-8)
  25.     // Windows可能需要额外处理,但fopen默认ANSI;若需UTF-8可加BOM或用_setmode,此处简化
  26.     // 我们直接写UTF-8字符串

  27.     // 遍历256位,生成64个hex字符(从左上到右下,高位在前)
  28.     for (int i = 0; i < 64; i++) {
  29.         // 每个hex字符由4个bit组成
  30.         int nibble = 0;
  31.         for (int b = 0; b < 4; b++) {
  32.             int bit_index = i * 4 + b; // 0 ~ 255
  33.             int y = bit_index / WIDTH;
  34.             int x = bit_index % WIDTH;
  35.             if (y < HEIGHT && x < WIDTH && dot[y][x]) {
  36.                 nibble |= (1 << (3 - b)); // 高位在前(bit0是最高位)
  37.             }
  38.         }
  39.         fputs(hex_map[nibble], fp);
  40.     }
  41.     fputc('\n', fp);
  42.     fclose(fp);
  43. }

  44. int main(int argc, char* argv[]) {
  45.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  46.         printf("无法初始化SDL:%s\n", SDL_GetError());
  47.         return -1;
  48.     }

  49.     SDL_Window* window = SDL_CreateWindow(
  50.         "16x16 点阵编辑器(状态已保存至 2.txt)",
  51.         SDL_WINDOWPOS_CENTERED,
  52.         SDL_WINDOWPOS_CENTERED,
  53.         WINDOW_WIDTH,
  54.         WINDOW_HEIGHT,
  55.         SDL_WINDOW_SHOWN
  56.     );
  57.     if (!window) {
  58.         printf("无法创建窗口:%s\n", SDL_GetError());
  59.         SDL_Quit();
  60.         return -1;
  61.     }

  62.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  63.     if (!renderer) {
  64.         printf("无法创建渲染器:%s\n", SDL_GetError());
  65.         SDL_DestroyWindow(window);
  66.         SDL_Quit();
  67.         return -1;
  68.     }

  69.     int dot[HEIGHT][WIDTH] = {0};
  70.     int running = 1;
  71.     SDL_Event event;

  72.     // 初始保存一次(全0)
  73.     save_dot_to_file(dot);

  74.     while (running) {
  75.         while (SDL_PollEvent(&event)) {
  76.             if (event.type == SDL_QUIT) {
  77.                 running = 0;
  78.             }
  79.             else if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) {
  80.                 int mouse_x = event.button.x;
  81.                 int mouse_y = event.button.y;

  82.                 int grid_x = (mouse_x - MARGIN) / DOT_SIZE;
  83.                 int grid_y = (mouse_y - MARGIN) / DOT_SIZE;

  84.                 if (grid_x >= 0 && grid_x < WIDTH && grid_y >= 0 && grid_y < HEIGHT) {
  85.                     dot[grid_y][grid_x] = 1 - dot[grid_y][grid_x];
  86.                     // 状态改变,立即保存
  87.                     save_dot_to_file(dot);
  88.                 }
  89.             }
  90.         }

  91.         // 清屏
  92.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  93.         SDL_RenderClear(renderer);

  94.         // 绘制点阵
  95.         for (int y = 0; y < HEIGHT; y++) {
  96.             for (int x = 0; x < WIDTH; x++) {
  97.                 SDL_SetRenderDrawColor(renderer,
  98.                     dot[y][x] ? 0 : 220,
  99.                     dot[y][x] ? 0 : 220,
  100.                     dot[y][x] ? 0 : 220,
  101.                     255
  102.                 );
  103.                 SDL_Rect rect = {
  104.                     MARGIN + x * DOT_SIZE,
  105.                     MARGIN + y * DOT_SIZE,
  106.                     DOT_SIZE - 2,
  107.                     DOT_SIZE - 2
  108.                 };
  109.                 SDL_RenderFillRect(renderer, &rect);
  110.             }
  111.         }

  112.         SDL_RenderPresent(renderer);
  113.         SDL_Delay(FRAME_DELAY);
  114.     }

  115.     SDL_DestroyRenderer(renderer);
  116.     SDL_DestroyWindow(window);
  117.     SDL_Quit();
  118.     return 0;
  119. }
复制代码
可以鼠标点击图形输出,可以使用中文代表为对应16进制输出为2.txt,用cat 2.txt,可以查看。

  1. 0=一,1=二,2=三,3=四,4=五,5=六,6=七,7=八,8=九,9=十,a=壹,b=贰,c=叁,d=肆,e=伍,f=陆,
  2. 一一一一一一一一一一一一一一一一一一一一一三一一一三九一一伍九一一贰九一一壹一一一四九一一三九一一伍九一一一一一一一一一一一一一
复制代码
 楼主| 发表于 2025-12-29 16:42:39 | 显示全部楼层
两个程序,一个程序鼠标点击16x16点阵的自定义01字符16行,输出到2.txt,另一个程序读取2.txt,读取显示到16x16图形页面,是可以直接显示对接的。
鼠标点击的程序
16x16点阵点击输出二进制16行.c

  1. //编译命令 gcc -o 16x16点阵点击输出二进制16行 16x16点阵点击输出二进制16行.c -lSDL2
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <SDL2/SDL.h>

  5. #define WIDTH 16
  6. #define HEIGHT 16
  7. #define DOT_SIZE 30
  8. #define MARGIN 20
  9. #define WINDOW_WIDTH (WIDTH * DOT_SIZE + 2 * MARGIN)
  10. #define WINDOW_HEIGHT (HEIGHT * DOT_SIZE + 2 * MARGIN)
  11. #define FRAME_DELAY 50

  12. // 将点阵以分行二进制形式(每行16个0/1)写入 2.txt
  13. void save_dot_to_file(int dot[HEIGHT][WIDTH]) {
  14.     FILE* fp = fopen("2.txt", "w");
  15.     if (!fp) {
  16.         fprintf(stderr, "无法创建文件 2.txt\n");
  17.         return;
  18.     }

  19.     for (int y = 0; y < HEIGHT; y++) {
  20.         for (int x = 0; x < WIDTH; x++) {
  21.             fputc(dot[y][x] ? '1' : '0', fp);
  22.         }
  23.         fputc('\n', fp); // 每行结束后换行
  24.     }
  25.     fclose(fp);
  26. }

  27. int main(int argc, char* argv[]) {
  28.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  29.         printf("无法初始化SDL:%s\n", SDL_GetError());
  30.         return -1;
  31.     }

  32.     SDL_Window* window = SDL_CreateWindow(
  33.         "16x16 点阵编辑器(二进制已保存至 2.txt,每行16位)",
  34.         SDL_WINDOWPOS_CENTERED,
  35.         SDL_WINDOWPOS_CENTERED,
  36.         WINDOW_WIDTH,
  37.         WINDOW_HEIGHT,
  38.         SDL_WINDOW_SHOWN
  39.     );
  40.     if (!window) {
  41.         printf("无法创建窗口:%s\n", SDL_GetError());
  42.         SDL_Quit();
  43.         return -1;
  44.     }

  45.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  46.     if (!renderer) {
  47.         printf("无法创建渲染器:%s\n", SDL_GetError());
  48.         SDL_DestroyWindow(window);
  49.         SDL_Quit();
  50.         return -1;
  51.     }

  52.     int dot[HEIGHT][WIDTH] = {0}; // 初始化全灭
  53.     int running = 1;
  54.     SDL_Event event;

  55.     // 初始保存(全0)
  56.     save_dot_to_file(dot);

  57.     while (running) {
  58.         while (SDL_PollEvent(&event)) {
  59.             if (event.type == SDL_QUIT) {
  60.                 running = 0;
  61.             }
  62.             else if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button == SDL_BUTTON_LEFT) {
  63.                 int mouse_x = event.button.x;
  64.                 int mouse_y = event.button.y;

  65.                 int grid_x = (mouse_x - MARGIN) / DOT_SIZE;
  66.                 int grid_y = (mouse_y - MARGIN) / DOT_SIZE;

  67.                 if (grid_x >= 0 && grid_x < WIDTH && grid_y >= 0 && grid_y < HEIGHT) {
  68.                     dot[grid_y][grid_x] = 1 - dot[grid_y][grid_x];
  69.                     save_dot_to_file(dot); // 状态改变,立即保存
  70.                 }
  71.             }
  72.         }

  73.         // 渲染画面
  74.         SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); // 白色背景
  75.         SDL_RenderClear(renderer);

  76.         for (int y = 0; y < HEIGHT; y++) {
  77.             for (int x = 0; x < WIDTH; x++) {
  78.                 // 亮:黑色;灭:浅灰色
  79.                 Uint8 color = dot[y][x] ? 0 : 220;
  80.                 SDL_SetRenderDrawColor(renderer, color, color, color, 255);
  81.                 SDL_Rect rect = {
  82.                     MARGIN + x * DOT_SIZE,
  83.                     MARGIN + y * DOT_SIZE,
  84.                     DOT_SIZE - 2,
  85.                     DOT_SIZE - 2
  86.                 };
  87.                 SDL_RenderFillRect(renderer, &rect);
  88.             }
  89.         }

  90.         SDL_RenderPresent(renderer);
  91.         SDL_Delay(FRAME_DELAY);
  92.     }

  93.     // 清理资源
  94.     SDL_DestroyRenderer(renderer);
  95.     SDL_DestroyWindow(window);
  96.     SDL_Quit();
  97.     return 0;
  98. }
复制代码
 楼主| 发表于 2025-12-29 16:45:08 | 显示全部楼层
第二个程序读取2.txt内容
16x16点阵点击输出二进制16行.c

  1. #include <SDL2/SDL.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h> // for usleep

  7. #define GRID_SIZE 16
  8. #define CELL_SIZE 20
  9. #define WINDOW_WIDTH  (GRID_SIZE * CELL_SIZE)
  10. #define WINDOW_HEIGHT (GRID_SIZE * CELL_SIZE)

  11. const char* filename = "2.txt";

  12. int grid[GRID_SIZE][GRID_SIZE] = {0};
  13. time_t last_mtime = 0;

  14. // 创建默认文件(全0)
  15. void create_default_file() {
  16.     FILE* fp = fopen(filename, "w");
  17.     if (!fp) {
  18.         fprintf(stderr, "Cannot create default file %s\n", filename);
  19.         return;
  20.     }
  21.     for (int y = 0; y < GRID_SIZE; y++) {
  22.         for (int x = 0; x < GRID_SIZE; x++) {
  23.             fputc('0', fp);
  24.         }
  25.         fputc('\n', fp);
  26.     }
  27.     fclose(fp);
  28.     printf("Created default %s (all zeros).\n", filename);
  29. }

  30. // 加载位图文件到 grid
  31. int load_bitmap() {
  32.     FILE* fp = fopen(filename, "r");
  33.     if (!fp) {
  34.         printf("File %s not found.\n", filename);
  35.         create_default_file();
  36.         fp = fopen(filename, "r");
  37.         if (!fp) return -1;
  38.     }

  39.     char line[32];
  40.     int y = 0;
  41.     while (fgets(line, sizeof(line), fp) && y < GRID_SIZE) {
  42.         for (int x = 0; x < GRID_SIZE && line[x]; x++) {
  43.             grid[y][x] = (line[x] == '1') ? 1 : 0;
  44.         }
  45.         y++;
  46.     }
  47.     fclose(fp);

  48.     // 补全不足16行的情况(安全处理)
  49.     for (; y < GRID_SIZE; y++) {
  50.         for (int x = 0; x < GRID_SIZE; x++) {
  51.             grid[y][x] = 0;
  52.         }
  53.     }

  54.     // 获取当前修改时间
  55.     struct stat st;
  56.     if (stat(filename, &st) == 0) {
  57.         last_mtime = st.st_mtime;
  58.     }
  59.     return 0;
  60. }

  61. // 渲染点阵
  62. void render(SDL_Renderer* renderer) {
  63.     SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  64.     SDL_RenderClear(renderer);

  65.     for (int y = 0; y < GRID_SIZE; y++) {
  66.         for (int x = 0; x < GRID_SIZE; x++) {
  67.             SDL_Rect rect = { x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE };
  68.             SDL_SetRenderDrawColor(renderer,
  69.                 grid[y][x] ? 0 : 255,
  70.                 grid[y][x] ? 0 : 255,
  71.                 grid[y][x] ? 0 : 255,
  72.                 255
  73.             );
  74.             SDL_RenderFillRect(renderer, &rect);
  75.         }
  76.     }

  77.     // 可选:网格线
  78.     SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255);
  79.     for (int i = 0; i <= GRID_SIZE; i++) {
  80.         SDL_RenderDrawLine(renderer, i * CELL_SIZE, 0, i * CELL_SIZE, WINDOW_HEIGHT);
  81.         SDL_RenderDrawLine(renderer, 0, i * CELL_SIZE, WINDOW_WIDTH, i * CELL_SIZE);
  82.     }

  83.     SDL_RenderPresent(renderer);
  84. }

  85. // 检查文件是否被修改
  86. int file_modified() {
  87.     struct stat st;
  88.     if (stat(filename, &st) != 0) {
  89.         // 文件被删除?当作已修改(下次加载会重建)
  90.         return 1;
  91.     }
  92.     return (st.st_mtime != last_mtime);
  93. }

  94. int main(int argc, char* argv[]) {
  95.     if (SDL_Init(SDL_INIT_VIDEO) != 0) {
  96.         fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError());
  97.         return 1;
  98.     }

  99.     SDL_Window* window = SDL_CreateWindow(
  100.         "16x16 Dot Matrix Auto-Refresh Viewer",
  101.         SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
  102.         WINDOW_WIDTH, WINDOW_HEIGHT,
  103.         SDL_WINDOW_SHOWN
  104.     );
  105.     if (!window) {
  106.         fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError());
  107.         SDL_Quit();
  108.         return 1;
  109.     }

  110.     SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  111.     if (!renderer) {
  112.         fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError());
  113.         SDL_DestroyWindow(window);
  114.         SDL_Quit();
  115.         return 1;
  116.     }

  117.     // 初次加载
  118.     if (load_bitmap() != 0) {
  119.         fprintf(stderr, "Failed to load bitmap.\n");
  120.         SDL_DestroyRenderer(renderer);
  121.         SDL_DestroyWindow(window);
  122.         SDL_Quit();
  123.         return 1;
  124.     }
  125.     render(renderer);

  126.     int running = 1;
  127.     SDL_Event e;
  128.     const Uint32 CHECK_INTERVAL_MS = 500; // 每500毫秒检查一次
  129.     Uint32 last_check = SDL_GetTicks();

  130.     while (running) {
  131.         while (SDL_PollEvent(&e)) {
  132.             if (e.type == SDL_QUIT) {
  133.                 running = 0;
  134.             } else if (e.type == SDL_KEYDOWN) {
  135.                 if (e.key.keysym.sym == SDLK_r) {
  136.                     printf("Manual reload triggered.\n");
  137.                     if (load_bitmap() == 0) render(renderer);
  138.                 } else if (e.key.keysym.sym == SDLK_ESCAPE) {
  139.                     running = 0;
  140.                 }
  141.             }
  142.         }

  143.         // 自动检查文件是否被外部修改
  144.         Uint32 now = SDL_GetTicks();
  145.         if (now - last_check >= CHECK_INTERVAL_MS) {
  146.             last_check = now;
  147.             if (file_modified()) {
  148.                 printf("Detected change in %s, reloading...\n", filename);
  149.                 if (load_bitmap() == 0) {
  150.                     render(renderer);
  151.                 }
  152.             }
  153.         }

  154.         SDL_Delay(16); // ~60 FPS
  155.     }

  156.     SDL_DestroyRenderer(renderer);
  157.     SDL_DestroyWindow(window);
  158.     SDL_Quit();
  159.     return 0;
  160. }

  161. //gcc -o 16x16点阵刷新1 16x16点阵刷新1.c -lSDL2
复制代码
运行编译后的执行程序,就可以对应电器开关一样,这边点击,那边对应显示。(好像没有什么意义!)
 楼主| 发表于 2026-1-6 09:35:15 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-1-6 09:37 编辑

linux mint22.2下,nasm汇编+SDL2的C语言图形库,做点阵位图的数字集,八进制无文字颜色代表集=八卦排序全组合,满编全十进制,阿拉伯数字,汉字数字,麻将,苏州数字,天干地支十二进制挪用等多十进制,百进制,千字文的千进制,阿拉伯数字组成的万进制和亿进制可能。
 楼主| 发表于 2026-1-24 11:26:20 | 显示全部楼层
寒夜孤星的6个bat批处理,通过AI自动信息通义千问,转为perl版。
6
第六种
han6.pl

  1. #!/usr/bin/perl
  2. use strict;      # 启用严格模式,强制声明变量
  3. use warnings;    # 启用警告,帮助发现潜在错误

  4. # 定义要排列的四个汉字
  5. my @chars = ('寒', '夜', '孤', '星');

  6. # 用于存储所有排列结果的数组
  7. my @results;

  8. # 递归函数:生成全排列
  9. # 参数:
  10. #    $ prefix     —— 当前已拼接的字符串(前缀)
  11. #    $ remaining  —— 剩余可选字符的数组引用
  12. sub permute {
  13.     my ( $prefix, $remaining) = @_;

  14.     # 如果剩余字符为空,说明已形成一个完整排列
  15.     if (@$remaining == 0) {
  16.         push @results, $prefix;   # 将结果保存到数组
  17.         print " $prefix\n";        # 输出该排列(注意:原脚本前面有空格,这里已去除)
  18.         return;
  19.     }

  20.     # 遍历剩余字符中的每一个位置
  21.     for my $i (0 ..  $#{ $remaining}) {
  22.         my @new_remaining = @$remaining;           # 复制剩余字符列表
  23.         my $char = splice(@new_remaining, $i, 1);  # 取出第 i 个字符
  24.         permute( $prefix . $char, \@new_remaining); # 递归:前缀加上该字符,剩余列表更新
  25.     }
  26. }

  27. # 从空前缀和完整字符列表开始递归
  28. permute("", \@chars);

  29. # 输出总共有多少种排列方式(4! = 24)
  30. print scalar(@results) . "种组合方式\n";

  31. # 暂停程序,等待用户按回车(类似 Windows 的 pause)
  32. <>;
复制代码
第六种输出结果

  1. 寒夜孤星
  2. 寒夜星孤
  3. 寒孤夜星
  4. 寒孤星夜
  5. 寒星夜孤
  6. 寒星孤夜
  7. 夜寒孤星
  8. 夜寒星孤
  9. 夜孤寒星
  10. 夜孤星寒
  11. 夜星寒孤
  12. 夜星孤寒
  13. 孤寒夜星
  14. 孤寒星夜
  15. 孤夜寒星
  16. 孤夜星寒
  17. 孤星寒夜
  18. 孤星夜寒
  19. 星寒夜孤
  20. 星寒孤夜
  21. 星夜寒孤
  22. 星夜孤寒
  23. 星孤寒夜
  24. 星孤夜寒
  25. 24种组合方式
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:40 , Processed in 0.026073 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表