首页 > 解决方案 > 如何从变量类型 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

标签: arraysvb.netinteger

解决方案


我在这个回复中做了一些假设,因为我不知道你的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

推荐阅读