You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Windows API的80*25控制台螺旋星号绘制程序异常排查

问题解决:Windows控制台中心顺时针螺旋绘制*并结束于左上角

问题分析

原程序存在以下核心问题:

  • 未固定控制台为要求的80*25标准尺寸,绘制范围依赖当前控制台窗口大小,无法稳定覆盖目标区域
  • 采用统一的正方形边长变量size控制绘制,无法适配80列(宽)、24行(高,最后一行禁用)的矩形区域,导致横向无法填满整个控制台宽度
  • 绘制逻辑的终止条件错误,无法确保最终结束于左上角位置
  • 中心坐标计算依赖动态窗口信息,而非固定标准尺寸的精确中心

修正后的代码

#include <stdio.h>
#include <windows.h>

// 在指定坐标绘制*
void Paint(HANDLE hout, int row, int col) {
    COORD pos = {col, row};
    SetConsoleCursorPosition(hout, pos);
    printf("*");
    Sleep(30); // 调整延迟优化视觉流畅度
}

int main() {
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
    // 固定控制台为80列、25行的标准尺寸
    COORD bufferSize = {80, 25};
    SetConsoleScreenBufferSize(hout, bufferSize);
    SMALL_RECT windowRect = {0, 0, 79, 24};
    SetConsoleWindowInfo(hout, TRUE, &windowRect);

    // 标准80*24可用区域的中心坐标(0-based)
    int currRow = 11;
    int currCol = 39;

    // 初始边界:可用区域为0-23行,0-79列
    int top = 0, bottom = 23;
    int left = 0, right = 79;

    // 先绘制中心的*
    Paint(hout, currRow, currCol);

    // 顺时针螺旋绘制,直到到达左上角(0,0)
    while (!(currRow == 0 && currCol == 0)) {
        // 向右绘制到当前右边界
        while (currCol < right) {
            currCol++;
            Paint(hout, currRow, currCol);
        }
        right--; // 右边界收缩

        // 向下绘制到当前下边界
        while (currRow < bottom) {
            currRow++;
            Paint(hout, currRow, currCol);
        }
        bottom--; // 下边界收缩

        // 向左绘制到当前左边界
        while (currCol > left) {
            currCol--;
            Paint(hout, currRow, currCol);
        }
        left++; // 左边界收缩

        // 向上绘制到当前上边界(最后一次循环到top即可停止,避免重复绘制)
        while (currRow > top + 1) {
            currRow--;
            Paint(hout, currRow, currCol);
        }
        top++; // 上边界收缩
    }

    getchar();
    return 0;
}

关键修改说明

  1. 固定控制台尺寸
    使用SetConsoleScreenBufferSize和SetConsoleWindowInfo强制将控制台设置为80列、25行,确保绘制区域符合需求,同时锁定窗口大小避免干扰。
  2. 精确中心坐标
    直接使用固定中心(11,39):80列的中心是第39列(0索引),24行可用区域的中心是第11行(0索引)。
  3. 边界收缩式螺旋逻辑
    通过动态调整上下左右边界,实现顺时针向外扩展的螺旋绘制:
    • 先向右到当前右边界,收缩右边界
    • 再向下到当前下边界,收缩下边界
    • 再向左到当前左边界,收缩左边界
    • 最后向上到当前上边界上方一行,收缩上边界
      循环直到当前坐标到达左上角(0,0),确保最终结束位置符合要求。
  4. 优化视觉延迟
    将Sleep时长调整为30ms,平衡视觉流畅度和绘制速度。

内容的提问来源于stack exchange,提问作者Maks Fedorenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:24:56