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

标签 ruby oop ascii playing-cards

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

    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/

相关文章:

ruby - DataMapper 多对多删除约束

ruby - ruby中类实例变量的垃圾回收

c++ - 为什么 C++ 不能用 "derived class"类型的右值初始化 "super class"类型的变量?

java - 在游戏中已编写的 JPanel 代码之上进行绘制

ruby-on-rails - "Ascii85":String

c - 如何将 char(ASCII 字符)转换为保存在 C 字符串变量中的科学计数法

ruby - 检查 Hiera 值是否存在,如果存在,则将每个值分配给变量

ruby - 为什么范围#include?比大于或小于运算符慢得多

python - 覆盖管理器时如何访问 Django 模型?

c++ - 在 C++ 中的类中定义具有固定大小的 vector ?