-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblackjack_solution.rb
138 lines (108 loc) · 2.49 KB
/
blackjack_solution.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
# Interactive command line blackjack game
def calculate_total(cards)
# [['H', '3'], ['S', 'Q'], ... ]
arr = cards.map{|e| e[1] }
total = 0
arr.each do |value|
if value == "A"
total += 11
elsif value.to_i == 0 # J, Q, K
total += 10
else
total += value.to_i
end
end
#correct for Aces
arr.select{|e| e == "A"}.count.times do
total -= 10 if total > 21
end
total
end
# Start Game
puts "Welcome to Blackjack!"
suits = ['H', 'D', 'S', 'C']
cards = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
deck = suits.product(cards)
deck.shuffle!
# Deal Cards
mycards = []
dealercards = []
mycards << deck.pop
dealercards << deck.pop
mycards << deck.pop
dealercards << deck.pop
dealertotal = calculate_total(dealercards)
mytotal = calculate_total(mycards)
# Show Cards
puts "Dealer has: #{dealercards[0]} and #{dealercards[1]}, for a total of #{dealertotal}"
puts "You have: #{mycards[0]} and #{mycards[1]}, for a total of: #{mytotal}"
puts ""
# Player turn
if mytotal == 21
puts "Congratulations, you hit blackjack! You win!"
exit
end
while mytotal < 21
puts "What would you like to do? 1) hit 2) stay"
hit_or_stay = gets.chomp
if !['1', '2'].include?(hit_or_stay)
puts "Error: you must enter 1 or 2"
next
end
if hit_or_stay == "2"
puts "You chose to stay."
break
end
#hit
new_card = deck.pop
puts "Dealing card to player: #{new_card}"
mycards << new_card
mytotal = calculate_total(mycards)
puts "Your total is now: #{mytotal}"
if mytotal == 21
puts "Congratulations, you hit blackjack! You win!"
exit
elsif mytotal > 21
puts "Sorry, it looks like you busted!"
exit
end
end
# Dealer turn
if dealertotal == 21
puts "Sorry, dealer hit blackjack. You lose."
exit
end
while dealertotal < 17
#hit
new_card = deck.pop
puts "Dealing new card for dealer: #{new_card}"
dealercards << new_card
dealertotal = calculate_total(dealercards)
puts "Dealer total is now: #{dealertotal}"
if dealertotal == 21
puts "Sorry, dealer hit blackjack. You lose."
exit
elsif dealertotal > 21
puts "Congratulations, dealer busted! You win!"
exit
end
end
# Compare hands
puts "Dealer's cards: "
dealercards.each do |card|
puts "=> #{card}"
end
puts ""
puts "Your cards:"
mycards.each do |card|
puts "=> #{card}"
end
puts ""
if dealertotal > mytotal
puts "Sorry, dealer wins."
elsif dealertotal < mytotal
puts "Congratulations, you win!"
else
puts "It's a tie!"
end
exit