【问题标题】:Data structures for a Blackjack game二十一点游戏的数据结构
【发布时间】:2011-06-30 21:40:56
【问题描述】:

我正在尝试学习如何使用 Ruby,作为我的第一个应用程序,我想构建一个基于控制台的二十一点游戏。

我对 Ruby 结构不太熟悉,我学习并感到宾至如归的唯一方法就是构建东西并从错误中吸取教训。

我正在考虑创建一个 Card 类,并且有一个 Stack 类有一个 Card 集合。

但是我并不确切知道我需要使用什么内置类型来保存这些 Card 对象。

这是我的卡片类:

class Card

  attr_accessor :number, :suit

  def initialize(number, suit)
    @number = number
    @suit = suit
  end

  def to_s
    "#{@number} of #{@suit}"
  end
end

由于我来自 C#,所以我想到了使用 List Cards {get;set;} 之类的东西——在 Ruby 中是否存在这样的东西,或者也许有更好的更 ruby​​esque 的方式来做到这一点。

【问题讨论】:

  • 您切换到 Ruby 是一个非常好的决定。你会爱上你的生活。 :)
  • @Radek S:我真的很喜欢使用这门语言,我迫不及待想要达到我对用 Ruby 做任何事情充满信心的最佳位置。
  • “我无法忍受当我寻找一个错误 10 分钟却发现这是一个愚蠢的错字。”这是一般的编程,不限于 Ruby 或任何一种特定语言。
  • @the Tin Man:在 C# 或 Java 这样的语言中并非如此,因为编译会告诉你事情发生的确切位置。
  • 我决定开始学习 Python 而不是 Ruby,因为我不想成为一个自命不凡的混蛋。

标签: ruby data-structures blackjack


【解决方案1】:

Ruby 是一种动态语言,因此它通常不依赖于严格的编译时类型检查,从而使模板化 List<Card> 等构造变得毫无用处。 Ruby 通常具有一种通用的有序集合数据类型 - Array,它非常类似于 Java/C# 的 ArrayList 概念。

因此,除非您希望 Stack 具有特殊意义,否则您可以按原样使用 Array

@stack = []
@stack << Card.new(6, :spades)
@stack << Card.new(10, :hearts)

或以某种方式扩展Array

class Stack < Array
  # some ultra-cool new methods
end

@stack = Stack.new
@stack << Card.new(...)

【讨论】:

  • 您会推荐哪种方法?此外,究竟是什么:黑桃和:心 - 请不要假设以前的知识我是新人!谢谢!
  • 语法:spades是一个符号文字,类似于"spades"的字符串文字。然而,符号在 Ruby 中是不可变的,通常用作特别的描述性常量。
  • 请注意,从核心语言类子类化通常不是一个好主意。例如,调用some = @stack.select{ ... } 将返回一个数组,而不是一个新的Stack 实例。相反,最好(更强大和可控)包装和委托您需要的类的实例。
  • @Phrogz - 你说得对,这是一个哲学问题 - 选择的结果应该保留原始Stack 类型的属性,或者它应该成为一个通用的Array。例如,如果Stack 实例在游戏中具有某些意义(例如,如果游戏包含堆栈计数器,因此创建新的Stack 会增加它),那么很可能不想生成Stack不受控制的实例。
  • @Sergio Tapia:如果我是你,我现在就坚持使用Array,因为你可以随时切换到使用更自定义的类实现堆栈,而无需任何苛刻的 API 更改,如果你'以后会觉得有必要这样做。
【解决方案2】:

Ruby 的内置 Array 类型具有类似堆栈的方法:

a = [1, 2, 3]  # arrays can be initialized with []
a.push(4)      # a is now [1, 2, 3, 4]
a.pop          # returns 4, a is now [1, 2, 3]

【讨论】:

    【解决方案3】:

    两集 Ruby Quiz 专门针对二十一点。第二个的解决方案可能会给你一些想法:http://www.rubyquiz.com/quiz151.html

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2020-05-18
      • 1970-01-01
      • 2014-10-22
      • 2022-11-12
      • 2015-06-02
      • 1970-01-01
      • 2012-10-16
      • 2017-12-01
      相关资源
      最近更新 更多