基于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; }
关键修改说明
- 固定控制台尺寸
使用SetConsoleScreenBufferSize和SetConsoleWindowInfo强制将控制台设置为80列、25行,确保绘制区域符合需求,同时锁定窗口大小避免干扰。 - 精确中心坐标
直接使用固定中心(11,39):80列的中心是第39列(0索引),24行可用区域的中心是第11行(0索引)。 - 边界收缩式螺旋逻辑
通过动态调整上下左右边界,实现顺时针向外扩展的螺旋绘制:- 先向右到当前右边界,收缩右边界
- 再向下到当前下边界,收缩下边界
- 再向左到当前左边界,收缩左边界
- 最后向上到当前上边界上方一行,收缩上边界
循环直到当前坐标到达左上角(0,0),确保最终结束位置符合要求。
- 优化视觉延迟
将Sleep时长调整为30ms,平衡视觉流畅度和绘制速度。
内容的提问来源于stack exchange,提问作者Maks Fedorenko
相关产品推荐
相关产品推荐

