349 lines
8.9 KiB
Text
349 lines
8.9 KiB
Text
include "Tlbx GameplayKit.incl"
|
|
|
|
_window = 1
|
|
|
|
_Deal = 100
|
|
_Four = 101
|
|
_Full = 102
|
|
_flush = 103
|
|
_straight = 104
|
|
_SFlush = 105
|
|
_NewDeck = 106
|
|
|
|
begin globals
|
|
int gOmit(52)
|
|
int gCount = 1
|
|
int gDeck(4,13)
|
|
CFStringRef gSpecial(5)
|
|
bool gInsert = NO
|
|
bool gNewDeck = NO
|
|
end globals
|
|
|
|
local fn Set
|
|
for int x = 1 to 52):gOmit(x) = x:next
|
|
end fn
|
|
|
|
//Ken's code
|
|
local fn MyImageDrawingHandler( r as CGRect, userData as ptr )
|
|
AttributedStringDrawAtPoint( userData, fn CGPointMake(0,0) )
|
|
end fn = YES
|
|
|
|
local fn StringToImage( string as CFStringRef, font as FontRef, color as ColorRef ) as ImageRef
|
|
CFDictionaryRef attributes = @{NSFontAttributeName:font,NSForegroundColorAttributeName:color}
|
|
CFMutableAttributedStringRef aString = fn MutableAttributedStringWithAttributes( string, attributes )
|
|
end fn = fn ImageWithDrawingHandler( fn AttributedStringSize( aString ), NO, @fn MyImageDrawingHandler, aString )
|
|
|
|
local fn ConvertValueToEmoji( value as long ) as CFStringRef
|
|
UInt32 unicodeInt
|
|
ScannerRef scanner = fn ScannerWithString( fn StringWithFormat( @"0x%X", value ) )
|
|
fn ScannerScanHexInt( scanner, @unicodeInt )
|
|
end fn = fn StringWithBytes( @unicodeInt, 4, NSUTF32LittleEndianStringEncoding )
|
|
|
|
void local fn BuildWnd
|
|
int height = 800
|
|
CGrect rr = fn CGRectMake( 0,0,500,height)
|
|
|
|
window _window, @"Assess Poker Hands" , rr
|
|
|
|
rr = fn CGRectMake( 10, 60, 90, 26 )
|
|
button _Four,,,@"4 of kind", rr
|
|
rr = fn CGRectOffset( rr, 90, 0 )
|
|
button _Full,,,@"Full House", rr
|
|
rr = fn CGRectOffset( rr, 90, 0 )
|
|
button _Flush,,,@"Flush", rr
|
|
rr = fn CGRectOffset( rr, 90, 0 )
|
|
button _straight,,,@"Straight", rr
|
|
rr = fn CGRectOffset( rr, 90, 0 )
|
|
button _sFlush,,,@"S Flush", rr
|
|
rr = fn CGRectMake( 120, 20, 100, 26)
|
|
button _Deal,,,@"Deal Hand", rr
|
|
rr = fn CGRectMake( 240, 20, 200, 26)
|
|
checkbox _NewDeck,,,@"New deck each time", rr
|
|
textlabel 2,@"Row of buttons to prove the rare hands assess correctly", ( 40, 90, 380, 26 )
|
|
|
|
end fn
|
|
|
|
void local fn SetDeck
|
|
int x,y
|
|
for x = 1 to 13
|
|
for y = 0 to 3
|
|
gDeck(y,x) = (y*13 + 1) + x - 1
|
|
next
|
|
next
|
|
end fn
|
|
|
|
local fn SetCards
|
|
NSUInteger i, index, c, j = 1
|
|
CFMutableArrayRef NumbArr = fn MutableArrayNew
|
|
|
|
index = 0 : c = 0
|
|
for i = 127137 to 127199
|
|
if ( c == 11 )
|
|
c++
|
|
else
|
|
MutableArrayInsertObjectAtIndex( NumbArr, fn StringWithFormat(@"%ld;%d", i, j), index )
|
|
index++
|
|
c++
|
|
j++
|
|
end if
|
|
if c mod 14 == 0 && i != 127198 then c = 0 : i += 2
|
|
next
|
|
|
|
AppSetProperty( @"Numbers",fn ArrayWithArray( NumbArr ) )
|
|
CFArrayRef Numbers = fn AppProperty( @"Numbers" )
|
|
AppSetProperty( @"NoShuffled",fn ArrayShuffledArray( Numbers ))
|
|
|
|
end fn
|
|
|
|
local fn GetRandomNo as int
|
|
int j,item
|
|
Bool check = NO
|
|
|
|
do
|
|
j = rnd( 52 )
|
|
if gOmit(j) > -1
|
|
item = j
|
|
gOmit(j) = -gOmit(j)
|
|
check = YES
|
|
end if
|
|
until check == YES
|
|
|
|
end fn = item
|
|
|
|
clear local fn AssessHand( cNo(5) as int) as CFStringRef
|
|
CFStringRef answer = @"High Card"
|
|
int x,y,check
|
|
int w,b,col,row,ans(5)
|
|
bool checked
|
|
|
|
//Sort cards lowest to highest
|
|
for x = 1 to 5
|
|
for y = x+1 to 5
|
|
if cNo(y) < cNo(x) then Swap cNo(x), cNo(y)
|
|
next
|
|
next
|
|
|
|
b = 20
|
|
for w = 1 to 5
|
|
for x = 5 to 1 step -1
|
|
for col = 13 to 1 step -1
|
|
for row = 3 to 0 step -1
|
|
if cNo(x) == gDeck(row,col)
|
|
if col < b
|
|
ans(x) = col
|
|
b = 20
|
|
else
|
|
end if
|
|
end if
|
|
next
|
|
next
|
|
next
|
|
next
|
|
for x = 1 to 5
|
|
for y = x+1 to 5
|
|
if ans(y) < ans(x) then Swap ans(x), ans(y)
|
|
next
|
|
next
|
|
|
|
//Check for pair, two pair, three of a kind, Four of a kind
|
|
if ans(1) == ans(2) && ans(2) == ans(3) && ans(3) == ans(4) then answer = @"Four of a Kind":Exit fn = answer
|
|
if ans(2) == ans(3) && ans(3) == ans(4) && ans(4) == ans(5) then answer = @"Four of a Kind":Exit fn = answer
|
|
if ans(1) == ans(2) && ans(2) == ans(3) && ans(4) == ans(5) then answer = @"Full House":Exit fn = answer
|
|
if ans(1) == ans(2) && ans(3) == ans(4) && ans(4) == ans(5) then answer = @"Full House":Exit fn = answer
|
|
if ans(1) == ans(2) && ans(2) == ans(3) then answer = @"three of a kind":Exit fn = answer
|
|
if ans(2) == ans(3) && ans(3) == ans(4) then answer = @"three of a kind":Exit fn = answer
|
|
if ans(3) == ans(4) && ans(4) == ans(5) then answer = @"three of a kind":Exit fn = answer
|
|
if ans(1) == ans(2) && ans(3) == ans(4) then answer = @"two pair":Exit fn = answer
|
|
if ans(1) == ans(2) && ans(4) == ans(5) then answer = @"two pair":Exit fn = answer
|
|
if ans(1) == ans(2)|| ans(3) == ans(2)|| ans(3) == ans(4) || ans(4) == ans(5) then answer = @"Pair":Exit fn = answer
|
|
|
|
|
|
//Check for Straight Flush
|
|
if (cNo(1) < 10 && cNo(1) > 0 ) || (cNo(1) < 23 && cNo(1) > 13) || (cNo(1) < 36 && cNo(1) > 26)|| (cNo(1) < 49 && cNo(1) > 39)
|
|
if cNo(2) != cNo(1) + 1
|
|
else
|
|
if cNo(3) != cNo(2) + 1
|
|
else
|
|
if cNo(4) != cNo(3) + 1
|
|
else
|
|
if cNo(5) != cNo(4) + 1
|
|
else
|
|
answer = @"Straight Flush"
|
|
exit fn = answer
|
|
end if
|
|
end if
|
|
end if
|
|
end if
|
|
end if
|
|
|
|
//Check for flush
|
|
if (cNo(1) < 10 && cNo(1) > 0 ) || (cNo(1) < 23 && cNo(1) > 13) || (cNo(1) < 36 && cNo(1) > 26)|| (cNo(1) < 49 && cNo(1) > 39)
|
|
check = 1
|
|
if (cNo(1) < 10 && cNo(1) > 0 )//Spades
|
|
for x = 2 to 5
|
|
if cNo(x) < 13 && cNo(x) > 0
|
|
check++
|
|
end if
|
|
next
|
|
if check == 5 then answer = @"Flush of Spades" : Exit fn = answer
|
|
end if
|
|
if (cNo(1) < 23 && cNo(1) > 13 )//Hearts
|
|
for x = 2 to 5
|
|
if cNo(x) < 27 && cNo(x) > 13
|
|
check++
|
|
end if
|
|
next
|
|
if check == 5 then answer = @"Flush of Hearts" : Exit fn = answer
|
|
end if
|
|
if (cNo(1) < 36 && cNo(1) > 26)//Diamonds
|
|
for x = 2 to 5
|
|
if cNo(x) < 40 && cNo(x) > 26
|
|
check++
|
|
end if
|
|
next
|
|
if check == 5 then answer = @"Flush of Diamonds" : Exit fn = answer
|
|
end if
|
|
if (cNo(1) < 49 && cNo(1) > 39)//Clubs
|
|
for x = 2 to 5
|
|
if cNo(x) < 53 && cNo(x) > 39
|
|
check++
|
|
end if
|
|
next
|
|
if check == 5 then answer = @"Flush of Clubs" : Exit fn = answer
|
|
end if
|
|
end if
|
|
|
|
//Check for Straight
|
|
//Find lowest card ignoring suit
|
|
|
|
for x = 5 to 2 step -1
|
|
if (ans(x) - ans(x-1)) == 1
|
|
checked = YES
|
|
else
|
|
checked = NO
|
|
exit next
|
|
end if
|
|
next
|
|
if checked == YES
|
|
answer = @"straight"
|
|
end if
|
|
|
|
end fn = answer
|
|
|
|
clear local fn DealHand
|
|
CFArrayRef Numb = fn AppProperty( @"NoShuffled" )
|
|
CFStringRef Ans,card,Number
|
|
int x, item, CardNo(5), y
|
|
CFRange range
|
|
|
|
text @"Menlo", 72, fn ColorText
|
|
|
|
for x = 1 to 5
|
|
do
|
|
if gInsert = YES
|
|
ans = gSpecial(x)
|
|
else
|
|
item = fn GetRandomNo
|
|
Ans = Numb[ item]
|
|
end if
|
|
range = fn StringRangeOfString( Ans, @";" )
|
|
card = fn StringSubstringToIndex( Ans, range.location )
|
|
Number = fn StringSubStringFromIndex( Ans, range.location + 1)
|
|
cardNo(x) = fn StringIntValue( Number )
|
|
y = fn StringIntValue( card)
|
|
until y != 127199
|
|
if y > 127152 && y < 127185 then text,, fn ColorRed else text,,fn ColorBlack
|
|
printf @"%@\b", fn ConvertValueToEmoji( y )
|
|
next
|
|
if gNewDeck == YES then fn Set
|
|
text @"Times",24, fn ColorMagenta
|
|
printf fn AssessHand( cardNo(0))
|
|
printf @""
|
|
text @"Menlo", 72, fn ColorText
|
|
gInsert = NO
|
|
end fn
|
|
|
|
local fn Flush
|
|
gSpecial(1) = @"127155;16"
|
|
gSpecial(2) = @"127160;21"
|
|
gSpecial(3) = @"127153;14"
|
|
gSpecial(4) = @"127158;19"
|
|
gSpecial(5) = @"127163;24"
|
|
end fn
|
|
|
|
local fn Four
|
|
gSpecial(1) = @"127137;1"
|
|
gSpecial(2) = @"127169;27"
|
|
gSpecial(3) = @"127153;14"
|
|
gSpecial(4) = @"127158;19"
|
|
gSpecial(5) = @"127185;40"
|
|
end fn
|
|
|
|
local fn Full
|
|
gSpecial(1) = @"127140;4"
|
|
gSpecial(2) = @"127159;20"
|
|
gSpecial(3) = @"127175;33"
|
|
gSpecial(4) = @"127156;17"
|
|
gSpecial(5) = @"127188;43"
|
|
end fn
|
|
|
|
local fn Straight
|
|
gSpecial(1) = @"127158;19"
|
|
gSpecial(2) = @"127145;9"
|
|
gSpecial(3) = @"127191;46"
|
|
gSpecial(4) = @"127178;36"
|
|
gSpecial(5) = @"127176;34"
|
|
end fn
|
|
|
|
local fn SFlush
|
|
gSpecial(1) = @"127156;17"
|
|
gSpecial(2) = @"127158;19"
|
|
gSpecial(3) = @"127160;21"
|
|
gSpecial(4) = @"127157;18"
|
|
gSpecial(5) = @"127159;20"
|
|
end fn
|
|
|
|
void local fn doDialog(act as long, ref as long, wnd as long )
|
|
select act
|
|
case _btnClick
|
|
select ref
|
|
case _Newdeck
|
|
if fn ButtonState( _NewDeck ) == NSControlStateValueOn then gNewDeck = YES else gNewDeck = NO
|
|
case _Deal
|
|
if gCount < 11
|
|
fn DealHand
|
|
gCount++
|
|
else
|
|
cls
|
|
fn Set
|
|
fn SetDeck
|
|
fn SetCards
|
|
gCount = 1
|
|
end if
|
|
case _Flush
|
|
gInsert = YES
|
|
fn Flush
|
|
case _Four
|
|
gInsert = YES
|
|
fn Four
|
|
case _Full
|
|
gInsert = YES
|
|
fn Full
|
|
case _Straight
|
|
gInsert = YES
|
|
fn Straight
|
|
case _SFlush
|
|
gInsert = YES
|
|
fn SFlush
|
|
end select
|
|
end select
|
|
|
|
end fn
|
|
fn SetDeck
|
|
fn SetCards
|
|
fn BuildWnd
|
|
|
|
|
|
on dialog fn doDialog
|
|
|
|
HandleEvents
|