Python 如何正确打印ASCII艺术?

Python 如何正确打印ASCII艺术?,python,Python,我正在制作一个基于文本的rpg/冒险游戏,我想添加一些ASCII艺术。我对多行字符串使用了三个引号,如下所示: print(""" /\ /\ /\ /\ /**\ /**\

我正在制作一个基于文本的rpg/冒险游戏,我想添加一些ASCII艺术。我对多行字符串使用了三个引号,如下所示:

    print("""
                   /\                       /\                        /\                       /\
                  /**\                     /**\                      /**\                     /**\
                 /****\   /\      /\      /****\   /\               /****\   /\      /\      /****\   /\
                /      \ /**\    /  \    /      \ /**\             /      \ /**\    /  \    /      \ /**\
               /  /\    /    \  /    \  /  /\    /    \    /\     /  /\    /    \  /    \  /  /\    /    \
              /  /  \  /      \/      \/  /  \  /      \  /  \   /  /  \  /      \/      \/  /  \  /      \
             /  /    \/ /\     \      /  /    \/ /\     \/     \/  /    \/ /\     \      /  /    \/ /\     \
            /  /      \/  \/\   \    /  /      \/  \/\   \     /  /      \/  \/\   \    /  /      \/  \/\   \
         __/__/_______/___/__\___\__/__/_______/___/__\___\___/__/_______/___/__\___\__/__/_______/___/__\___\_
    """)
理想情况下,这就是我运行程序时的样子

但是,它看起来是这样的,一点也不理想,看起来非常凌乱:

我想知道是否有人能为我指出解决这个问题的正确方向。提前谢谢

您应该输入字符串,如下所示:

#     v
print(r"""
                   /\                       /\                        /\                       /\
                  /**\                     /**\                      /**\                     /**\
                 /****\   /\      /\      /****\   /\               /****\   /\      /\      /****\   /\
                /      \ /**\    /  \    /      \ /**\             /      \ /**\    /  \    /      \ /**\
               /  /\    /    \  /    \  /  /\    /    \    /\     /  /\    /    \  /    \  /  /\    /    \
              /  /  \  /      \/      \/  /  \  /      \  /  \   /  /  \  /      \/      \/  /  \  /      \
             /  /    \/ /\     \      /  /    \/ /\     \/     \/  /    \/ /\     \      /  /    \/ /\     \
            /  /      \/  \/\   \    /  /      \/  \/\   \     /  /      \/  \/\   \    /  /      \/  \/\   \
         __/__/_______/___/__\___\__/__/_______/___/__\___\___/__/_______/___/__\___\__/__/_______/___/__\___\_
    """)
这是因为反斜杠“\”是Python字符串中的一个字符。

您应该创建字符串,如下所示:

#     v
print(r"""
                   /\                       /\                        /\                       /\
                  /**\                     /**\                      /**\                     /**\
                 /****\   /\      /\      /****\   /\               /****\   /\      /\      /****\   /\
                /      \ /**\    /  \    /      \ /**\             /      \ /**\    /  \    /      \ /**\
               /  /\    /    \  /    \  /  /\    /    \    /\     /  /\    /    \  /    \  /  /\    /    \
              /  /  \  /      \/      \/  /  \  /      \  /  \   /  /  \  /      \/      \/  /  \  /      \
             /  /    \/ /\     \      /  /    \/ /\     \/     \/  /    \/ /\     \      /  /    \/ /\     \
            /  /      \/  \/\   \    /  /      \/  \/\   \     /  /      \/  \/\   \    /  /      \/  \/\   \
         __/__/_______/___/__\___\__/__/_______/___/__\___\___/__/_______/___/__\___\__/__/_______/___/__\___\_
    """)

这是因为反斜杠“\”是Python字符串中的一个字符。

代码中的主要问题是,行尾的
\
被解释为行的延续,因此下一行只是连接到上一行

可以通过在反斜杠后面的行末尾添加任何字符来避免这种情况,例如空格(因为只有当反斜杠是行中的最后一个字符时才会触发行继续)

另一种解决方案是使用原始字符串,以“
r”“”…
开头。如中所述:

具体来说,原始文字不能以单个反斜杠结尾(因为 反斜杠将转义以下引号字符) 单个反斜杠后跟换行符被解释为 两个字符作为文字的一部分,而不是作为行的延续。(强调我的)


这也将防止任何可能以反斜杠开头的转义序列被解释为反斜杠。

代码中的主要问题是,行尾的
\
被解释为行的延续,因此下一行只是连接到上一行

可以通过在反斜杠后面的行末尾添加任何字符来避免这种情况,例如空格(因为只有当反斜杠是行中的最后一个字符时才会触发行继续)

另一种解决方案是使用原始字符串,以
r”“…
开头。如下列文件所述:

具体来说,原始文字不能以单个反斜杠结尾(因为 反斜杠将转义以下引号字符)。也请注意 单个反斜杠后跟换行符被解释为 两个字符作为文字的一部分,而不是作为行的延续。(强调我的)


这也将防止任何以反斜杠开头的潜在转义序列被解释为反斜杠。

除了其他答案之外,另一个可能会搞乱ASCII艺术的东西是缩进,例如:

print(““”这三行
应该开始
在同一地方(“))
将输出:

these 3 lines
         should start
         in the same place
these 3 lines
    should start
    in the same place
要解决此问题,您需要执行以下操作:

print(““”这三行
应该开始
在同一地方(“))
但是如果print语句缩进,它仍然不起作用

范围(1)内的i的
:
打印这三行(“”)
应该开始
在同一地方(“))
将输出:

these 3 lines
         should start
         in the same place
these 3 lines
    should start
    in the same place
要解决此问题,字符串应始终从行的开头开始,而不考虑缩进,如下所示:

范围(1)内的i的
:
打印这三行(“”)
应该开始
在同一地方(“))

但是这很难看。

除了其他答案之外,另一个可能会搞乱ASCII艺术的东西是缩进,例如:

print(““”这三行
应该开始
在同一地方(“))
将输出:

these 3 lines
         should start
         in the same place
these 3 lines
    should start
    in the same place
要解决此问题,您需要执行以下操作:

print(““”这三行
应该开始
在同一地方(“))
但是如果print语句缩进,它仍然不起作用

范围(1)内的i的
:
打印这三行(“”)
应该开始
在同一地方(“))
将输出:

these 3 lines
         should start
         in the same place
these 3 lines
    should start
    in the same place
要解决此问题,字符串应始终从行的开头开始,而不考虑缩进,如下所示:

范围(1)内的i的
:
打印这三行(“”)
应该开始
在同一地方(“))

但这很难看。

不,这就解决了问题!谢谢我只是想知道
repr
做什么。除此之外,我会接受它,但Stackoverflow希望我等10分钟。哦,好的,这是有道理的。喜欢原始文本吗?酷。谢谢你的帮助!我将来会记住这一点use@some_user_3是的,例如(在编写一些LaTeX时),它非常有用,等等。
r
代表“raw”,使其成为“raw string literal”;它与
repr
功能完全无关。)不,那就解决问题了!谢谢我只是想知道
repr
做什么。除此之外,我会接受它,但Stackoverflow希望我等10分钟。哦,好的,这是有道理的。喜欢原始文本吗?酷。谢谢你的帮助!我将来会记住这一点use@some_user_3是的,例如(在编写一些LaTeX时),它非常有用,等等。
r
代表“raw”,使其成为“raw string literal”;它与
repr
功能完全无关。()我重新打开了你的问题,添加了一个解释代码中特定问题的答案,以及出现问题的原因-你选择的重复是关于不必要的编码,并没有真正解决这个问题。我重新打开了你的问题,添加了一个解释代码中特定问题的答案,发生这种情况的原因是——您选择的复制是关于不必要的编码,并没有真正解决这个问题。