【问题标题】:Need ASCII Playing Cards to Print on One Line需要 ASCII 扑克牌在一行上打印
【发布时间】:2018-12-02 06:40:19
【问题描述】:

我正在尝试让玩家手中的扑克牌打印在一行上,而不是像这样单独打印:

        ┌─────────┐┌─────────┐
        │2        ││4        │
        │         ││         │
        │         ││         │
        │    ♥    ││    ♥    │
        │         ││         │
        │         ││         │
        │        2││        4│
        └─────────┘└─────────┘

我的牌在一个包含脸和花色的元组数组中。

我目前正在使用 IDLE 3.7.0 在 Mac 上工作,因为我知道我的教授将使用它来为我的期末项目评分。我认为任何 Mac/Linux 解决方案都应该可以工作,但我现在对任何事情都持开放态度。

这是创建我的卡片的代码:

deck = [(face, suit)  for face in range(2,15) for suit in ['\u2660','\u2665','\u2666','\u2663']]

这是我打印人脸的代码:

def face_print(card):
face_name = card[0]
if face_name == 11:
    face_name = 'J'
elif face_name == 12:
    face_name = 'Q'
elif face_name == 13:
    face_name ='K'
elif face_name == 14:
    face_name = 'A'

return '%s' % (face_name)

这是我要开始工作的代码:

def hero(playable,dealerHand,nonDealerHand):
    indexDealer = 0
    indexNonDealer = 0
    strNonDealerHand = []
    print(dealerHand)
    for index, card in enumerate(nonDealerHand):
        nonDealerCard = """
 ┌─────────┐
 │{}        │
 │         │
 │         │
 │    {}    │
 │         │
 │         │
 │        {}│                         
 └─────────┘""".format(face_print(card),card[1],face_print(card)).split('\n')

        strNonDealerHand.append(nonDealerCard) 

    print('Your hand: ')
    for i in range(9):
        for index,card in enumerate(strNonDealerHand):
            print(strNonDealerHand[index][i], end = ' ')

不幸的是,这似乎不起作用。

我的输出是这样的:

┌─────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ ┌── ────────┐ │2 │ │3 │ │5 │ │9 │ │Q │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ♦ │ │ ♠ │ │ ♥ │ │ ♠ │ │ ♣ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 2│ │ 3│ │ 5│ │ 9│ │ Q│ └─────────┘ └───────── ┘ └─────────┘ └──────────┘ └──────────┘

我尝试了以下两种建议的解决方案,最终得到了这种输出:

你的手: ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐

         │2        │ │4       │ │6        │ │9       │ │Q       │

         │         │ │        │ │         │ │         │ │        │

         │         │ │        │ │         │ │        │ │        │

         │    ♥    │ │    ♣    │ │    ♠    │ │    ♥    │ │    ♥    │

         │         │ │         │ │         │ │         │ │         │

         │         │ │         │ │         │ │         │ │         │

         │        2│ │        4│ │        6│ │        9│ │        Q│

         └─────────┘ └─────────┘ └─────────┘ └─────────  └─────────┘

我不确定我哪里出错了,但非常感谢任何帮助。

谢谢!!

【问题讨论】:

  • 如果是在 Windows 上,请确保 cmd.exe 窗口属性中的屏幕缓冲区大小足以容纳一整行,否则它将被换行。编辑:另外,您是否忘记在每个for i in range(9): 的末尾添加\n? EDIT2:啊迈克尔也看到了:)
  • 在底部的内部for-loop 之后添加print() 以转到下一行。
  • 您也可以粘贴示例函数调用吗?还有face_print 函数定义。
  • 你好@Jeronimo!我尝试了你的建议,但我最终得到了伸展的卡片。您对如何纠正这个问题有什么建议吗?
  • 你好@MichaelButscher!我尝试了你的建议,但我最终得到了伸展的卡片。您对如何纠正这个问题有什么建议吗?

标签: python python-3.x ascii-art


【解决方案1】:

以下代码应该可以工作(Linux、Python3)

Key 正在使用 zip 功能从每张卡片中一次打印一行。

def hero(playable,dealerHand,nonDealerHand):
    strNonDealerHand = []
    for index, card in enumerate(nonDealerHand):
        nonDealerCard = """
 ┌─────────┐
 │{}        │
 │         │
 │         │
 │    {}    │
 │         │
 │         │
 │        {}│
 └─────────┘""".format(card[0], card[1], card[0]).split('\n')
        strNonDealerHand.append(nonDealerCard)

    print('Your hand: ')

    for i in zip(*strNonDealerHand):
        print(" ".join(i))

hero(1, 'a', [[1, 1], [2, 2], [3, 3]])

示例输出:(注意:它不是打印符号。我猜你缺少的功能正在做这项工作)

Your hand: 

 ┌─────────┐  ┌─────────┐  ┌─────────┐
 │1        │  │2        │  │3        │
 │         │  │         │  │         │
 │         │  │         │  │         │
 │    1    │  │    2    │  │    3    │
 │         │  │         │  │         │
 │         │  │         │  │         │
 │        1│  │        2│  │        3│
 └─────────┘  └─────────┘  └─────────┘

【讨论】:

  • 你好@克里希纳!我尝试了你的建议,但我最终得到了伸展的卡片。我确实尝试过回车,但卡片打印在一条垂直线上但正确。你有什么建议吗?
  • 您是在 Windows 还是 Linux 中运行。你能把你的代码放在tutorialspoint.com/execute_python3_online.php上,这样我们就可以一起工作了
  • 我实际上在 Mac 上运行 IDLE 3.7.0,这可能与 Linux 非常接近。我很快就会在那里拿到我的代码。我需要登录或类似的东西吗?
【解决方案2】:

我最终想通了,而且效果非常好。

这是我的代码:

deck = [(face, suit)  for face in range(2,15) for suit in ['\u2660','\u2665','\u2666','\u2663']]

def deal(deck):
    strNonDealerHand = []
    random.shuffle(deck)
    for i in range(5):
        dealerHand.append(deck.pop())
        dealerHand.sort(key = operator.itemgetter(0))
        nonDealerHand.append(deck.pop())
        nonDealerHand.sort(key = operator.itemgetter(0))

# The idea for this came about from a lot of research to make the cards print as a card and all on one line.
# Some of the inspiration for this code came from here: https://codereview.stackexchange.com/questions/82103/ascii-fication-of-playing-cards
   lines = [[] for i in range(9)]

    for index, card in enumerate(nonDealerHand):
        # add the individual card on a line by line basis
        lines[0].append(str(index + 1) +') '+'┌─────────┐ ')
        lines[1].append('   │{}        │ '.format(face_print(card)))  # use two {} one for char, one for space or char
        lines[2].append('   │         │ ')
        lines[3].append('   │         │ ')
        lines[4].append('   │    {}    │ '.format(card[1]))
        lines[5].append('   │         │ ')
        lines[6].append('   │         │ ')
        lines[7].append('   │        {}│ '.format(face_print(card)))
        lines[8].append('   └─────────┘ ')

    result = []
    for index, line in enumerate(lines):
        result.append(''.join(lines[index]))

    for card in result:
        print(card)

def face_print(card):
    face_name = card[0]
    if face_name == 11:
       face_name = 'J'
    elif face_name == 12:
       face_name = 'Q'
    elif face_name == 13:
       face_name ='K'
   elif face_name == 14:
       face_name = 'A'

    return '%s' % (face_name)

 deal(deck)

这最终完美地展示了我的卡片。不确定这是否是 pythonic,但我愿意接受额外的反馈。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多