Visual Basic简单纸牌游戏.对评分过程进行编码时遇到问题-初学者


  • 向下滚动到问题部分查看我的问题*

我的目标是什么

我正试图编写一个程序,为一个简单的双人游戏(52张牌,13个可能的名字中的每一个都有4张,所以没有小丑)保持分数。杰克、王后、国王和王牌是我的高牌,有了它们,两个玩家中的一个可以得分。牌组必须洗牌(所以从牌列表中随机选择)。玩家1先转一张牌,然后转玩家B,依此类推。一旦一张牌被使用,它就不能再使用,所以一旦抽到52张牌,游戏就结束了。游戏得分如下:

  • 如果一名玩家交出一张王牌,至少还有4张牌要交出,而接下来的4张牌中没有一张是高牌,则该玩家得4分
  • 如果一个玩家交出了一个国王,至少还有3张牌要交出,而接下来的3张牌都不是高牌,那么该玩家就得3分
  • 如果一名玩家交出一张女王牌,并且至少还有2张牌要交出,而接下来的2张牌都不是高牌,该玩家将得2分
  • 如果一名玩家在至少还有一张牌需要翻牌的情况下翻牌,而下一张牌不是高牌,则该玩家得1分
  • **注:玩家自己的牌也可以推翻之前自己下的高牌。假设玩家1打出一个女王,当再次轮到他时,他打出一个王牌。然后,当王牌被拉下马时,他必须遵守规则,而不是得到2分

它看起来像什么当点击玩家按钮时,相应的列表框中会显示一个卡名(左侧列表框用于玩家1,右侧列表框用于播放器2)。重新启动按钮以重新启动程序。关闭按钮关闭程序,随着游戏的进行和玩家的得分,分数将显示在相应玩家标签的左下角。

游戏示例:

  • 玩家1打出三分
  • 玩家2打出7分
  • 玩家1拉女王-------高牌女王(需要2张非高牌才能得到2分)
  • 玩家2打出8分
  • 1号球员得了5分-------1号球员刚刚得了2分

到目前为止我有什么代码

Public Class Form1
'Variable (make a list)
Dim cards As New List(Of String) From {"two", "two", "two", "two", "three", "three", "three", "three", "four", "four", "four", "four", "five", _
                         "five", "five", "five", "six", "six", "six", "six", "seven", "seven", "seven", "seven", "eight", "eight", _
                         "eight", "eight", "nine", "nine", "nine", "nine", "ten", "ten", "ten", "ten", "jack", "jack", "jack", _
                         "jack", "queen", "queen", "queen", "queen", "king", "king", "king", "king", "ace", "ace", "ace", "ace"}

'What Happens when button 1 is clicked
Private Sub btnPlayer1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPlayer1.Click
    Dim rnd = New Random()                                       'Set rnd as random generator
    If cards.Count > 0 Then                                      'If all cards have been drawn then no more cards can be drawn
        Dim randomcards = cards(rnd.Next(0, cards.Count))        'Set randomcards as one randomly chosen (using rnd) card from cards list
        lstbox1.Items.Add(randomcards)                           'Add 1 randomly chosen card from cards list into lstbox1 each time btnPlayer1 is clicked
        cards.Remove(randomcards)                                'Remove the randomly generated card from cards list to reduce deck size. No card will be picked more than 4 times
    End If
    lstbox1.TopIndex = lstbox1.Items.Count - 1                   'Automatically scroll down lstbox1 each time new item is added so players only see last played card (can still scroll up to see previous cards)
End Sub
'What happens when button 2 is clicked
Private Sub btnPlayer2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPlayer2.Click
    Dim rnd = New Random()                                       'Set rnd as random generator
    If cards.Count > 0 Then                                      'If all cards have been drawn then no more cards can be drawn
        Dim randomcards = cards(rnd.Next(0, cards.Count))        'Set randomcards as one randomly chosen (using rnd) card from cards list
        lstbox2.Items.Add(randomcards)                           'Add 1 randomly chosen card from cards list into lstbox2 each time btnPlayer2 is clicked
        cards.Remove(randomcards)                                'Remove the randomly generated card from cards list to reduce deck size. No card will be picked more than 4 times
    End If
    lstbox2.TopIndex = lstbox2.Items.Count - 1                   'Automatically scroll down lstbox2 each time new item is added so players only see last played card (can still scroll up to see previous cards)
End Sub
'Button to restart program
Private Sub btnRestart_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRestart.Click
    Application.Restart()
End Sub
'Button to close program
Private Sub btnClose_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnClose.Click
    End
End Sub
End Class

我有什么问题?(删除了我能够解决的以前的问题)

  • 我剩下的问题是评分过程。因为我有两个列表框,左边的是玩家A的牌,右边的是玩家B的牌。所以我的问题是:

我如何从两个列表框中检索卡片的绘制数据/顺序(如果绘制顺序为A、B、A、B等),然后将我的评分规则应用于此信用卡订单?(除非不是来自列表框,否则我应该得到我的数据…?)

刚开始请注意,我三周前刚刚开始编程。我从VB开始,一旦我变得更好,我将转到Python。我真的很想在未来成为一名游戏创作者,所以我一直在制作的所有程序都是这样的小游戏(现在超级简单)。现在,我从一个游戏想法开始,画出外观,制定我希望游戏遵循的规则,然后我编码它,尊重我制定的规则。这是我迄今为止最具挑战性的比赛,我已经碰壁了。非常感谢您的帮助:)谢谢!

我稍后会用Comments更新这个答案来解释一切。现在,以下是我如何开始编写你的游戏。我使用控制台应用程序只是因为它是最快的。答案的核心是Deck类,再加上使用Queue(Of T)可以确保每张卡只分发一次。

Public Module Module1
    Public Sub Main()
        Dim PlayDeck As New Queue(Of Deck.Card)
        Dim Deck As New Deck(True)
        Deck.CardList.ForEach(Sub(x) PlayDeck.Enqueue(x))
        Dim player1card As Deck.Card = PlayDeck.Dequeue()
        Dim player2card As Deck.Card = PlayDeck.Dequeue()
        Console.WriteLine(player1card.ToString())
        Console.WriteLine(player2card.ToString())
        Console.ReadLine()
    End Sub
    Public Class Deck
        Public Structure Card
            Public Property Suit As Suits
            Public Property Value As CardValue
            Public Enum Suits
                Hearts = 0
                Spades = 1
                Clubs = 2
                Diamonds = 3
            End Enum
            Public Enum CardValue
                Two = 2
                Three = 3
                Four = 4
                Five = 5
                Six = 6
                Seven = 7
                Eight = 8
                Nine = 9
                Ten = 10
                Jack = 11
                Queen = 12
                King = 13
                Ace = 14
            End Enum
            Public Overrides Function ToString() As String
                Return [Enum].GetName(GetType(CardValue), Me.Value) & " of " & [Enum].GetName(GetType(Suits), Me.Suit)
            End Function
        End Structure
        Public CardList As List(Of Card)
        Public Sub New()
            CardList = New List(Of Card)
            For Each suit As Card.Suits In [Enum].GetValues(GetType(Card.Suits))
                For Each val As Card.CardValue In [Enum].GetValues(GetType(Card.CardValue))
                    CardList.Add(New Card With {.Suit = suit, .Value = val})
                Next
            Next
        End Sub
        Public Sub New(Shuffle As Boolean)
            Me.New()
            If Shuffle Then ShuffleCards()
        End Sub
        Public Sub ShuffleCards()
            Dim csprng As New System.Security.Cryptography.RNGCryptoServiceProvider
            Dim c As Integer = Me.CardList.Count
            While c > 1
                Dim b As Byte() = New Byte(0) {}
                Do
                    csprng.GetBytes(b)
                Loop While Not b(0) < c * (Byte.MaxValue / c)
                Dim k As Integer = (b(0) Mod c)
                c -= 1
                Dim v As Card = Me.CardList(k)
                Me.CardList(k) = Me.CardList(c)
                Me.CardList(c) = v
            End While
        End Sub
    End Class
End Module

相关内容

最新更新