- 向下滚动到问题部分查看我的问题*
我的目标是什么
我正试图编写一个程序,为一个简单的双人游戏(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