0

我正在写一个扑克游戏,它会发给你不同的牌,然后将发牌添加到列表中。它是一张卡片列表,每张卡片都有一个值,cardno,它存储了数字,我需要做的是检查列表中的顺子(4、5、6、7、8 的梅花)或满屋( 5梅花,5菱形,7心,7黑桃,7菱形)等等。

这是我的卡片代码:

Public Class card
    Public suite As String
    Public cardlet As String
    Public cardno As Integer
End Class

然后我将它添加到列表中

dim dealtcards as new list(Of card)

所以我需要检查 dealtcards 是否包含一对、两对、三对等。

4

3 回答 3

0

我要做的是创建 lambdas 和字典,其中关键是您拥有的手的类型,而 lambda 是实际用于确定手的时间。

Dim fullHouse = Function(cards as List(of Card)
                     //logic to check
                     return True or False
                End Function

Dim rules as New Dictionary(of String, func(of List(Of Card,Boolean))
rules.Add("FullHouse",fullHouse)

Dim hand as List(of Card)

DIm typeOfHand _
rules.
   Keys.
   Select(Function(k)
             If rules.Item(k)(hand) = True then Return k
             Return string.Empty).
   Where(Function(r) Not String.IsEmptyOrNull(r)).
   FirstOrDefault()

Dim score = hand.Select(h) h.CardNo).Sum()

当然,您可以使用更多 OOP 扩展此示例,但我认为使用函数式方法使用 lambda 和 Linq 将使您的代码更容易理解和维护。

于 2013-09-17T22:56:44.273 回答
0

听起来你需要另一堂课Public Class Hand......

它可以在内部包含一个卡片列表,但重点是它呈现的公共界面。操作卡片列表的方法(添加到手牌,从手牌中移除)和检查手牌“状态”的方法(可以返回已知状态的强类型枚举)。可能与此不同(我的 VB生锈,所以这主要是伪代码):

Public Class Hand
    Private cards As IList(Of card)

    ' A method to add a card to the hand, which should check if the hand can hold another card or not

    ' A method to remove a card from the hand, perhaps?

    ' Other methods representing actions that can be performed, such as folding the hand

    Public Function GetHandStatus As HandStatus
        If HandIsFlush() Then
            Return HandStatus.Flush
        Else If HandIsStraight() Then
            Return HandStatus.Straight
        End IF
    End Function

    Private Function HandIsFlush As Boolean
        ' loop through cards, return true if they are all the same suit
    End Function

    Private Function HandIsStraight As Boolean
        ' iterate through sorted-by-value cards, return false if more than 1 value separates any two
    End Function
End Class

这样做是为了将此应用程序的业务逻辑的每个元素简化为一个单独的函数来处理该逻辑。如果类开始变大,您可以进一步重构它,也许HandStatus从枚举变为抽象类,其中子类表示状态,并将逻辑移到那里。

于 2013-09-17T18:45:17.690 回答
0

你应该做的是创建不同的“功能”,看看一只手是否包含某种组合。您可以使用此函数在数组中搜索值:

Public Shared Function FindValueFromArray(ByVal Values As Object(), ByVal valueToSearch As Object) As Boolean 
    Dim retVal As Boolean = False 
    Dim myArray As Array = DirectCast(Values, Array) 
    If Array.IndexOf(myArray, valueToSearch) <> -1 Then 
        retVal = True 
    End If 
    Return retVal 
End Function 

这里

于 2013-09-17T18:41:11.937 回答