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

如何在C#控制台应用绘制的正方形内分4个区域写入不同文本

C#控制台正方形分区写入文本实现方案

核心思路

你当前已经实现了外正方形绘制,只需要补充3部分逻辑即可:

  • 移除原绘制方法末尾的阻塞逻辑,保证后续代码可执行
  • 绘制十字分隔线将正方形内部划分为4个独立区域
  • 计算每个区域的坐标范围,定位光标后写入对应文本

代码实现

1. 优化后的正方形绘制方法

static void DrawSquare(int l, int h, int x, int y)
{
    string tvkant = "\x250C"; // 左上角
    string thkant = "\x2510"; // 右上角
    string bvkant = "\x2514"; // 左下角
    string bhkant = "\x2518"; // 右下角
    string vside = "\x2502"; // 竖边
    string hside = "\x2502"; // 竖边
    string top = "\x2500"; // 横边
    string bund = "\x2500"; // 横边

    // 绘制上下横边
    for (int i = 1; i < l; i++)
    {
        Console.SetCursorPosition(x + i, y);
        Console.Write(top);
        Console.SetCursorPosition(x + i, y + h);
        Console.Write(bund);
    }
    // 绘制左右竖边
    for (int i = 1; i < h; i++)
    {
        Console.SetCursorPosition(x, y + i);
        Console.Write(vside);
        Console.SetCursorPosition(x + l, y + i);
        Console.Write(hside);
    }
    // 绘制四个角
    Console.SetCursorPosition(x, y);
    Console.Write(tvkant);
    Console.SetCursorPosition(x + l, y);
    Console.Write(thkant);
    Console.SetCursorPosition(x, y + h);
    Console.Write(bvkant);
    Console.SetCursorPosition(x + l, y + h);
    Console.Write(bhkant);
}

2. 新增分区绘制与文本写入方法

// 绘制十字分隔线,划分4个区域
static void DrawSplitLine(int l, int h, int x, int y)
{
    string cross = "\x253C"; // 十字交叉点
    string hLine = "\x2500"; // 水平分隔线
    string vLine = "\x2502"; // 垂直分隔线
    int splitX = x + l / 2;
    int splitY = y + h / 2;

    // 绘制垂直分隔线
    for (int i = 1; i < h; i++)
    {
        Console.SetCursorPosition(splitX, y + i);
        Console.Write(vLine);
    }
    // 绘制水平分隔线
    for (int i = 1; i < l; i++)
    {
        Console.SetCursorPosition(x + i, splitY);
        Console.Write(hLine);
    }
    // 绘制交叉点
    Console.SetCursorPosition(splitX, splitY);
    Console.Write(cross);
}

// 向指定区域写入文本
static void WriteTextToArea(int areaIndex, string text, int l, int h, int x, int y)
{
    int areaWidth = l / 2 - 1; // 单个区域宽度,减去边框和分隔线占位
    int areaHeight = h / 2 - 1; // 单个区域高度
    int startX = 0, startY = 0;

    // 根据区域编号计算起始坐标,默认从左上开始顺时针编号1-4
    switch (areaIndex)
    {
        case 1: // 左上
            startX = x + 1;
            startY = y + 1;
            break;
        case 2: // 右上
            startX = x + l / 2 + 1;
            startY = y + 1;
            break;
        case 3: // 左下
            startX = x + 1;
            startY = y + h / 2 + 1;
            break;
        case 4: // 右下
            startX = x + l / 2 + 1;
            startY = y + h / 2 + 1;
            break;
    }

    // 文本超出区域宽度自动截断,也可自行实现换行逻辑
    if (text.Length > areaWidth)
        text = text.Substring(0, areaWidth);

    Console.SetCursorPosition(startX, startY);
    Console.Write(text);
}

3. Main方法调用示例

static void Main(string[] args)
{
    // 初始参数和你之前的调用一致:宽20,高24,左上角坐标(16,20)
    int width = 20, height = 24, left = 16, top = 20;
    Console.CursorVisible = false; // 隐藏光标更美观

    // 1. 绘制外框
    DrawSquare(width, height, left, top);
    // 2. 绘制分隔线
    DrawSplitLine(width, height, left, top);
    // 3. 向四个区域写入不同文本
    WriteTextToArea(1, "左上区域文本", width, height, left, top);
    WriteTextToArea(2, "右上区域文本", width, height, left, top);
    WriteTextToArea(3, "左下区域文本", width, height, left, top);
    WriteTextToArea(4, "右下区域文本", width, height, left, top);

    Console.ReadKey();
}

可选优化点

  • 如果需要文本居中展示,只需要计算对应区域的中心坐标,调整startX和startY即可
  • 可以自定义分隔线的位置,不需要严格对半分,修改splitX和splitY的计算逻辑即可
  • 如果需要多行文本,可以按行循环设置光标Y坐标逐行写入,注意不要超过区域高度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:18:02