如何格式化代码以每次都以相同的宽度打印?

How do I format code to print with the same width every time?

我正在制作游戏,想知道是否有办法让 python 打印出看起来像这样的地图,并且在打印最终结果时看起来还不错?它应该是基于文本的游戏中的房间地图。我可以用命令格式化它吗?我只试过:

print("|------------------------------|")#print room map
print("|   [Chest]                 |")
print("|                            _ |")
print("|                       Door|")
print("|                             _|")
print("|   [Table]                 |")
print("|  (You)                     |")
print("|------------------------------|")#print room map

可以预见,上面的打印:

>>> print_room()
|------------------------------|
|   [Chest]                 |
|                            _ |
|                       Door|
|                             _|
|   [Table]                 |
|  (You)                     |
|------------------------------|

然而,在我的 IDE 中,每一行看起来都在同一个地方终止。我该如何编写代码才能保证线条的宽度都相同?我希望它打印成这样:

|---------------------|
|                     |
|                     |
|                     |
|                     |
|---------------------|

您可以尝试使用多行字符串,即。用三引号括起来的字符串可以超过一行。所以你可以这样做:

map = """
                        |---------------------|
                        |                     |
                        |                     |
                        |                     |
                        |                     |
                        |---------------------|"""
print(map)

你是这个意思吗?

编辑:在您的代码中,您似乎还没有在添加 "table" 等后调整具有正确数量 space 的行。如果您有相同的代码,但添加再添加一些 spaces,您也可以按照自己的方式使用它。您将其保存在脚本中,然后 运行 它,对吗?不是在解释器中尝试吗?最后,专业提示:在终端中,每个字符占用一个相同宽度的space,即
.....
的宽度相同 MMMMM 因为在每种情况下它的字符数都相同。

您使用什么文本编辑器编写代码?我怀疑您正在使用诸如 Word 或写字板之类的使用比例字体的东西。

我建议切换到专用的代码编辑器,例如 Notepad++ or UltraEdit,或者,最坏的情况是记事本。为文本文件制作的编辑器,使用固定字体,如 Courier。这将使您更容易排列地图的线条,还有许多其他好处。

注意到 Stack Overflow 如何使用固定字体了吗?它表明您每行的空格数不正确。你的代码,正确间隔,看起来像你想要的:

print("|------------------------------|")#print room map
print("|   [Chest]                    |")
print("|                            _ |")
print("|                          Door|")
print("|                             _|")
print("|   [Table]                    |")
print("|  (You)                       |")
print("|------------------------------|")#print room map

你的基本问题是每行的长度必须相同。可能干扰此的事情:

  • 字体可能会显示不同宽度的不同字符。通常 'Terminal' windows 将使用固定宽度的字体:每个字符、space 等具有完全相同的宽度。 'Higher level'编辑(如Word)会使用变宽字体,因为这样会更美观,审美用途更广
  • 您对字符串所做的操作可能会改变实际长度。正如您在提供的示例中看到的,不同数量的字符将以不同的宽度显示。因此,您的编程挑战是确保每条线的宽度相同。

您应该如何确保构建您的字符串变得聪明。

让我们从基本的房间字符串、箱子和门开始:

room = "|                     |"
chest = "[Chest]"
door = "Door"

现在让我们编写一个在特定位置插入对象的函数:

def insert_object(new_object: str, position: int) -> str:
    room_start = room[0:position]
    end_position = position + len(new_object)
    room_end = room[end_position:]
    new_room = room_start + new_object + room_end
    return new_room

这让我们得到这样的结果:

>>> room = "|                     |"
>>> chest = "[Chest]"
>>> door = "Door"
>>> def insert_object(new_object: str, position: int) -> str:
...     room_start = room[0:position]  # Gets the part of the room before the 'object'
...     end_position = position + len(new_object)  # Gets the position after the object 'ends'
...     room_end = room[end_position:]  # Gets the part of the room after the object 'ends'
...     new_room = room_start + new_object + room_end  # Pieces these parts together, with the object in the middle
...     return new_room  # Returns the result
... 
>>> x = insert_object(chest, 3)
>>> print(x)
'|  [Chest]            |'

为每个 'row' 的房间执行此操作以插入一个项目,并且您可以保持宽度不变!

room = "|                     |"
chest = "[Chest]"
door = "Door"
wall = "---------------------"
trap = "-"
you = "You"
table = "[Table]"

def print_room():
    print(insert_object(wall,1))
    print(insert_object(chest,3))
    print(insert_object(trap,20))
    print(insert_object(door,18))
    print(insert_object(trap,21))
    print(insert_object(table,4))
    print(insert_object(you,3))
    print(insert_object(wall,1))

导致:

>>> print_room()
|---------------------|
|  [Chest]            |
|                   - |
|                 Door|
|                    -|
|   [Table]           |
|  You                |
|---------------------|