【问题标题】:Better way to draw this in the console在控制台中绘制它的更好方法
【发布时间】:2014-09-14 22:26:24
【问题描述】:

我想知道是否有办法改进代码以获得,在这种情况下,门(请不要谈论 Windows 窗体和更好的游戏方式,我只是在尝试。)

代码:

Console.WriteLine("\t _____________\t\t" + " _____________\t\t" + " _____________");
Console.WriteLine("\t|  _________  |\t\t" + "|  _________  |\t\t" + "|  _________  |");
Console.WriteLine("\t|  |       |  |\t\t" + "|  |       |  |\t\t" + "|  |       |  |");
Console.WriteLine("\t|  |   " + input + "   |  |\t\t" + "|  |   " + (input + 1) + "   |  |\t\t" + "|  |   " + (input + 2) + "   |  |");
Console.WriteLine("\t|  |       |  |\t\t" + "|  |       |  |\t\t" + "|  |       |  |");
Console.WriteLine("\t|  |       |  |\t\t" + "|  |       |  |\t\t" + "|  |       |  |");
Console.WriteLine("\t|  |       |  |\t\t" + "|  |       |  |\t\t" + "|  |       |  |");
Console.WriteLine("\t|  |       |  |\t\t" + "|  |       |  |\t\t" + "|  |       |  |");
Console.WriteLine("\t|  |_______|  |\t\t" + "|  |_______|  |\t\t" + "|  |_______|  |");
Console.WriteLine("\t|             |\t\t" + "|             |\t\t" + "|             |");
Console.WriteLine("\t()------------|\t\t" + "()------------|\t\t" + "()------------|");
Console.WriteLine("\t|  ________   |\t\t" + "|  ________   |\t\t" + "|  ________   |");
Console.WriteLine("\t|  |       |  |\t\t" + "|  |       |  |\t\t" + "|  |       |  |");
Console.WriteLine("\t|  |       |  |\t\t" + "|  |       |  |\t\t" + "|  |       |  |");
Console.WriteLine("\t|  |       |  |\t\t" + "|  |       |  |\t\t" + "|  |       |  |");
Console.WriteLine("\t|  |       |  |\t\t" + "|  |       |  |\t\t" + "|  |       |  |");
Console.WriteLine("\t|  |_______|  |\t\t" + "|  |_______|  |\t\t" + "|  |_______|  |");
Console.WriteLine("\t|_____________|\t\t" + "|_____________|\t\t" + "|_____________|");

结果:

我正在寻求帮助以获得相同的结果,但代码更好(如果可能的话)。

【问题讨论】:

  • 如果您坚持使用 ASCII 艺术,我不知道您是否可以对向控制台写入长行的基本形式做很多事情,但您可以简化它未来,如果您为每种独特类型的线制作方法,然后由另一种方法调用以制作任何大小、数量和输入消息的门,然后在将来您需要制作门时使用该方法。任何其他对象的想法都是一样的。
  • 您可以尝试查看string.Format() 或重载Console.WriteLine(string format, params object[] arg)。这可能会使代码更好一些。否则,同意之前的评论,您可能无能为力。
  • 我一定会检查你们所说的内容并尝试解决它。​​
  • 如果您指定您正在寻找什么样的“更好”,那将是 +1 问题(已经有最少的代码,预期的结果)......
  • 我的意思是@Sam 所取得的成就,一种通用的方法来制作我想要的多少扇门。

标签: c# ascii-art


【解决方案1】:

哈哈,我的尝试

private static string[] what = {
        "\t _____________",
        "\t|  _________  |",
        "\t|  |       |  |",
        "\t|  |   {0}   |  |",
        "\t|  |       |  |",
        "\t|  |       |  |",
        "\t|  |       |  |",
        "\t|  |       |  |",
        "\t|  |_______|  |",
        "\t|             |",
        "\t()------------|",
        "\t|  ________   |",
        "\t|  |       |  |",
        "\t|  |       |  |",
        "\t|  |       |  |",
        "\t|  |       |  |",
        "\t|  |_______|  |",
        "\t|_____________|"
        };

static void Main(string[] args)
{
    GenerateMultipleWhat(new[] { 1, 2, 3 });
    Console.ReadKey();
}

static void GenerateMultipleWhat(int[] values)
{
    for (int i = 0; i < what.Length; i++)
    {
        for(int x = 0; x < values.Length; x++)
            Console.Write(what[i] + "{1}", values[x], (x + 1) == values.Length ? "" : "\t");
        Console.WriteLine();
    }
}

结果:

【讨论】:

  • 非常感谢这个很棒的回复,非常适合。
【解决方案2】:

您可能希望将您的 ASCII 艺术作品存储在一个文本文件中,在您的应用程序启动时读取它,然后显示其内容。这将使您的代码更清晰,并使艺术更容易修改。毕竟,大多数游戏都是这样做的:它们不是用代码绘制单个像素,而是从图像和模型文件中加载它们的艺术。

// At startup:
string art = File.ReadAllText("ascii_art.txt");

// whenever you need to display those doors:
Console.WriteLine(string.Format(art, input, input + 1, input + 2));

示例 ascii_art.txt:

 _____   _____   _____
|     | |     | |     |
| {0} | | {1} | | {2} |
|_____| |_____| |_____|

只需确保格式说明符与 string.Format 参数匹配即可。此外,文本文件中的格式说明符为 3 个字符长,但如果将它们替换为单个字符,则布局将混乱。防止这种情况的一种方法是在 string.Format 参数上调用 ToString().PadLeft(3)

【讨论】:

  • 这也是一个很好可行的方法,在这个小项目中我会保持简单,只基于代码文件。在未来,这个想法会更好地保持你所说的代码更干净。感谢您提供此信息;)
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多