【问题标题】:How to get a specific value from variable type integer()?如何从变量类型 integer() 中获取特定值?
【发布时间】: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() 使用相同的索引器吗?这听起来很奇怪。可能您想遍历代表当前手牌的卡片集合。

标签: arrays vb.net integer


【解决方案1】:

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

【讨论】:

  • 它返回:“运算符'+'未定义类型'Integer'和'Integer()'。或错误BC30518
  • @ItwasmeDIO - 你能发布getValue 方法的代码吗?
  • 公共只读属性 getValue() As Integer() Get Return Me.value End Get End Property
  • @ItwasmeDIO ... Me.value 是什么?
  • 'Me.value' 是 'Card' 类的一个属性,它存储为 integer()
猜你喜欢
  • 2021-12-24
  • 2014-08-10
  • 2020-02-20
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多