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

如何在ncurses中绘制完美正方形?含5x5棋盘实现需求

在终端绘制视觉正方形与5x5棋盘

终端里的等宽字体普遍存在字符高度是宽度的2倍左右的特性(比如常见的Courier、Monaco字体),这是你直接画等行列数得不到正方形的核心原因。要实现视觉上的正方形,必须让横向字符数和纵向行数的比例匹配这个宽高比——通常是横向字符数 = 2 × 纵向行数,这样总高度(行数×字符高度)才能和总宽度(列数×字符宽度)相等。

单个视觉正方形的绘制

比如要画一个最小的正方形,可以用2个横向字符+1行高度,或者4个横向字符+2行高度,示例代码(bash):

# 2字符宽 + 1行高的正方形
echo "██"
# 4字符宽 + 2行高的正方形
echo "████"
echo "████"

5x5棋盘的实现

基于上述比例,下面的脚本会生成视觉上接近完美正方形的5x5棋盘:

#!/bin/bash
GRID_SIZE=5
# 每个格子用2字符宽、1行高,匹配2:1的宽高比,保证视觉正方形
CELL_WIDTH=2

for ((row=0; row<GRID_SIZE; row++)); do
    line=""
    for ((col=0; col<GRID_SIZE; col++)); do
        # 交替填充方块和空格形成棋盘
        if (( (row + col) % 2 == 0 )); then
            line+="██"
        else
            line+="  "
        fi
    done
    echo "$line"
done

如果想要更大的格子,可以调整比例保持一致,比如每个格子用4字符宽、2行高:

#!/bin/bash
GRID_SIZE=5
CELL_WIDTH=4
CELL_HEIGHT=2

for ((row=0; row<GRID_SIZE; row++)); do
    # 每个格子重复CELL_HEIGHT行
    for ((h=0; h<CELL_HEIGHT; h++)); do
        line=""
        for ((col=0; col<GRID_SIZE; col++)); do
            if (( (row + col) % 2 == 0 )); then
                line+="████"
            else
                line+="    "
            fi
        done
        echo "$line"
    done
done

关于偏移量无效的说明

你之前尝试的列偏移方法没用,是因为终端的字符宽高比是字体和终端设置决定的固定值,不是通过偏移能修正的。只有让横向字符数和纵向行数的比例匹配这个固定宽高比,才能得到视觉上的正方形。如果你的终端比例不是标准的2:1,可以微调字符数和行数的比例(比如用9字符宽+5行高匹配1.8:1的比例)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:50:27