代码之家  ›  专栏  ›  技术社区  ›  borgy88

如何在终端中并排绘制卡片对象与堆叠在一起

  •  3
  • borgy88  · 技术社区  · 7 年前

        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 回复  |  直到 7 年前
        1
  •  3
  •   eiko    7 年前

    首先,我要说的是,对于你要做的事情,没有简单的解决方案。终端设计为逐行打印文本,而不是逐列打印。一旦有东西被打印到控制台上,你通常不能再回去修改它。因此,您有两个选择:

    1) 使用ncurses(或类似的库)

    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行,等等。

    希望这有帮助!