-
Notifications
You must be signed in to change notification settings - Fork 0
/
black_jack.rb
212 lines (181 loc) · 4.97 KB
/
black_jack.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
# coding=utf-8
# Blackjack game
# General output
def say(str)
"=> #{str}"
end
# Error output
def error_prompt(str)
"** Your input is incorrect, #{str}"
end
# Create and shuffle new decks
def shuffle_card(cards, value, suit)
suit.each do |ele1|
value.each do |ele2|
cards.push(suit: ele1, value: ele2)
end
end
cards = cards * 4
cards.shuffle!
end
# Calculate points of current cards on hand
def check_points(cards)
points = []
point = 0
cards.each do |card|
if %w(J K Q).include?(card[:value])
point += 10
elsif card[:value] == 'A'
point += 11
else
point += card[:value].to_i
end
end
points << point if point <= 21
cards.select { |ele| ele[:value] == 'A' }.count.times do
point -= 10
points << point if point <= 21
end
points
end
# List detail cards info
def show_cards(gamer, name)
puts say("#{name} cards on hand list below:")
gamer.each do |card|
puts "[#{card[:suit]} #{card[:value]}]"
end
end
# Main
name = ''
value = %w(A 2 3 4 5 6 7 8 9 J Q K)
suit = %w(S H D C)
deck_cards = []
loop do
puts say('Please input your name')
name = gets.chomp
if name == 'dealer'
puts error_prompt('Name can not be dealer!')
elsif !name.empty?
break
else
puts error_prompt('Name can not be null!')
end
end
puts say("Welcome to the Blackjack game, #{name}")
loop do
player = []
dealer = []
player_point = []
dealer_point = []
new_card = {}
flag = false # whether game is over
# when cards less than half, change new decks
if deck_cards.size <= 104
puts say('Change new decks and shuffle.')
deck_cards = shuffle_card(deck_cards, value, suit)
end
puts say("Deal 2 cards to #{name} and dealer")
2.times do
player << deck_cards.pop
dealer << deck_cards.pop
end
player_point = check_points(player)
dealer_point = check_points(dealer)
# Check if any side hit blackjack at initial deal
if player_point.include?(21) && dealer_point.include?(21)
show_cards(player, name)
show_cards(dealer, 'dealer')
puts say("It's a tie game.")
elsif player_point.include?(21)
show_cards(player, name)
show_cards(dealer, 'dealer')
puts say("Congraduations! #{name} hit Blackjack. #{name} win.")
elsif dealer_point.include?(21)
show_cards(player, name)
show_cards(dealer, 'dealer')
puts say("Sorry, dealer hit Blackjack. #{name} lose.")
else
# Player turn
loop do
show_cards(player, name)
puts "#{name}'s current point can be: #{player_point}"
puts say("#{name}'s round, What would you like to do ? (1 hit (2 stay")
operation = gets.chomp
if operation == '1'
new_card = deck_cards.pop
puts say("Your draws a #{new_card[:suit]} #{new_card[:value]}")
player << new_card
player_point = check_points(player)
if player_point.include?(21)
puts say("Congraduations! #{name} hit Blackjack. #{name} win.")
flag = true
break
elsif player_point.empty?
puts say("Sorry, #{name} busted. #{name} lose.")
flag = true
break
end
elsif operation == '2'
puts "#{name} stays."
break
else
puts error_prompt('Input 1 or 2!')
end
end
if flag == false
# Dealer turn
loop do
show_cards(dealer, 'dealer')
puts "Dealer's current point can be: #{dealer_point}"
puts say("Dealer's round")
if dealer_point.sort.last < 17
new_card = deck_cards.pop
puts say("Dealer draws a #{new_card[:suit]} #{new_card[:value]}")
dealer << new_card
dealer_point = check_points(dealer)
if dealer_point.include?(21)
puts say("Sorry, Dealer hit Blackjack. #{name} lose.")
flag = true
break
elsif dealer_point.empty?
puts say("Congraduations! dealer busted. #{name} win.")
flag = true
break
end
else
puts say('Dealer stays.')
break
end
end
end
# Calculate both point, whick point more closer to 21 wins
if flag == false
puts say('*****************************')
show_cards(player, name)
player_final_point = player_point.sort[-1]
puts say("#{name} point is: #{player_final_point}")
show_cards(dealer, 'dealer')
dealer_final_point = dealer_point.sort[-1]
puts say("Dealer point is: #{dealer_final_point}")
if player_final_point > dealer_final_point
puts say("Congraduations! #{name} win!")
elsif player_final_point < dealer_final_point
puts say("Sorry, #{name} lose.")
else
puts say("It's a tie game.")
end
end
end
loop do
puts say('Would you like to try another round? (1 Yes (2 NO')
another_round = gets.chomp
if another_round == '1'
break
elsif another_round == '2'
puts say('Have a good one!')
exit
else
puts error_prompt('Input 1 or 2')
end
end
end