RosettaCodeData/Task/Deal-cards-for-FreeCell/PureBasic/deal-cards-for-freecell.basic
2023-07-01 13:44:08 -04:00

47 lines
1.1 KiB
Text

#MaxCardNum = 51 ;zero-based count of cards in a deck
Global deckSize
Global Dim cards(#MaxCardNum) ;card with highest index is at the top of deck
Procedure RNG(seed.q = -1)
Static state.q
If seed >= 0
state = seed
Else
state = (state * 214013 + 2531011) % (1 << 31)
ProcedureReturn state >> 16
EndIf
EndProcedure
Procedure makeDeck(hand)
Protected i, c
For i = 0 To #MaxCardNum: cards(i) = i: Next
RNG(hand) ;set seed value
deckSize = #MaxCardNum
While deckSize
c = RNG() % (deckSize + 1)
Swap cards(c), cards(deckSize)
deckSize - 1
Wend
deckSize = #MaxCardNum
EndProcedure
Procedure showDeck(hand)
Protected i, c
PrintN("Hand #" + Str(hand))
makeDeck(hand)
For i = 0 To #MaxCardNum
c = cards(#MaxCardNum - i)
Print(" " + Mid("A23456789TJQK", (c / 4) + 1, 1) + Mid("CDHS",(c % 4) + 1, 1))
If (i + 1) % 8 = 0 Or i = #MaxCardNum: PrintN(""): EndIf
Next
EndProcedure
If OpenConsole()
showDeck(1)
showDeck(617)
showDeck(11982)
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
CloseConsole()
EndIf