console-poker 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +89 -0
- data/LICENSE +21 -0
- data/README.md +25 -0
- data/Rakefile +5 -0
- data/bin/console-poker +5 -0
- data/console-poker.gemspec +26 -0
- data/lib/poker/card.rb +34 -0
- data/lib/poker/deck.rb +75 -0
- data/lib/poker/format.rb +8 -0
- data/lib/poker/hand.rb +141 -0
- data/lib/poker/hand_ranker.rb +87 -0
- data/lib/poker/menus.rb +71 -0
- data/lib/poker/utils.rb +44 -0
- data/lib/poker.rb +98 -0
- data/poker.txt +1 -0
- data/spec/factories/card_factory.rb +79 -0
- data/spec/factories/deck_factory.rb +14 -0
- data/spec/factories/hand_factory.rb +131 -0
- data/spec/factories/poker_factory.rb +17 -0
- data/spec/lib/poker/card_spec.rb +44 -0
- data/spec/lib/poker/deck_spec.rb +114 -0
- data/spec/lib/poker/format_spec.rb +10 -0
- data/spec/lib/poker/hand_ranker_spec.rb +130 -0
- data/spec/lib/poker/hand_spec.rb +277 -0
- data/spec/lib/poker_spec.rb +536 -0
- data/spec/spec_helper.rb +35 -0
- data/ss1.png +0 -0
- data/ss2.png +0 -0
- data/tags +73 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2e70a169233864f5e2a074a20109adc0136b6a6a9e81d6877b90e37233390238
|
4
|
+
data.tar.gz: 16c18c8cee66bfe98d0a186faa7830f8c6dd0564f1ac0b0c4957fb489f0141e3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6c47146c022d7b5fdfb414b70c73d4355f38e5797be22c8dd485784d0be1c3a12e05d2e8b80972ec0aea9ffa2064894a3a449a66fe31baa578fc0046167e095e
|
7
|
+
data.tar.gz: 7444d0f39a2e31863afe4a42a96c66911d3424176431138b6f0adda77aa2a4b685cccc03f7dbc6160ce1f69f52d9fd4819a302363fb7c285305320ec3d2eed32
|
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
ruby '3.1.2'
|
4
|
+
|
5
|
+
source 'https://rubygems.org'
|
6
|
+
|
7
|
+
gem 'factory_bot'
|
8
|
+
gem 'pry'
|
9
|
+
gem 'rake'
|
10
|
+
gem 'rspec'
|
11
|
+
gem 'rubocop', require: false
|
12
|
+
gem 'rubocop-rake'
|
13
|
+
gem 'rubocop-rspec'
|
14
|
+
gem 'simplecov', require: false
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activesupport (7.0.4)
|
5
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
6
|
+
i18n (>= 1.6, < 2)
|
7
|
+
minitest (>= 5.1)
|
8
|
+
tzinfo (~> 2.0)
|
9
|
+
ast (2.4.2)
|
10
|
+
coderay (1.1.3)
|
11
|
+
concurrent-ruby (1.1.10)
|
12
|
+
diff-lcs (1.5.0)
|
13
|
+
docile (1.4.0)
|
14
|
+
factory_bot (6.2.1)
|
15
|
+
activesupport (>= 5.0.0)
|
16
|
+
i18n (1.12.0)
|
17
|
+
concurrent-ruby (~> 1.0)
|
18
|
+
json (2.6.2)
|
19
|
+
method_source (1.0.0)
|
20
|
+
minitest (5.16.3)
|
21
|
+
parallel (1.22.1)
|
22
|
+
parser (3.1.2.1)
|
23
|
+
ast (~> 2.4.1)
|
24
|
+
pry (0.14.1)
|
25
|
+
coderay (~> 1.1)
|
26
|
+
method_source (~> 1.0)
|
27
|
+
rainbow (3.1.1)
|
28
|
+
rake (13.0.6)
|
29
|
+
regexp_parser (2.5.0)
|
30
|
+
rexml (3.2.5)
|
31
|
+
rspec (3.11.0)
|
32
|
+
rspec-core (~> 3.11.0)
|
33
|
+
rspec-expectations (~> 3.11.0)
|
34
|
+
rspec-mocks (~> 3.11.0)
|
35
|
+
rspec-core (3.11.0)
|
36
|
+
rspec-support (~> 3.11.0)
|
37
|
+
rspec-expectations (3.11.0)
|
38
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
39
|
+
rspec-support (~> 3.11.0)
|
40
|
+
rspec-mocks (3.11.1)
|
41
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
42
|
+
rspec-support (~> 3.11.0)
|
43
|
+
rspec-support (3.11.0)
|
44
|
+
rubocop (1.36.0)
|
45
|
+
json (~> 2.3)
|
46
|
+
parallel (~> 1.10)
|
47
|
+
parser (>= 3.1.2.1)
|
48
|
+
rainbow (>= 2.2.2, < 4.0)
|
49
|
+
regexp_parser (>= 1.8, < 3.0)
|
50
|
+
rexml (>= 3.2.5, < 4.0)
|
51
|
+
rubocop-ast (>= 1.20.1, < 2.0)
|
52
|
+
ruby-progressbar (~> 1.7)
|
53
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
54
|
+
rubocop-ast (1.21.0)
|
55
|
+
parser (>= 3.1.1.0)
|
56
|
+
rubocop-rake (0.6.0)
|
57
|
+
rubocop (~> 1.0)
|
58
|
+
rubocop-rspec (2.12.1)
|
59
|
+
rubocop (~> 1.31)
|
60
|
+
ruby-progressbar (1.11.0)
|
61
|
+
simplecov (0.21.2)
|
62
|
+
docile (~> 1.1)
|
63
|
+
simplecov-html (~> 0.11)
|
64
|
+
simplecov_json_formatter (~> 0.1)
|
65
|
+
simplecov-html (0.12.3)
|
66
|
+
simplecov_json_formatter (0.1.4)
|
67
|
+
tzinfo (2.0.5)
|
68
|
+
concurrent-ruby (~> 1.0)
|
69
|
+
unicode-display_width (2.2.0)
|
70
|
+
|
71
|
+
PLATFORMS
|
72
|
+
arm64-darwin-21
|
73
|
+
x86_64-linux
|
74
|
+
|
75
|
+
DEPENDENCIES
|
76
|
+
factory_bot
|
77
|
+
pry
|
78
|
+
rake
|
79
|
+
rspec
|
80
|
+
rubocop
|
81
|
+
rubocop-rake
|
82
|
+
rubocop-rspec
|
83
|
+
simplecov
|
84
|
+
|
85
|
+
RUBY VERSION
|
86
|
+
ruby 3.1.2p20
|
87
|
+
|
88
|
+
BUNDLED WITH
|
89
|
+
2.3.15
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2022 Greg Donald
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# console-poker-ruby
|
2
|
+
|
3
|
+
![Poker](https://raw.githubusercontent.com/gdonald/console-poker-ruby/main/ss1.png)
|
4
|
+
|
5
|
+
![Poker](https://raw.githubusercontent.com/gdonald/console-poker-ruby/main/ss2.png)
|
6
|
+
|
7
|
+
## Getting Started
|
8
|
+
|
9
|
+
Install:
|
10
|
+
|
11
|
+
gem install console-poker
|
12
|
+
|
13
|
+
Run:
|
14
|
+
|
15
|
+
console-poker
|
16
|
+
|
17
|
+
## Status
|
18
|
+
|
19
|
+
[![Ruby](https://github.com/gdonald/console-poker-ruby/workflows/Ruby/badge.svg)](https://github.com/gdonald/console-poker-ruby/actions)
|
20
|
+
[![Downloads](https://ruby-gem-downloads-badge.herokuapp.com/console-poker?color=blue&type=total&total_label=)](https://rubygems.org/gems/console-poker)
|
21
|
+
|
22
|
+
## License
|
23
|
+
|
24
|
+
[![GitHub](https://img.shields.io/github/license/gdonald/console-poker-ruby?color=aa0000)](https://github.com/gdonald/console-poker-ruby/blob/main/LICENSE)
|
25
|
+
|
data/Rakefile
ADDED
data/bin/console-poker
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.required_ruby_version = '>= 3.1'
|
7
|
+
spec.name = 'console-poker'
|
8
|
+
spec.version = '1.0.0'
|
9
|
+
spec.summary = 'Console Poker'
|
10
|
+
spec.description = 'Poker for your console, full version.'
|
11
|
+
spec.author = 'Greg Donald'
|
12
|
+
spec.email = 'gdonald@gmail.com'
|
13
|
+
spec.bindir = 'bin'
|
14
|
+
spec.executables << 'console-poker'
|
15
|
+
spec.files = FileList['lib/**/*.rb',
|
16
|
+
'bin/*',
|
17
|
+
'[A-Z]*',
|
18
|
+
'spec/**/*.rb'].to_a
|
19
|
+
spec.homepage = 'https://github.com/gdonald/console-poker-ruby'
|
20
|
+
spec.metadata = {
|
21
|
+
'source_code_uri' => 'https://github.com/gdonald/console-poker-ruby',
|
22
|
+
'rubygems_mfa_required' => 'true'
|
23
|
+
}
|
24
|
+
spec.license = 'MIT'
|
25
|
+
spec.post_install_message = "\nType `console-poker` to run!\n\n"
|
26
|
+
end
|
data/lib/poker/card.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Card
|
4
|
+
attr_reader :poker, :value, :suit
|
5
|
+
|
6
|
+
def initialize(poker, value, suit)
|
7
|
+
@poker = poker
|
8
|
+
@value = value
|
9
|
+
@suit = suit
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_s
|
13
|
+
return Card.faces[value][suit] if poker.face_type == 1
|
14
|
+
|
15
|
+
Card.faces2[value][suit]
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.faces
|
19
|
+
[%w[🂡 🂱 🃁 🃑], %w[🂢 🂲 🃂 🃒], %w[🂣 🂳 🃃 🃓], %w[🂤 🂴 🃄 🃔],
|
20
|
+
%w[🂥 🂵 🃅 🃕], %w[🂦 🂶 🃆 🃖], %w[🂧 🂷 🃇 🃗], %w[🂨 🂸 🃈 🃘],
|
21
|
+
%w[🂩 🂹 🃉 🃙], %w[🂪 🂺 🃊 🃚], %w[🂫 🂻 🃋 🃛], %w[🂭 🂽 🃍 🃝],
|
22
|
+
%w[🂮 🂾 🃎 🃞], %w[🂠]]
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.faces2
|
26
|
+
[%w[A♠ A♥ A♣ A♦], %w[2♠ 2♥ 2♣ 2♦],
|
27
|
+
%w[3♠ 3♥ 3♣ 3♦], %w[4♠ 4♥ 4♣ 4♦],
|
28
|
+
%w[5♠ 5♥ 5♣ 5♦], %w[6♠ 6♥ 6♣ 6♦],
|
29
|
+
%w[7♠ 7♥ 7♣ 7♦], %w[8♠ 8♥ 8♣ 8♦],
|
30
|
+
%w[9♠ 9♥ 9♣ 9♦], %w[T♠ T♥ T♣ T♦],
|
31
|
+
%w[J♠ J♥ J♣ J♦], %w[Q♠ Q♥ Q♣ Q♦],
|
32
|
+
%w[K♠ K♥ K♣ K♦], %w[??]]
|
33
|
+
end
|
34
|
+
end
|
data/lib/poker/deck.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'card'
|
4
|
+
|
5
|
+
DECKS = {
|
6
|
+
1 => :regular,
|
7
|
+
2 => :aces,
|
8
|
+
3 => :jacks,
|
9
|
+
4 => :aces_jacks,
|
10
|
+
5 => :sevens,
|
11
|
+
6 => :eights
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
class Deck
|
15
|
+
TOTAL_CARDS = 52
|
16
|
+
|
17
|
+
attr_accessor :poker, :cards
|
18
|
+
|
19
|
+
def initialize(poker)
|
20
|
+
@poker = poker
|
21
|
+
@cards = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def shuffle
|
25
|
+
7.times { cards.shuffle! }
|
26
|
+
end
|
27
|
+
|
28
|
+
def new_regular
|
29
|
+
self.cards = []
|
30
|
+
4.times do |suit_value|
|
31
|
+
13.times do |value|
|
32
|
+
cards << Card.new(poker, value, suit_value)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
shuffle
|
36
|
+
end
|
37
|
+
|
38
|
+
def new_irregular(values = [])
|
39
|
+
self.cards = []
|
40
|
+
while cards.count < TOTAL_CARDS
|
41
|
+
4.times do |suit_value|
|
42
|
+
next if cards.count >= TOTAL_CARDS
|
43
|
+
|
44
|
+
values.each do |value|
|
45
|
+
cards << Card.new(poker, value, suit_value)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
shuffle
|
50
|
+
end
|
51
|
+
|
52
|
+
def new_aces
|
53
|
+
new_irregular([0])
|
54
|
+
end
|
55
|
+
|
56
|
+
def new_jacks
|
57
|
+
new_irregular([10])
|
58
|
+
end
|
59
|
+
|
60
|
+
def new_aces_jacks
|
61
|
+
new_irregular([0, 10])
|
62
|
+
end
|
63
|
+
|
64
|
+
def new_sevens
|
65
|
+
new_irregular([6])
|
66
|
+
end
|
67
|
+
|
68
|
+
def new_eights
|
69
|
+
new_irregular([7])
|
70
|
+
end
|
71
|
+
|
72
|
+
def next_card
|
73
|
+
cards.shift
|
74
|
+
end
|
75
|
+
end
|
data/lib/poker/format.rb
ADDED
data/lib/poker/hand.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'hand_ranker'
|
4
|
+
|
5
|
+
class Hand
|
6
|
+
PAYOUT = {
|
7
|
+
royal_flush: 800,
|
8
|
+
straight_flush: 50,
|
9
|
+
four_of_a_kind: 25,
|
10
|
+
full_house: 9,
|
11
|
+
flush: 6,
|
12
|
+
straight: 4,
|
13
|
+
three_of_a_kind: 3,
|
14
|
+
two_pair: 2,
|
15
|
+
one_pair: 1
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
attr_accessor :poker, :bet, :result, :cards, :rank, :current_card, :discards
|
19
|
+
|
20
|
+
def initialize(poker, bet)
|
21
|
+
@poker = poker
|
22
|
+
@bet = bet
|
23
|
+
@result = nil
|
24
|
+
@cards = []
|
25
|
+
@discards = []
|
26
|
+
@current_card = 0
|
27
|
+
@rank = :unknown
|
28
|
+
end
|
29
|
+
|
30
|
+
def deal_card
|
31
|
+
cards << poker.deck.next_card
|
32
|
+
end
|
33
|
+
|
34
|
+
def pay
|
35
|
+
return if result
|
36
|
+
|
37
|
+
HandRanker.new(self)
|
38
|
+
|
39
|
+
self.result = rank == :unknown ? -bet : PAYOUT[rank] * bet
|
40
|
+
poker.money += result
|
41
|
+
end
|
42
|
+
|
43
|
+
def draw
|
44
|
+
out = String.new(' ')
|
45
|
+
out << draw_cards
|
46
|
+
out << draw_money
|
47
|
+
out << draw_card_selector
|
48
|
+
out << "\n\n"
|
49
|
+
out
|
50
|
+
end
|
51
|
+
|
52
|
+
def draw_card_selector
|
53
|
+
space = poker.face_type == 2 ? ' ' : ' '
|
54
|
+
|
55
|
+
out = String.new("\n ")
|
56
|
+
5.times do |i|
|
57
|
+
out << (current_card == i ? '⇑' : ' ')
|
58
|
+
out << space
|
59
|
+
end
|
60
|
+
out
|
61
|
+
end
|
62
|
+
|
63
|
+
def draw_money
|
64
|
+
out = String.new('')
|
65
|
+
out << (result.negative? ? '-' : '+') if result
|
66
|
+
out << '$' << Format.money((result || bet).abs / 100.0)
|
67
|
+
out << ' '
|
68
|
+
out
|
69
|
+
end
|
70
|
+
|
71
|
+
def draw_cards
|
72
|
+
faces = poker.face_type == 2 ? Card.faces2 : Card.faces
|
73
|
+
card_back = faces[13][0]
|
74
|
+
|
75
|
+
out = String.new('')
|
76
|
+
5.times do |i|
|
77
|
+
out << (discards.include?(i) ? card_back : cards[i].to_s)
|
78
|
+
out << ' '
|
79
|
+
end
|
80
|
+
out << rank_display
|
81
|
+
out
|
82
|
+
end
|
83
|
+
|
84
|
+
def rank_display
|
85
|
+
if rank == :unknown
|
86
|
+
' '
|
87
|
+
else
|
88
|
+
rank_name = rank.to_s.split(/ |_/).map(&:capitalize).join(' ')
|
89
|
+
" ⇒ #{rank_name} "
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def ask_hand_action
|
94
|
+
puts ' (K) Keep (D) Discard (N) Next (P) Prev (X) Draw'
|
95
|
+
c = Poker.getc($stdin)
|
96
|
+
case c
|
97
|
+
when 'k'
|
98
|
+
discards.delete(current_card)
|
99
|
+
self.current_card = current_card.succ
|
100
|
+
clear_draw_hand_actions
|
101
|
+
when 'd'
|
102
|
+
discards << current_card unless discards.include?(current_card)
|
103
|
+
self.current_card = current_card.succ
|
104
|
+
clear_draw_hand_actions
|
105
|
+
when 'n'
|
106
|
+
self.current_card = current_card.succ
|
107
|
+
clear_draw_hand_actions
|
108
|
+
when 'p'
|
109
|
+
self.current_card = current_card.pred
|
110
|
+
clear_draw_hand_actions
|
111
|
+
when 'x'
|
112
|
+
self.current_card = nil
|
113
|
+
replace_discards
|
114
|
+
pay
|
115
|
+
else
|
116
|
+
clear_draw_hand_actions
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def clear_draw_hand_actions
|
121
|
+
normalize_current_card
|
122
|
+
poker.clear
|
123
|
+
poker.draw_hand
|
124
|
+
ask_hand_action
|
125
|
+
end
|
126
|
+
|
127
|
+
def normalize_current_card
|
128
|
+
self.current_card = 0 if current_card.negative?
|
129
|
+
self.current_card = 4 if current_card > 4
|
130
|
+
end
|
131
|
+
|
132
|
+
def replace_discards
|
133
|
+
5.times do |i|
|
134
|
+
next unless discards.include?(i)
|
135
|
+
|
136
|
+
cards[i] = poker.deck.next_card
|
137
|
+
end
|
138
|
+
|
139
|
+
discards.clear
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class HandRanker
|
4
|
+
attr_reader :hand, :vals
|
5
|
+
|
6
|
+
def initialize(hand)
|
7
|
+
@hand = hand
|
8
|
+
@vals = hand.cards.map(&:value).compact.sort
|
9
|
+
raise ArgumentError, 'hand must have exactly five Cards' unless vals.count == 5
|
10
|
+
|
11
|
+
hand.rank = rank_hand
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def rank_hand
|
17
|
+
if royal_flush?
|
18
|
+
:royal_flush
|
19
|
+
elsif straight_flush?
|
20
|
+
:straight_flush
|
21
|
+
elsif four_of_a_kind?
|
22
|
+
:four_of_a_kind
|
23
|
+
elsif full_house?
|
24
|
+
:full_house
|
25
|
+
elsif flush?
|
26
|
+
:flush
|
27
|
+
elsif straight?
|
28
|
+
:straight
|
29
|
+
elsif three_of_a_kind?
|
30
|
+
:three_of_a_kind
|
31
|
+
elsif two_pair?
|
32
|
+
:two_pair
|
33
|
+
elsif one_pair?
|
34
|
+
:one_pair
|
35
|
+
else
|
36
|
+
:unknown
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def royal_flush?
|
41
|
+
flush? && vals == [0, 9, 10, 11, 12]
|
42
|
+
end
|
43
|
+
|
44
|
+
def straight_flush?
|
45
|
+
flush? && straight?
|
46
|
+
end
|
47
|
+
|
48
|
+
def four_of_a_kind?
|
49
|
+
uniq_count_one?(vals, 0, 1, 2, 3) || uniq_count_one?(vals, 1, 2, 3, 4)
|
50
|
+
end
|
51
|
+
|
52
|
+
def full_house?
|
53
|
+
(uniq_count_one?(vals, 0, 1, 2) && uniq_count_one?(vals, 3, 4)) ||
|
54
|
+
(uniq_count_one?(vals, 0, 1) && uniq_count_one?(vals, 2, 3, 4))
|
55
|
+
end
|
56
|
+
|
57
|
+
def flush?
|
58
|
+
hand.cards.map(&:suit).uniq.count == 1
|
59
|
+
end
|
60
|
+
|
61
|
+
def straight?
|
62
|
+
vals == [vals[0], vals[0] + 1, vals[0] + 2, vals[0] + 3, vals[0] + 4]
|
63
|
+
end
|
64
|
+
|
65
|
+
def three_of_a_kind?
|
66
|
+
uniq_count_one?(vals, 0, 1, 2) ||
|
67
|
+
uniq_count_one?(vals, 1, 2, 3) ||
|
68
|
+
uniq_count_one?(vals, 2, 3, 4)
|
69
|
+
end
|
70
|
+
|
71
|
+
def two_pair?
|
72
|
+
(uniq_count_one?(vals, 0, 1) && uniq_count_one?(vals, 2, 3)) ||
|
73
|
+
(uniq_count_one?(vals, 0, 1) && uniq_count_one?(vals, 3, 4)) ||
|
74
|
+
(uniq_count_one?(vals, 1, 2) && uniq_count_one?(vals, 3, 4))
|
75
|
+
end
|
76
|
+
|
77
|
+
def one_pair?
|
78
|
+
uniq_count_one?(vals, 0, 1) ||
|
79
|
+
uniq_count_one?(vals, 1, 2) ||
|
80
|
+
uniq_count_one?(vals, 2, 3) ||
|
81
|
+
uniq_count_one?(vals, 3, 4)
|
82
|
+
end
|
83
|
+
|
84
|
+
def uniq_count_one?(array, *args)
|
85
|
+
array.values_at(*args).uniq.count == 1
|
86
|
+
end
|
87
|
+
end
|
data/lib/poker/menus.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Menus
|
4
|
+
def draw_bet_options
|
5
|
+
puts ' (D) Deal Hand (B) Change Bet (O) Options (Q) Quit'
|
6
|
+
c = Poker.getc($stdin)
|
7
|
+
case c
|
8
|
+
when 'd'
|
9
|
+
deal_new_hand
|
10
|
+
when 'b'
|
11
|
+
new_bet($stdin)
|
12
|
+
when 'o'
|
13
|
+
clear_draw_hand_game_options
|
14
|
+
when 'q'
|
15
|
+
self.quitting = true
|
16
|
+
else
|
17
|
+
clear_draw_hand_bet_options
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def new_face_type
|
22
|
+
puts ' (1) 🂡 (2) A♠'
|
23
|
+
loop do
|
24
|
+
c = Poker.getc($stdin).to_i
|
25
|
+
case c
|
26
|
+
when (1..2)
|
27
|
+
self.face_type = c
|
28
|
+
save_game
|
29
|
+
else
|
30
|
+
clear_draw_hand_new_face_type
|
31
|
+
end
|
32
|
+
break if (1..2).include?(c)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def new_deck_type
|
37
|
+
puts ' (1) Regular (2) Aces (3) Jacks (4) Aces & Jacks (5) Sevens (6) Eights'
|
38
|
+
loop do
|
39
|
+
c = Poker.getc($stdin).to_i
|
40
|
+
case c
|
41
|
+
when (1..6)
|
42
|
+
self.deck_type = c
|
43
|
+
deck.send("new_#{DECKS[c]}")
|
44
|
+
save_game
|
45
|
+
else
|
46
|
+
clear_draw_hand_new_deck_type
|
47
|
+
end
|
48
|
+
break if (1..6).include?(c)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def draw_game_options
|
53
|
+
puts ' (T) Deck Type (F) Face Type (B) Back'
|
54
|
+
loop do
|
55
|
+
c = Poker.getc($stdin)
|
56
|
+
case c
|
57
|
+
when 't'
|
58
|
+
clear_draw_hand_new_deck_type
|
59
|
+
clear_draw_hand_bet_options
|
60
|
+
when 'f'
|
61
|
+
clear_draw_hand_new_face_type
|
62
|
+
clear_draw_hand_bet_options
|
63
|
+
when 'b'
|
64
|
+
clear_draw_hand_bet_options
|
65
|
+
else
|
66
|
+
clear_draw_hand_game_options
|
67
|
+
end
|
68
|
+
break if %w[t b f].include?(c)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/poker/utils.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Utils
|
4
|
+
def load_game
|
5
|
+
return unless File.readable?(SAVE_FILE)
|
6
|
+
|
7
|
+
a = File.read(SAVE_FILE).split('|')
|
8
|
+
self.deck_type = a[0].to_i
|
9
|
+
self.face_type = a[1].to_i
|
10
|
+
self.money = a[2].to_i
|
11
|
+
self.current_bet = a[3].to_i
|
12
|
+
end
|
13
|
+
|
14
|
+
def save_game
|
15
|
+
File.open(SAVE_FILE, 'w') do |file|
|
16
|
+
file.puts "#{deck_type}|#{face_type}|#{money}|#{current_bet}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def clear_draw_hand
|
21
|
+
clear
|
22
|
+
draw_hand
|
23
|
+
end
|
24
|
+
|
25
|
+
def clear_draw_hand_new_deck_type
|
26
|
+
clear_draw_hand
|
27
|
+
new_deck_type
|
28
|
+
end
|
29
|
+
|
30
|
+
def clear_draw_hand_new_face_type
|
31
|
+
clear_draw_hand
|
32
|
+
new_face_type
|
33
|
+
end
|
34
|
+
|
35
|
+
def clear_draw_hand_bet_options
|
36
|
+
clear_draw_hand
|
37
|
+
draw_bet_options
|
38
|
+
end
|
39
|
+
|
40
|
+
def clear_draw_hand_game_options
|
41
|
+
clear_draw_hand
|
42
|
+
draw_game_options
|
43
|
+
end
|
44
|
+
end
|