【发布时间】:2021-05-22 13:49:38
【问题描述】:
我需要在二十一点游戏中检查玩家手牌的价值。为此,我找到了用户手的长度,并尝试添加每张卡片的值。但是,此代码在调用时返回错误:
System.IndexOutOfRangeException: '索引超出范围 数组。'
我将如何解决这个问题,或者只是想办法检查玩家的手牌价值?
Public Shared Function check(p As Player) As Integer
Dim value As Integer = 0
For i = 0 To p.length - 1
value += p.getHand(i).getValue(i)
Next
Return value
End Function
getHand() 返回“卡片”列表
getValue() 将牌的值(在二十一点中)作为数据类型 integer() 返回(因为二十一点中的 ace 的值)
更新:这是Player 类的代码
Public Class Player
Private name As String
Private hand As New List(Of Card)
Private _hasStuck As Boolean
Public Sub New(aName As String)
Me.name = aName
End Sub
Public ReadOnly Property getName() As String
Get
Return Me.name
End Get
End Property
Public ReadOnly Property getHand() As List(Of Card)
Get
Return Me.hand
End Get
End Property
Public Property hasStuck() As Boolean
Get
Return _hasStuck
End Get
Set(ByVal value As Boolean)
_hasStuck = value
End Set
End Property
Public Function getHandAsString() As String
Return "[" & String.Join(", ", Me.getHand.ConvertAll(Function(c) c.ToString)) & "]"
End Function
Public Function length() As Integer
Return hand.Count
End Function
结束类
更新 #2:这是 Card 类的代码
Public Class Card
Private suit As String
Private faceValue As String
Private value() As Integer
Private image As Bitmap
Public Sub New(aSuit As String, aValue As String, actualValue() As Integer, cardImage As Bitmap)
Me.suit = aSuit
Me.faceValue = aValue
Me.value = actualValue
Me.image = cardImage
End Sub
Private ReadOnly Property getSuit() As String
Get
Return Me.suit
End Get
End Property
Private ReadOnly Property getFaceValue() As String
Get
Return Me.faceValue
End Get
End Property
Public ReadOnly Property getValue() As Integer()
Get
Return Me.value
End Get
End Property
Public ReadOnly Property getImage() As Bitmap
Get
Return Me.image
End Get
End Property
Public Overrides Function ToString() As String
Return getFaceValue & " of " & getSuit
End Function
这是用于创建牌组并为每张牌分配值的函数:
Public Sub createDeck()
Me.theDeck = New List(Of Card)
Dim JQK() As String = {"Jack", "Queen", "King"}
For x As Integer = 1 To 13
Dim face As String = If(x = 1, "Ace", If(x < 11, x.ToString, JQK(x - 11)))
Dim values() As Integer = If(x = 1, New Integer() {1, 11}, If(x < 11, New Integer() {x}, New Integer() {10}))
Me.getDeck.Add(New Card("Hearts", face, values, New Bitmap("deck\card" & (x + 25).ToString & ".png")))
Me.getDeck.Add(New Card("Diamonds", face, values, New Bitmap("deck\card" & (x + 38).ToString & ".png")))
Me.getDeck.Add(New Card("Clubs", face, values, New Bitmap("deck\card" & (x - 1).ToString & ".png")))
Me.getDeck.Add(New Card("Spades", face, values, New Bitmap("deck\card" & (x + 12).ToString & ".png")))
Next
Me.shuffleDeck()
End Sub
【问题讨论】:
-
在不知道
Player类的情况下,很难猜出可能的陷阱。也许你想分享Player。 -
您确定可以为
getHand()和getValue()使用相同的索引器吗?这听起来很奇怪。可能您想遍历代表当前手牌的卡片集合。