All pastes #586058 Raw Edit

Stuff

public text v1 · immutable
#586058 ·published 2007-06-23 16:46 UTC
rendered paste body
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