poker_eval 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +56 -0
- data/COPYING.ja +51 -0
- data/Gemfile +4 -0
- data/History.txt +3 -0
- data/README.txt +9 -0
- data/Rakefile +23 -0
- data/VERSION +1 -0
- data/ext/poker_eval_api/extconf.rb +4 -0
- data/ext/poker_eval_api/poker_eval.c +981 -0
- data/lib/poker_eval.rb +76 -0
- data/poker_eval.gemspec +55 -0
- data/tasks/jeweler.rake +25 -0
- data/tasks/native.rake +30 -0
- data/test/test_poker_eval.rb +37 -0
- metadata +82 -0
data/lib/poker_eval.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# support multiple ruby version (fat binaries under windows)
|
2
|
+
begin
|
3
|
+
require 'poker_eval_api'
|
4
|
+
end
|
5
|
+
|
6
|
+
# define version string to be used internally for the Gem by Hoe.
|
7
|
+
class PokerEval
|
8
|
+
module GemVersion
|
9
|
+
VERSION = '0.0.1'
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.best args
|
13
|
+
results = self.eval_hand(args)
|
14
|
+
results["combination"].each_with_index do |i, index|
|
15
|
+
if index > 0
|
16
|
+
results["combination"][index] = self.card2string(i.to_i)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
return results
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.winner args
|
24
|
+
index2index = {}
|
25
|
+
normalized_pockets = []
|
26
|
+
normalized_index = 0
|
27
|
+
pockets = args["pockets"]
|
28
|
+
|
29
|
+
pockets.each_with_index do |pocket, index|
|
30
|
+
if !args["fill_pockets"]
|
31
|
+
if pocket.find_index("__")
|
32
|
+
pockets[index] = []
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
if !pockets[index].empty?
|
37
|
+
normalized_pockets << pockets[index]
|
38
|
+
index2index[index] = normalized_index
|
39
|
+
normalized_index += 1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
args["pockets"] = normalized_pockets
|
44
|
+
results = self.eval(args)
|
45
|
+
|
46
|
+
|
47
|
+
count = results["info"]["samples"]
|
48
|
+
haslopot = results["info"]["haslopot"]
|
49
|
+
hashipot = results["info"]["hashipot"]
|
50
|
+
|
51
|
+
winners = { 'low' => [], 'hi' => [] }
|
52
|
+
|
53
|
+
pockets.each_with_index do |pocket, index|
|
54
|
+
if !index2index[index].nil?
|
55
|
+
result = results["eval"][index2index[index]]
|
56
|
+
if result["winhi"] == 1 or result["tiehi"] == 1
|
57
|
+
winners["hi"] << index
|
58
|
+
end
|
59
|
+
if result["winlo"] == 1 || result["tielo"] == 1
|
60
|
+
winners["low"] << index
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
if !haslopot || winners["low"].empty?
|
66
|
+
winners.delete("low")
|
67
|
+
end
|
68
|
+
|
69
|
+
if !hashipot
|
70
|
+
winners.delete("hi")
|
71
|
+
end
|
72
|
+
|
73
|
+
return winners
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
data/poker_eval.gemspec
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "poker_eval"
|
8
|
+
s.version = "0.0.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Miks Mikelsons"]
|
12
|
+
s.date = "2012-01-04"
|
13
|
+
s.description = "poker evaluation Ruby Interface"
|
14
|
+
s.email = "miks@cube.lv"
|
15
|
+
s.extensions = ["ext/poker_eval_api/extconf.rb"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"README.txt"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
"COPYING",
|
21
|
+
"COPYING.ja",
|
22
|
+
"Gemfile",
|
23
|
+
"History.txt",
|
24
|
+
"README.txt",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"ext/poker_eval_api/extconf.rb",
|
28
|
+
"ext/poker_eval_api/poker_eval.c",
|
29
|
+
"lib/poker_eval.rb",
|
30
|
+
"poker_eval.gemspec",
|
31
|
+
"tasks/jeweler.rake",
|
32
|
+
"tasks/native.rake",
|
33
|
+
"test/test_poker_eval.rb"
|
34
|
+
]
|
35
|
+
s.homepage = "http://cubesystems.lv"
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
s.rubygems_version = "1.8.10"
|
38
|
+
s.summary = "poker evaluation Ruby Interface"
|
39
|
+
|
40
|
+
if s.respond_to? :specification_version then
|
41
|
+
s.specification_version = 3
|
42
|
+
|
43
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_runtime_dependency(%q<jeweler>, [">= 0"])
|
45
|
+
s.add_runtime_dependency(%q<rake-compiler>, [">= 0"])
|
46
|
+
else
|
47
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
48
|
+
s.add_dependency(%q<rake-compiler>, [">= 0"])
|
49
|
+
end
|
50
|
+
else
|
51
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
52
|
+
s.add_dependency(%q<rake-compiler>, [">= 0"])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
data/tasks/jeweler.rake
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
task :release do
|
3
|
+
sh "vim HISTORY.markdown"
|
4
|
+
sh "vim README.markdown"
|
5
|
+
sh "git commit -a -m 'prerelease adjustments'; true"
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'jeweler'
|
9
|
+
jeweler_tasks = Jeweler::Tasks.new do |gem|
|
10
|
+
gem.name = 'poker_eval'
|
11
|
+
gem.summary = 'poker evaluation Ruby Interface'
|
12
|
+
gem.description = gem.summary
|
13
|
+
gem.email = 'miks@cube.lv'
|
14
|
+
gem.homepage = 'http://cubesystems.lv'
|
15
|
+
gem.authors = ['Miks Mikelsons']
|
16
|
+
gem.extensions = FileList['ext/**/extconf.rb']
|
17
|
+
|
18
|
+
gem.files.include('lib/poker_eval.*') # add native stuff
|
19
|
+
end
|
20
|
+
|
21
|
+
$gemspec = jeweler_tasks.gemspec
|
22
|
+
$gemspec.version = jeweler_tasks.jeweler.version
|
23
|
+
|
24
|
+
Jeweler::GemcutterTasks.new
|
25
|
+
|
data/tasks/native.rake
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# use rake-compiler for building the extension
|
2
|
+
require 'rake/extensiontask'
|
3
|
+
|
4
|
+
Rake::ExtensionTask.new('poker_eval_api', $gemspec) do |ext|
|
5
|
+
# automatically add build options to avoid need of manual input
|
6
|
+
# ext.cross_compile = true
|
7
|
+
ext.cross_config_options << "--with-poker-eval-include=/usr/local/include"
|
8
|
+
ext.cross_config_options << "--with-poker-eval-lib=/usr/local/lib/opt"
|
9
|
+
end
|
10
|
+
|
11
|
+
CLEAN.include 'lib/**/*.so'
|
12
|
+
|
13
|
+
# ensure things are compiled prior testing
|
14
|
+
task :test => [:compile]
|
15
|
+
|
16
|
+
# Workaround for rake-compiler, which YAML-dump-loads the
|
17
|
+
# gemspec, which leads to errors since Procs can't be loaded
|
18
|
+
Rake::Task.tasks.each do |task_name|
|
19
|
+
case task_name.to_s
|
20
|
+
when /^native/
|
21
|
+
task_name.prerequisites.unshift("fix_rake_compiler_gemspec_dump")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
task :fix_rake_compiler_gemspec_dump do
|
26
|
+
%w{files extra_rdoc_files test_files}.each do |accessor|
|
27
|
+
$gemspec.send(accessor).instance_eval { @exclude_procs = Array.new }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
# $Id: test.rb 244 2009-02-01 08:43:39Z tommy $
|
3
|
+
|
4
|
+
require "test/unit"
|
5
|
+
require 'ostruct'
|
6
|
+
require "poker_eval"
|
7
|
+
|
8
|
+
class TC_PokerEval < Test::Unit::TestCase
|
9
|
+
def test_eval()
|
10
|
+
pockets = [["tc", "ac"], ["th", "ah"], ["8c", "6h"]]
|
11
|
+
board = ["7h","3s", "2c", "7s", "7d"]
|
12
|
+
game = "holdem"
|
13
|
+
result = PokerEval.eval({"game"=>game, "pockets"=>pockets, "board"=>board, "iterations"=>10000})
|
14
|
+
expect = {"info"=>{"samples"=>10000, "haslopot"=>0, "hashipot"=>1}, "eval"=>[{"scoop"=>0, "winhi"=>0, "losehi"=>0, "tiehi"=>10000, "winlo"=>0, "loselo"=>0, "tielo"=>0, "ev"=>500}, {"scoop"=>0, "winhi"=>0, "losehi"=>0, "tiehi"=>10000, "winlo"=>0, "loselo"=>0, "tielo"=>0, "ev"=>500}, {"scoop"=>0, "winhi"=>0, "losehi"=>10000, "tiehi"=>0, "winlo"=>0, "loselo"=>0, "tielo"=>0, "ev"=>0}]}
|
15
|
+
assert_equal(result, expect);
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_best()
|
19
|
+
hand = ["Ac", "As", "Td", "7s", "7h", "3s", "2c"]
|
20
|
+
side = "hi"
|
21
|
+
result = PokerEval.best({"side"=>side, "hand"=>hand})
|
22
|
+
expect = {"value"=>34363392, "combination"=>["TwoPair", "As", "Ac", "7s", "7h", "Td"]}
|
23
|
+
assert_equal(result, expect);
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_best_board()
|
27
|
+
board = [ 'As', '4d', '6h', '7d', '3c' ]
|
28
|
+
hand = [ '2s', '5s', 'Jd', 'Ks' ]
|
29
|
+
# hand = ["Ac", "As", "Td", "7s", "7h", "3s", "2c"]
|
30
|
+
# board = [ 'As', '4d', '5h', '7d', '9c' ]
|
31
|
+
side = "hi"
|
32
|
+
result = PokerEval.best({"side"=>side, "hand"=>hand, "board" => board})
|
33
|
+
expect = {"value"=>67371008, "combination"=>["Straight", "6h", "5s", "4d", "3c", "2s"]}
|
34
|
+
assert_equal(result, expect);
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: poker_eval
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Miks Mikelsons
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-04 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: jeweler
|
16
|
+
requirement: &70223472571760 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70223472571760
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake-compiler
|
27
|
+
requirement: &70223472571260 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70223472571260
|
36
|
+
description: poker evaluation Ruby Interface
|
37
|
+
email: miks@cube.lv
|
38
|
+
executables: []
|
39
|
+
extensions:
|
40
|
+
- ext/poker_eval_api/extconf.rb
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README.txt
|
43
|
+
files:
|
44
|
+
- COPYING
|
45
|
+
- COPYING.ja
|
46
|
+
- Gemfile
|
47
|
+
- History.txt
|
48
|
+
- README.txt
|
49
|
+
- Rakefile
|
50
|
+
- VERSION
|
51
|
+
- ext/poker_eval_api/extconf.rb
|
52
|
+
- ext/poker_eval_api/poker_eval.c
|
53
|
+
- lib/poker_eval.rb
|
54
|
+
- poker_eval.gemspec
|
55
|
+
- tasks/jeweler.rake
|
56
|
+
- tasks/native.rake
|
57
|
+
- test/test_poker_eval.rb
|
58
|
+
homepage: http://cubesystems.lv
|
59
|
+
licenses: []
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 1.8.10
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: poker evaluation Ruby Interface
|
82
|
+
test_files: []
|