Hey Jakobsen, sjov opgave så jeg kunne ikke lade være med at kode det hele. Hvis du gerne vil prøve selv, kan du nøjes med at kigge på min tekst for inspiration, og vente med koden til senere sammenligninger.
----
Jeg ville bruge Objekt Orienteret Programmering (OOP), og lave et 'Class Module' kaldet "clsDealer". Denne klasse skulle så indeholde de basale funktioner som kortgiveren skal benytte sig af. Det vil sige ting som at skaffe et sæt kort, blande dem, og trække kort.
For ikke at undgå besværret med at tjekke hvilke kort der var tilbage, ville jeg lade hvert kort være et objekt for sig. Alle disse objekter kunne så samles i en 'Collection' kaldet "Deck". Når dette sæt kort skulle blandes, ville man bare kunne trække tilfældige kort fra bunken, over i en ny bunke, som man da ville tage i anvendelse.
Med mindre du har tænkt dig at vise kortene grafisk, ville jeg også anbefale et 'Module' til at omskrive mellem den notation mennesker foretrækker, og den computeren bedst kan arbejde med. Det er klart for enhver, hvilket kort der har hvilken værdi, men at tillægge værdier til kortenes kulør kan være et problem. Derfor ville jeg klart lave en 'public enum', så programmøren aldrig behøver at tænker over andet end kulørernes navne. Dette samlede modul kunne du kalde "modNotations".
Hvis du er interesseret, kunne den beskrevne kode se ud som følger. Der er færre kommentare end jeg plejer, så jeg håber du finder koden lige så selvforklarende som mig.
clsDealer
Option Explicit
Private Deck As Collection
Public Function DrawCard() As String
If Deck.Count = 0 Then
DrawCard = ""
Else
DrawCard = Deck.Item(Deck.Count())
Deck.Remove Deck.Count()
End If
End Function
Public Sub ShuffleDeck(Optional Rate As Integer = 0)
Dim TempDeck As Collection
Set TempDeck = New Collection
Randomize Now + Rate
Dim RandItem As Integer
While Deck.Count <> 0
RandItem = Rnd() * (Deck.Count() - 1) + 1
TempDeck.Add Deck(RandItem)
Deck.Remove RandItem
Wend
Set Deck = Nothing
Set Deck = TempDeck
Set TempDeck = Nothing
End Sub
Private Sub Class_Initialize()
Dim J As Byte
Dim I As en_Suits
'Make the deck
Set Deck = New Collection
'Fill the deck
For I = 0 To 3
For J = 1 To 13
Deck.Add CardNotation(J, I)
Next J
Next I
End Sub
Private Sub Class_Terminate()
'Clean up memory
Set Deck = Nothing
End Sub
modNotations
Option Explicit
Public Enum en_Suits
Club = 0
Diamond
Hearts
Spades
End Enum
Public Function CardVal(StrNotation As String) As Byte
Select Case Left(StrNotation, 1)
Case "A":
CardVal = 1
Case 2 To 9:
CardVal = CInt(Left$(StrNotation, 1))
Case "T":
CardVal = 10
Case "J":
CardVal = 11
Case "Q":
CardVal = 12
Case "K":
CardVal = 13
End Select
End Function
Public Function CardSuit(StrNotation As String) As en_Suits
Select Case Right$(StrNotation, 1)
Case "C":
CardSuit = en_Suits.Club
Case "D":
CardSuit = en_Suits.Diamond
Case "H":
CardSuit = en_Suits.Hearts
Case "S":
CardSuit = en_Suits.Spades
End Select
End Function
Public Function CardNotation(Value As Byte, Suit As en_Suits) As String
Select Case Value
Case 1:
CardNotation = "A"
Case 2 To 9:
CardNotation = CStr(Value)
Case 10:
CardNotation = "T"
Case 11:
CardNotation = "J"
Case 12:
CardNotation = "Q"
Case 13:
CardNotation = "K"
End Select
Select Case Suit
Case en_Suits.Club:
CardNotation = CardNotation + "C"
Case en_Suits.Diamond:
CardNotation = CardNotation + "D"
Case en_Suits.Hearts:
CardNotation = CardNotation + "H"
Case en_Suits.Spades:
CardNotation = CardNotation + "S"
End Select
End Function