问题标签 [poker]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3699 浏览

java - 扑克游戏:用java创建一副牌

我正在做一个创建扑克游戏的项目。尽管说明很清楚,但我在面向对象编程方面遇到了很多麻烦。

所以对于这个项目,我们必须创建四个对象,Card、Deck、Hand 和 Poker Hand。我已经完成了卡片对象的创建,现在正在处理卡片组对象。这就是我现在遇到麻烦的领域。我试过用谷歌搜索我的问题。但是,由于我是编程新手,所以我并没有真正了解他们的方法。例如,我不知道如何使用 ArrayList。我只知道非常基本的数组方法。

以下代码是我迄今为止为 Deck 对象所做的:

以下是这部分的描述:

Deck 类代表一副 52 张扑克牌。我们将使用一组 Card 对象来管理卡片组中的实际卡片。

下面是类和实例字段,后面是Deck类的方法。按以下顺序完成每个项目。

类常量

声明并初始化以下公共静态类常量: CARDS_IN_DECK - 一个整数值,表示牌组中的牌张数。将此值设置为 52。 SHUFFLE_SWAPS - 一个整数值,表示在洗牌过程中卡片应切换位置的次数。数字越高,牌组的随机性和彻底洗牌就越多。将此值设置为至少 500。 实例字段

声明以下实例字段: Card 对象数组,用于管理卡片组中的 CARDS_IN_DECK 卡片。数组中的每个元素都是一个 Card 对象。一个整数,它保存要从卡片数组中处理的下一张卡片的索引。附带说明一下,这个变量将从 0 开始,每次发牌时增加 1(参见下面的方法)。一个整数变量,用于维护为测试提供的随机种子。方法

以下是您必须完成的方法列表。

public Deck(int seed)- 这是 Deck 类的构造函数。您必须首先使用您的类常量“CARDS_IN_DECK”初始化您的 Card 对象数组以容纳 52 张卡片。初始化数组后,您必须一次遍历一个元素并实际创建一个 Card 对象。必须创建所有卡片(四个花色中的每个花色为 2-14),并且不能有任何重复。种子参数应存储在种子的实例字段中。提示:在此构造函数中使用 Card.CLUBS、Card.LOWEST_VALUE 等。

public void shuffle()- 此方法处理重置牌组以便玩新手。此方法必须通过使用 Random 类来生成随机数来处理牌组的洗牌。您必须随机生成 0-51 之间的两个整数。然后,您必须在这两个位置交换卡片。例如,如果随机数是 20 和 11,Clubs 的 2 在数组的第 20 个元素中,而 Hearts 的 3 在数组的第 11 个元素中,则在这两张牌交换后,元素 20 将保存第 3 个红心和元素 11 将持有梅花 2。您必须重复生成两个数字并在相应位置交换卡片的过程,次数与类常量“SHUFFLE_SWAPS”指示的次数一样多。如果随机种子不是 -1,则您创建的 Random 对象应使用提供的随机种子。这将确保每次使用相同的随机种子运行程序时,牌组都会以相同的方式洗牌。例如,

Random rand = new Random(seed); 如果随机种子为 -1,则创建一个没有种子的 Random 对象,每次玩都会创建不同的游戏。例如,

Random rand = new Random(); 最后,用于从牌堆中选择下一张要发牌的索引必须重置为 0。

public Card nextCard()- 此方法根据实例字段返回一副牌中的下一张牌,该实例字段知道数组中下一张要发牌的位置。在返回卡片之前,请确保更新此编号,以便下次调用该方法时,将返回卡片组中的下一张卡片(将其增加 1)。

public String toString()- 此方法返回 Deck 的 String 表示形式,这将在单元测试中派上用场。提示:为 Card 对象数组中的每个 Card 调用 Card 类的 toString() 方法。


我想我的public Deck (int seed)方法是对的。你能看一下吗?卡片对象的参数为(int value,char suit),所以对于deck,我返回(int,char)。在这种方法之后,我不确定如何从那里开始。有人可以给我一些指示吗?

0 投票
1 回答
216 浏览

iphone - iphone sdk - 扑克赔率计算

我正在使用 xcode 创建扑克手分析器。我使用了specialK手部评估器。在我的项目中包含评估器后,我分离了两个线程(每个线程有 125k 周期)以尝试运行蒙特卡罗模拟以检查每个玩家的获胜百分比......我的问题是 125k x 2 周期大约需要 40在 iphone 4 上运行几秒钟。有人有什么建议吗?

0 投票
5 回答
6574 浏览

java - 比较java中的扑克手

我正在做一个扑克游戏。到目前为止,我一直在比较扑克牌。我对如何做到这一点有一个想法,但我不确定我的代码有什么问题。有人可以指出什么问题吗?

所以让我简要描述一下我的代码在做什么。

我程序的另一部分将遍历我手中的牌,并在一个数组中列出一张牌值的频率。

因此,假设我手中有 c3、h4、d4、s4、2d,我将调用程序的另一部分来读取我手中的牌并返回一个计数数组。上面我手的计数数组将是 [0,0,1,1,3,0,0,0,0,0,0,0,0,0] 所以这个数组的意思是我的手有一个 2、一个 3 和三个 4。

现在这是我试图找到三种类型的方法,它应该为满屋返回 false(即三种类型加一对)

所以我上面要做的是首先,我遍历数组,如果有任何 3。如果有 3,我再次遍历数组,看看是否有 2。如果没有一个2,然后我知道它是三个的一种。如果有一个 2,那么它是满屋,我应该返回 false。我认为我的逻辑是正确的,但是我的代码有问题。

我遇到的第二只手是如何确定我的手是否正好有一对。如果只有一对,它只返回 true。如果有两对等,则返回 false。

对于这个,我正在考虑按降序或升序对数组中的值进行排序。如果我选择降序,我先读取数组,看看有没有2,然后我可以扫描下一个,看看第一个2之后的下一个值是否也是2。如果还有2,那么它将返回错误。

有人可以看看我的代码并指出问题所在吗?非常感谢。

0 投票
12 回答
77191 浏览

java - 最简单的扑克手评估算法

我正在考虑 . 中的扑克手(5 张牌)评估Java。现在我正在寻找简单和清晰,而不是性能和效率。我可能可以编写一个“幼稚”的算法,但它需要大量代码。

我还看到了一些扑克评估库,它们使用散列和按位运算,但它们看起来相当复杂。

扑克手评估的“最干净和最简单”的算法是什么?

0 投票
2 回答
5768 浏览

java - 在 Java 中洗牌

我还有另一个必须做的练习,我真的需要帮助。我什至不知道我的 isFlush 方法是否有效,因为我的牌组似乎没有洗牌和发牌,我完全被卡住了。有人可以帮助我或为我指明正确的方向吗?这是练习:

习题 12.5 这个习题的目的是编写一个程序,生成随机的扑克牌并对其进行分类,以便我们可以估计各种扑克牌的概率。如果您不玩扑克,请不要担心;我会告诉你你需要知道的一切。

一种。作为热身,编写一个程序,使用 shuffleDeck 和 subdeck 生成并打印四张随机扑克手,每手有五张牌。你有得到什么好东西吗?以下是可能的扑克牌,按价值递增顺序排列: 对:两张相同等级的牌 两对:两对相同等级的牌 三类:三张相同等级的牌 顺子:五张等级在同花顺:五张同花色 满堂:三张同花,两张同四张:四张同花顺 同花顺:五张同花顺

湾。编写一个名为 isFlush 的方法,该方法将 Deck 作为参数并返回一个布尔值,指示手牌是否包含同花。

C。编写一个名为 isThreeKind 的方法,该方法接受一只手并返回一个布尔值,指示该手是否包含同类之三。

d。编写一个生成几千手牌的循环,并检查它们是否包含同花或三手同花。估计得到其中一只手的概率。

e. 编写测试其他牌手的方法。有些比其他更容易。您可能会发现编写一些可用于多个测试的通用辅助方法很有用。

F。在一些扑克游戏中,玩家每人得到七张牌,他们与七张中最好的五张组成一手牌。修改您的程序以生成七张牌并重新计算概率。

这是我的代码:

我把我遇到麻烦的部分加粗。我收到错误消息:“需要数组,但找到了 exercise125poker.Deck”。我需要解决这个错误,因为我不知道如何修复它,所以我被卡住了。任何人都可以帮忙吗?

0 投票
2 回答
7316 浏览

c# - 更快的扑克手评估

我正在尝试使用“RayW 手牌评估器”方法来获得卡片组合分数(7 张中的 5 张最佳卡片)。但是,我在使用这种方法时遇到了一些性能问题。据消息人士称——使用这种方法,每秒必须能够评估超过 3 亿只手!我的结果是 1.5 秒内 10 次磨机,这要慢很多倍。

“RayW 手部评估器”背后的理念如下:

二加二评估器由一个包含大约 3200 万个条目(准确地说是 32,487,834 个)的大型查找表组成。为了查找给定的 7 张牌手,您可以在这张表中追踪一条路径,每张牌执行一次查找。当您到达最后一张牌时,所获得的值就是该手牌的官方等值值

这是代码的样子:

}

这就是我测试这种方法的方式:

我相信这个方法最初是用 C++ 实现的,但是 C# 端口应该工作得更快。有什么办法可以在一秒钟内接近至少 1 亿手牌?

到目前为止我尝试了什么:

  • 尝试使用静态和非静态方法 - 没有区别。
  • 尝试使用字典查找而不是数组

    /li>

10 次手的经过时间几乎慢了 6 倍。

  • 据一位人士说 - 他通过删除“不安全”代码将性能提高了 200 个。我尝试做同样的事情,但结果几乎相同。

    /li>

这是报价:

在删除了“不安全”的代码部分并在 c# 版本中进行了一些小调整后,它现在也在 310 mio 左右。

有没有其他方法可以提高这个手牌排名系统的性能?

0 投票
1 回答
439 浏览

java - Java 图像处理

我正在尝试做一个扑克手模拟器。我正在使用 Netbeans,并通过它的 GUI 编辑器创建了一个 JFrame,在其中添加了扑克桌的 JPG。这样做之后,是否可以根据玩家在牌桌JPG上的手牌动态添加JPG?是否可以在另一个上添加 JPG?如果是这样,我如何在 NetBeans 中实现这一点?

我打算做的是显示牌桌上的所有玩家,连同他们的筹码和姓名,并显示他们的行动。所有这些都将在卡片面朝上的情况下完成。模拟器将计算一些赔率,并以 pdf 格式输出一些手牌细节。

我想提一下,这是一个家庭作业项目。

0 投票
3 回答
296 浏览

java - 扑克手经销商的无限循环

我一直在尝试用这种方法让套牌发牌,但是一旦发牌了 52 张牌,它就会进入无限循环。

我知道这是因为我让它生成一个随机数,直到它得到一张尚未设置的卡片,但是一旦设置了所有卡片,条件将永远不会为真,因此是无限循环。

即使我知道我的问题,我也不知道如何解决它。我已经尝试了几个小时。一旦它达到 52 张卡,我想抛出一个豁免,但是一旦它进入无限循环,它就永远不会达到那个 if 语句。

==================================================== ============================

整个代码

导入 java.util.Random;

公共类 DeckOfCards {

==================================================== =================

}

0 投票
2 回答
1669 浏览

theory - 在没有蒙特卡洛/详尽枚举的情况下获得德州扑克的获胜百分比

抱歉,我刚刚开始这个项目,没有任何想法或代码,我问的更多是理论问题而不是编程问题。

似乎每个谷歌搜索都提供相同的响应,并且很难找到这个问题的答案:

有没有一种方法可以在不使用蒙特卡洛/详尽枚举方法的情况下计算德州扑克的获胜百分比(就像他们在黑暗或其他电视扑克赛事之后的扑克中所做的那样)。假设所有牌面朝上,并且我们知道牌组中的每张牌。

其他论坛上的每个回复似乎都是“使用 pokerstove”或类似的东西,我正在寻找编写代码的理论。

谢谢。

0 投票
0 回答
396 浏览

language-agnostic - 扑克跟踪软件如何评估现场手牌

我只是好奇他们是如何制作这种软件的。

他们有吗?

  • 捕获屏幕并使用 OCR 库来跟踪手部
  • 确定手的记忆位置并直接从那里读取

还有什么?

编辑/我的意思是实时跟踪,而不是使用手牌历史