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

用Ruby设计一个扑克解析器

  •  2
  • Kirschstein  · 技术社区  · 16 年前

    我正在用Ruby编写一个小程序来解析一个扑克网站上的手写历史日志。 日志被分成几行,看起来有点像这样:

    Table 123456 NL Hold'em $1/$2
    5 Players
    Seat 3 is the button
    Seat 1: randomGuy112 $152.56
    Seat 2: randomGirl99 $200
    Seat 3: PokerPro $357.12
    Seat 4: FishCake556 $57.19
    Seat 6: MooMoo $188.98
    Dealt to MooMoo [Ah, Ks]
    randomGuy112 folds
    randomGirl99 raises to $7
    
    etc.. etc..
    

    我想在一个对象中总结这些信息,例如, 以不同方式呈现或保存到数据库。 当我最初想到这个问题的时候,我想我只需要一个真正的直进类,包含一些正则表达式和几个if/else语句。然后我意识到这可能会变成一个非常大的方法,并且可能是调试/维护的一个噩梦。记住,它需要在游戏的每个阶段循环(preflop、flop等)来收集玩家的动作。

    我还想用TDD方法来解决这个问题,但是“一长方法”的方法意味着用于检查稍后输入的测试将依赖于早期的测试。

    我对Ruby还不太熟悉,还没有单击“Ruby方式”来做事情。我在写C代码 用另一种语言。

    你能给我一些关于如何设计解析器的提示吗?这样它就不会是一堆乱七八糟的if/else语句和更具可测试性的语句了。

    7 回复  |  直到 13 年前
        1
  •  1
  •   Mike Woodhouse    16 年前

    国家机器,有人吗?

    在玩扑克的任何时候,都有一套明确定义的可能的下一步行动。我想你可以把它们包装成 state machine . 周围有一些,其中(恐怕没有建议——没有足够的经验)是

        2
  •  2
  •   DigitalRoss    16 年前

    使用 Treetop

    它看起来确实在特殊字符串匹配和re匹配的优点之间,以及需要实际的解析器之间。

    手写的解析器没有什么问题,只要您保持方法简短,在任何给定的解析器中都没有太多的复杂性,那么拥有尽可能多的解析器就可以了。 if 按解析器的要求总计语句。

    我不确定10行不可理解的正则表达式是否比30行漂亮的代码更好。

    现在,Ruby有了一个高级的peg解析器生成器。我想在这种情况下,我不会担心它是否被过度杀戮,我只是 go ahead and use Treetop.

        3
  •  1
  •   jrhicks    16 年前

    你可以结账 open source poker game hand parser

    看起来他们创建了一个正则表达式的散列,然后很可能在regex数据结构上迭代。它是一个比解析器更简单的机器,而且可能是一个更轻量的方法。

        4
  •  1
  •   malik    13 年前

    我为Pokerstars日志文件编写了手动历史分析程序 https://github.com/malikbakt/pokerstars

        5
  •  0
  •   rkj    16 年前

    你可能想看看: StringScanner .

        6
  •  0
  •   johannes    16 年前

    我为您提供了两个不同的指针,它将向您指出解决方案,即如何用Ruby方式编写代码。

    • 买一本红宝石书。Ruby书将有很多关于如何用Ruby方式编写代码的例子。从我的个人到期日起,我可以推荐你皮克斯(这个拼写对吗?)书: http://www.ruby-doc.org/docs/ProgrammingRuby/html/index.html
    • 读取现有的Ruby代码。你似乎知道足够的Ruby来编写代码?那么您当然应该能够读取现有的代码。我想您已经在系统上安装了Ruby。如果是这样,您将在硬盘上找到大量的源代码。如果不只是使用互联网。
        7
  •  0
  •   bradheintz    16 年前

    我推荐这本书 重构 作者:Martin Fowler(提供死树和电子格式,IIRC)。他涵盖了面向对象的补救方法,这些都是在测试驱动的环境中针对您所要求的设计问题。这是这个行业的每个人都应该读的书之一。

    推荐文章