VB扑克手评估员

时间:2016-08-05 23:30:35

标签: vb.net

我的班级编程项目是创建一个程序,允许您输入数字和字母来指定卡号和套装(例如2和D = 2的钻石)。

这就是它的样子: Poker

这是我到目前为止的代码:

Public Class frmPoker
    Private Sub btnDisplay_Click(sender As Object, e As EventArgs) Handles btnDisplay.Click
        Dim cards(4) As Integer
        Dim suit(4) As String

        cards(0) = CInt(txtCard1.Text)
        cards(1) = CInt(txtCard2.Text)
        cards(2) = CInt(txtCard3.Text)
        cards(3) = CInt(txtCard4.Text)
        cards(4) = CInt(txtCard5.Text)

        Dim card = From item In cards
                   Select item
                   Distinct

        If card.Count = 4 Then
            txtDisplay.Text = "One Pair"
        ElseIf card.Count = 3 Then
            txtDisplay.Text = "Three of a kind"
        ElseIf card.Count = 2 Then
            txtDisplay.Text = "Four of a kind"
        End If

        suit(0) = txtSuit1.Text
        suit(1) = txtSuit2.Text
        suit(2) = txtSuit3.Text
        suit(3) = txtSuit4.Text
        suit(4) = txtSuit5.Text

        Dim suits = From item In suit
                    Select item
                    Distinct

        If suits.Count = 1 Then
            txtDisplay.Text = "Flush"
        End If

我不确定如何确定满屋和同花顺。此外,如果有两个2和两个3,程序将确定实际上是三个。

1 个答案:

答案 0 :(得分:1)

你永远不应该使用你不理解的代码。例如:

Dim card = From item In cards
           Select item
           Distinct

这会告诉你手中不同的牌,但不会分别有多少牌。手{2, 2, 3, 2, 3}提供与{9, 10, 9, 9, 9}相同的结果。实际上,旅行{3, 3, 3, 2, 7}的结果与2对{3, 3, 2, 2, 7}的结果相同。那里没有足够的信息来满足您的需求。

这是一个替代方案(注意:假设一张5张牌,并且Aces Hi开始):

' dont use 0th; Ace=1 and 14
Dim counts(15) As Int32
' count how many of each rank:
For Each n As Int32 In cards
    counts(n) += 1      
Next

最后,每个元素都会告诉你每个等级有多少。例如,count(2)可以保持值3,表示有3个Deuces。然后迭代数组以评估:

Dim pairs As Int32 = 0
Dim trips As Int32 = 0
Dim quads As Int32 = 0
' count them:
For Each n As Int32 In counts
    If n = 2 Then pairs += 1
    If n = 3 Then trips += 1
    If n = 4 Then quads += 1
Next
Dim Aced = counts(14) > 0

这涵盖了很多人的手。你还需要知道是否有一个Ace,这样你以后可以测试一个轮子({A,2,3,4,5})。冲洗在两个地方发挥作用,所以只需设置一个标志:

Dim Flushed = Suits(0) = Suits(1) AndAlso
              Suits(0) = Suits(2) AndAlso
              Suits(0) = Suits(3) AndAlso
              Suits(0) = Suits(4)

由于必须检查无序集的顺序,所以直接更难做。首先,按顺序查看该序列是否与制造的序列匹配。有些研究需要留给你,但Enumerable会创建比较范围;使用Array.Intersect.SequenceEqual对其进行测试,或者只执行类似Flushed的代码。

如果(成对+旅行+四边形> 0),可以跳过直接和冲洗测试 ,但它们非常简单,只需收集手的所有指标并执行一系列{ {1}}最后的测试使代码更容易调试。

Aces让它变得混乱。如果有Ace,则需要检查Wheel:将count(14)复制到count(1)并将count(14)设置为零。然后再次排序并检查序列。在那之后,只需按从高到低的顺序评估这些变量。这些练习留给学生。