arrays - 如何从变量类型 integer() 中获取特定值?
问题描述
我需要在二十一点游戏中检查玩家手牌的价值。为此,我找到了用户手的长度,并尝试添加每张卡片的值。但是,此代码在调用时返回错误:
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
类、getHand
方法或getValue
方法是什么样的。
您可能应该做的是获取卡片列表,迭代卡片,并获取当前迭代卡片的值:
Public Shared Function check(p As Player) As Integer
Dim value As Integer = 0
For Each item In p.getHand()
value += item.getValue()
Next
Return value
End Function
或简化:
Public Shared Function check(p As Player) As Integer
Return p.getHand().Sum(Function(item) item.getValue())
End Function