如何在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
相关产品推荐
相关产品推荐

