83 lines
2.3 KiB
Text
83 lines
2.3 KiB
Text
// Playing Cards, main program
|
|
|
|
Call("CREATE_DECK")
|
|
Call("SHUFFLE_DECK")
|
|
#21 = Buf_Switch(Buf_Free) // #21 = players hand, 1st player
|
|
#1 = 5; Call("DEAL_CARDS") // deal 5 cards to player 1
|
|
#22 = Buf_Switch(Buf_Free) // #22 = players hand, 2nd player
|
|
#1 = 5; Call("DEAL_CARDS") // deal 5 cards to player 2
|
|
Buf_Switch(#10) BOF // display the deck
|
|
Return
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Create a deck into a new edit buffer. One text line for each card.
|
|
//
|
|
:CREATE_DECK:
|
|
#10 = Buf_Switch(Buf_Free) // Buffer @(#10) = the deck
|
|
|
|
RS(1, "Diamonds")
|
|
RS(2, "Spades")
|
|
RS(3, "Hearts")
|
|
RS(4, "Clubs")
|
|
|
|
RS(11, " Jack")
|
|
RS(12, "Queen")
|
|
RS(13, " King")
|
|
RS(14, " Ace")
|
|
|
|
for (#1=1; #1<5; #1++) {
|
|
for (#2=2; #2<15; #2++) {
|
|
if (#2 < 11) {
|
|
Num_Ins(#2, NOCR) // pip (2 to 10) as numeric
|
|
} else {
|
|
IT(@(#2)) // pip (11 to 14) as a word
|
|
}
|
|
IT(" of ")
|
|
IT(@(#1)) IN // suit
|
|
}
|
|
}
|
|
Return
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Shuffle the deck using Fisher-Yates algorithm
|
|
//
|
|
:SHUFFLE_DECK:
|
|
Buf_Switch(#10) // the deck
|
|
#90 = Time_Tick // seed for random number generator
|
|
#91 = 51 // random numbers in range 0 to 50
|
|
for (#1=1; #1<52; #1++) {
|
|
Call("RANDOM")
|
|
Goto_Line(Return_Value+1)
|
|
Block_Copy(#1, #1, LINESET+DELETE)
|
|
Reg_Copy(9, 1, DELETE)
|
|
Goto_Line(#1)
|
|
Reg_Ins(9)
|
|
}
|
|
Return
|
|
|
|
//--------------------------------------------------------------
|
|
// Generate random numbers in range 0 <= Return_Value < #91
|
|
// #90 = Seed (0 to 0x7fffffff)
|
|
// #91 = Scaling (0 to 0x10000)
|
|
|
|
:RANDOM:
|
|
#92 = 0x7fffffff / 48271
|
|
#93 = 0x7fffffff % 48271
|
|
#90 = (48271 * (#90 % #92) - #93 * (#90 / #92)) & 0x7fffffff
|
|
Return ((#90 & 0xffff) * #91 / 0x10000)
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Deal #1 cards: move the cards from deck to current edit buffer
|
|
//
|
|
:DEAL_CARDS:
|
|
#11 = Buf_Num // this buffer (players hand)
|
|
Buf_Switch(#10) // the deck
|
|
BOF
|
|
Reg_Copy(9, #1, DELETE) // pull the first #1 cards from the deck
|
|
Buf_Switch(#11) // players hand
|
|
Reg_ins(9) // insert the cards here
|
|
Return
|