2

我正在用 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 语句的真正直接的类。然后我意识到这可能会变成一个相当大的方法,并且可能成为调试/维护的噩梦。请记住,它需要在游戏的每个阶段(翻牌前、翻牌前等)循环以收集玩家的动作。

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

我对 Ruby 很陌生,还没有点击“Ruby 方式”来做事。我发现自己正在用另一种语言编写 C# 代码。

你能给我一些关于如何设计解析器的指示,这样它就不会是一大堆 if/else 语句并且更可测试吗?

4

7 回答 7

2

使用树顶

看起来您确实处于临时字符串匹配和 RE 的优点与需要实际解析器的界限之间。

手写解析器没有任何问题,只要你的方法简短,任何给定的方法没有太多复杂性,就可以拥有if解析器所需的全部语句。

我不确定 10 行带有难以理解的正则表达式的代码是否比 30 行好看的代码更好。

现在,Ruby 确实有一个先进的 PEG 解析器生成器。我认为在这种情况下,我不会担心它是否矫枉过正,我会继续使用 Treetop。

于 2009-10-08T16:54:20.423 回答
1

状态机,有人吗?

在玩牌的任何时候,都有一组明确定义的可能下一步行动。我认为您可以将它们封装到state machine中。周围有一些,其中(恐怕没有建议 - 没有足够的经验)是

于 2009-10-08T16:56:58.470 回答
1

您可以查看这个开源扑克游戏手部解析器

看起来他们创建了一个正则表达式的哈希,然后他们可能会迭代正则表达式数据结构。它是一种比解析器更简单的机器,并且可能是一种更轻量级的方法。

于 2009-10-08T13:54:56.153 回答
1

我为 PokerStars 日志文件编写了手牌历史解析器https://github.com/malikbakt/pokerstars

于 2012-03-18T22:08:43.033 回答
0

我有两个不同的指针给你,它们将为你指出解决方案,关于如何以 ruby​​ 方式编写代码。

  • 得到一本红宝石书。ruby 书会有很多例子说明如何用 ruby​​ 方式编写代码。根据我的个人经验,我可以向您推荐 pixake(拼写正确吗?)书:http ://www.ruby-doc.org/docs/ProgrammingRuby/html/index.html
  • 阅读现有的 ruby​​ 代码。你似乎知道足够的红宝石来编写代码?那么你当然应该能够阅读现有的代码。我假设你已经在你的系统上安装了 ruby​​。如果是这样,您会在硬盘上找到大量源代码。如果不只是使用互联网。
于 2009-10-08T21:14:29.697 回答
0

您可能想看看:StringScanner

于 2009-10-08T12:22:34.857 回答
0

我推荐 Martin Fowler 的Refactoring一书(提供死树和电子格式,IIRC)。他涵盖了针对您所询问的设计问题的面向对象的补救措施,所有这些都是在测试驱动的上下文中进行的。这是业内每个人都应该阅读的书籍之一。

于 2009-10-28T19:55:37.090 回答