【问题标题】:Trying to print a display row-by-row, by adding rows together in a single, multi-line string尝试通过将行添加到单个多行字符串中来逐行打印显示
【发布时间】:2015-04-04 22:53:16
【问题描述】:

我正在尝试打印一系列骰子,显示如下:

   ___     ___     ___     ___     ___
  |*  |   |*  |   |* *|   |*  |   |   |
  |   |   | * |   |* *|   | * |   | * |
  |  *|   |  *|   |* *|   |  *|   |   |
   ^^^     ^^^     ^^^     ^^^     ^^^

这些骰子应该代表我“掷骰子”时产生的数字。我创建了一个 Die 类和一个 Hand 类,它们是在下面生成的。

import random

class Die():

    def __init__(self):
        self.value = random.randint(1,6)

    def roll(self):
        self.value = random.randint(1,6)

    '''def __str__(self):
        return str(self.value)'''

import Die


class Hand:
    def __init__(self):
        self.L=[]
        for i in range(5):
            self.L.append(Die.Die()) #makes the number of dice



    def __str__(self):
        """converts hand to a string for printing"""
        return "{0},{1},{2},{3},{4}".format(self.L[0], self.L[1], self.L[2], self.L[3], self.L[4])

    def roll(self, keep):
        for i in range(5):
            if i+1 not in keep:
                self.L[i].roll()

上面给出的代码会在主文件进入时产生一个数字列表

h = hand.Hand()
h.roll() #this rolls the hand again
print(h)

有什么想法可以让我的结果以提供的显示样式打印吗?有人建议最好的方法是打印三行来构建所有 5 个骰子。 最近的建议是“你必须 逐行构建骰子的整个显示,然后将行加在一起 在单个多行字符串中。”我只是不确定如何执行。

【问题讨论】:

    标签: python arrays string python-3.x rows


    【解决方案1】:

    这是您可以做到的一种方法:

    DIE_PARTS = [
        ['___'] * 6,
        ['   ', '*  ', '*  ', '* *', '* *', '* *'],
        [' * ', '   ', ' * ', '   ', ' * ', '* *'],
        ['   ', '  *', '  *', '* *', '* *', '* *'],
        ['^^^'] * 6,
    ]
    
    DIE_SPACING = ' ' * 3
    
    
    def print_hand(dies):
        # Build line parts
        lines = [[],[],[],[],[]]
        for i,line in enumerate(lines):
            for d in dies:
                if i in [1,2,3]: edge = '|'
                else:            edge = ' '
                part = ''
                part += edge                # Leading edge of die
                part += DIE_PARTS[i][d-1]   # "pips"
                part += edge                # Trailing edge of die
                line.append(part)
    
        # Join lines
        lines = [DIE_SPACING.join(l) for l in lines]
    
        # Print lines
        for l in lines: print(l)
    
    
    print_hand([1,2,3,4,5,6])
    

    输出:

    ___ ___ ___ ___ ___ ___ | | |* | |* | |* *| |* *| |* *| | * | | | | * | | | | * | |* *| | | | *| | *| |* *| |* *| |* *| ^^^ ^^^ ^^^ ^^^ ^^^ ^^^

    如果不清楚,您将逐行构建 5 行输出的每一行,然后为死而死。

    所以它就像

    line 1 - die 1, line 1 - die 2, line 1 - die 3, ... 
    line 2 - die 1, line 2 - die 2, line 2 - die 3, ...
    ...
    line 5 - die 1, line 5 - die 2, line 5 - die 3, ...
    

    然后它使用DIE_SPACING作为分隔符连接行列表的各个部分。

    我将把它集成到您​​的其余代码中,由您自己决定。

    【讨论】:

    • 这很有帮助!谢谢你。我不断收到一条错误消息:line 102, in print_hand part += DIE_PARTS[i][d-1] # "pips" TypeError: unsupported operand type(s) for -: 'str' and 'int' 知道如何让它与字符串一起使用吗?对python还是很陌生..
    • @HRogers 你改变了什么吗?我列出的代码不应该出现这个错误。如果是这样,您可以编辑您的问题以显示您更新的代码吗?
    • 我一直在搞乱它以尝试适应滚动到 print_hand([1,2,3,4,5,6]) 中的手当前作为手类的字符串返回,而不是作为列表,所以我需要弄清楚如何使这两个部分兼容。
    • @HRogers 哦,我明白了。好吧,如果您可以从手牌中列出骰子的值,您可以将其传递给print_hand()——这就是函数所关心的,一个整数列表,其值在 [1,6] 中。
    • 这个问题非常深入,因为 Die 类将每个整数作为一个字符串返回......然后手类生成一个字符串字符串。有什么方法可以更改您建议的解决方案以使用字符串?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多