我正在制作面向对象的二十一个游戏。我有一个 Card 类和一个 Deck 类,牌组由卡片对象组成。当玩家展示他们的手牌时,我会在用 ascii 字符表示的卡片对象上调用 to_s 方法。这一切都很好,只是玩家的手会在另一张牌上打印一张牌。想知道我将如何并排打印整只手。我在网上搜索过,除了使用 print 而不是 puts 之外找不到任何其他东西,但这并不能解决我的问题。预先感谢您的任何建议。

    class Card
  attr_reader :value
  def initialize(suit, value)
    @suit = suit
    @value = value
  end

  def to_s
    """
    +-----+
    |#{@value}    |
    |     |
    |  #{@suit}  |
    |     |
    |    #{@value}|
    +-----+
    """
  end
end

示例输出:
Your Hand:

    +-----+
    |Q    |
    |     |
    |  C  |
    |     |
    |    Q|
    +-----+

    +-----+
    |K    |
    |     |
    |  S  |
    |     |
    |    K|
    +-----+
    Your total is 20

最佳答案

首先让我说,对于您正在尝试做的事情,没有简单的解决方案。终端旨在逐行打印文本,而不是逐列打印。一旦某些东西被打印到控制台,你通常不能回去修改它。鉴于此,您有两个选择:

1) 使用 ncurses(或类似的库) :ncurses 是一个用于在终端中创建“gui”应用程序的库。该库将终端视为单元格网格,让开发人员在任何给定时刻指定每个单元格中的每个字符。这为开发人员提供了大量功能,但也迫使您手动添加“传统”终端功能(即接收用户输入和打印输出行)。

2) 缓冲你的字符串并一次打印出来 :即使终端只能逐行打印文本字符串,也没有什么能阻止你拿一堆卡片并手动重新排列它们的字符串,以便它们可以正确打印。这似乎是一项有趣的编程任务,所以我继续尝试了一下:

def display_hand cards
  strings = cards.map { |c| c.to_s.each_line.to_a }
  first, *rest = *strings
  side_by_side = first.zip *rest
  side_by_side.each do |row|
    row.each { |s| print s.chomp }
    print "\n"
  end
end

display_hand [Card.new("A", 1), Card.new("B", 2), Card.new("C", 3)]

此代码采用一组卡片,将它们的字符串表示形式收集到数组中,然后使用 zip 按行对它们进行分组。因此,基本上不是打印卡片 1、卡片 2、卡片 3 等,而是打印所有卡片的第 1 行、所有卡片的第 2 行等。

希望这可以帮助!

关于ruby - 如何在终端中并排绘制卡片对象与堆叠在一起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45573572/

10-13 09:49