library Hand requires Card
function I2Hand takes integer i returns string
if i == 0 then
return "high card"
elseif i == 1 then
return "pair"
elseif i == 2 then
return "two pair"
elseif i == 3 then
return "three of a kind"
elseif i == 4 then
return "straight"
elseif i == 5 then
return "flush"
elseif i == 6 then
return "full house"
elseif i == 7 then
return "four of a kind"
elseif i == 8 then
return "straight flush"
elseif i == 9 then
return "royal flush"
else
return "error"
endif
endfunction
struct hand
card array c [5]
method toString takes nothing returns string
local string s = ""
local integer i = 0
loop
set s = s + .c[i].toString() + ", "
exitwhen i == 4
set i = i + 1
endloop
return SubString(s, 0, StringLength(s)-2)
endmethod
method isFlush takes nothing returns boolean
local integer i = 1
local integer s = .c[0].s
loop
if .c[i].s != s then
return false
endif
exitwhen i == 4
set i = i + 1
endloop
return true
endmethod
method isPair takes nothing returns boolean
local integer x = 0
local integer y
loop
set y = 0
loop
if .c[x].v == .c[y].v and x != y then
return true
endif
exitwhen y == 4
set y = y + 1
endloop
exitwhen x == 4
set x = x + 1
endloop
return false
endmethod
method isTwoPair takes nothing returns boolean
local integer x = 0
local integer y
local integer c = 0
local integer v = -1
loop
set y = 0
loop
if .c[x].v == .c[y].v and x != y and .c[x].v != v then
set c = c + 1
if c == 2 then
return true
endif
set v = .c[x].v
endif
exitwhen y == 4
set y = y + 1
endloop
exitwhen x == 4
set x = x + 1
endloop
return false
endmethod
method isThreeOfAKind takes nothing returns boolean
local integer v = 0
local integer i
local integer c
loop
set i = 0
set c = 0
loop
if .c[i].v == v then
set c = c + 1
if c == 3 then
return true
endif
endif
exitwhen i == 4
set i = i + 1
endloop
exitwhen v == 12
set v = v + 1
endloop
return false
endmethod
method isFourOfAKind takes nothing returns boolean
local integer v = 0
local integer i
local integer c
loop
set i = 0
set c = 0
loop
if .c[i].v == v then
set c = c + 1
if c == 4 then
return true
endif
endif
exitwhen i == 4
set i = i + 1
endloop
exitwhen v == 12
set v = v + 1
endloop
return false
endmethod
method isFullHouse takes nothing returns boolean
return .isThreeOfAKind() and .isTwoPair()
endmethod
method isStraight takes nothing returns boolean
local integer array v
local integer i = 0
local integer j
local integer t
loop
set v[i] = .c[i].v
if v[i] == 0 then
set v[i] = 13
endif
exitwhen i == 4
set i = i + 1
endloop
set i = 1
loop
set j = i
loop
exitwhen j == 0
if v[j] < v[j] then
set t = v[j]
set v[j] = v[j-1]
set v[j-1] = t
endif
set j = j - 1
endloop
exitwhen i == 4
set i = i + 1
endloop
set i = 0
loop
if v[i] != v[i+1]-1 then
return false
endif
exitwhen i == 3
set i = i + 1
endloop
return true
endmethod
method isStraightFlush takes nothing returns boolean
return .isStraight() and .isFlush()
endmethod
method isRoyalFlush takes nothing returns boolean
local integer array v
local integer i = 0
local integer j
local integer t
// Copy hand and check for flush
loop
if .c[i].s != .c[0].s then
return false
endif
set v[i] = .c[i].v
if v[i] == 0 then
set v[i] = 13
endif
exitwhen i == 4
set i = i + 1
endloop
// Sort hand lowest to highest
set i = 1
loop
set j = i
loop
exitwhen j == 0
if v[j] < v[j] then
set t = v[j]
set v[j] = v[j-1]
set v[j-1] = t
endif
set j = j - 1
endloop
exitwhen i == 4
set i = i + 1
endloop
// Check lowest card is a 10
if v[0] != 9 then
return false
endif
// Check for straight
set i = 0
loop
if v[i] != v[i+1]-1 then
return false
endif
exitwhen i == 3
set i = i + 1
endloop
return true
endmethod
method getRank takes nothing returns integer
if .isRoyalFlush() then
return 9
elseif .isStraightFlush() then
return 8
elseif .isFourOfAKind() then
return 7
elseif .isFullHouse() then
return 6
elseif .isFlush() then
return 5
elseif .isStraight() then
return 4
elseif .isThreeOfAKind() then
return 3
elseif .isTwoPair() then
return 2
elseif .isPair() then
return 1
else
return 0
endif
endmethod
endstruct
endlibrary