-
Notifications
You must be signed in to change notification settings - Fork 0
/
blackjack.rb
149 lines (129 loc) · 3.52 KB
/
blackjack.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
# Ruby Blackjack
# Work in progress. Things to add:
# Player betting
# Visualization of blackjack table
# Multiple decks
# Proper card names (King of Spades, Ace of Diamonds, etc)
# Calculate the total value of the current hands
def calculate_total(cards)
# [['H', '3'], ['S', 'Q'], ... ]
arr = cards.map {|i| i[1] }
total = 0
arr.each do |value|
if value == "A"
total += 11
elsif value.to_i == 0
total += 10
else
total += value.to_i
end
end
arr.count("A").times do
total -= 10 if total > 21
end
total
end
puts "Welcome to Ruby Blackjack!"
suits = ['H', 'D', 'S', 'C']
cards = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
# Create cards
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 "You have: #{mycards[0]} and #{mycards[1]}, for a total of: #{mytotal}"
puts "Dealer has: #{dealercards[1]} showing}"
puts ""
# Evaluate cards after initial deal
# Player / dealer does not automatically win if they have blackjack. Could be a draw.
if dealertotal == 21
puts "Dealer has: #{dealercards[1]} and #{dealercards[0]}"
puts "Dealer has blackjack. You lose."
exit
elsif mytotal == 21 && dealertotal != 21
puts "Congrats, you got blackjack! You win!"
exit
elsif mytotal == 21 && dealertotal == 21
puts "Dealer got blackjack too. It's a draw."
exit
end
# Loop through hitting
while mytotal < 21
puts "What would you like to do? 1) hit 2) stay"
hit_or_stay = gets.chomp
# If correct option is not selected, player is asked again
if !['1', '2'].include?(hit_or_stay)
puts ["Error: you must enter 1 or 2"]
next
end
# If stay is picked, will break out of while loop
if hit_or_stay == "2"
puts "You chose to stay."
break
end
# Dealing new card
new_card = deck.pop
puts "Dealing card to player: #{new_card}"
mycards << new_card
mytotal = calculate_total(mycards)
puts "Your total is now: #{mytotal}"
# Evaluate after deal to player
if mytotal == 21 && dealertotal == 21
puts "Dealer got 21 too. It's a draw."
exit
elsif mytotal > 21
puts "You busted!"
exit
end
end
while dealertotal < 17
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 && mytotal == 21
puts "Dealer's cards: "
dealercards.each do |card|
puts "=> #{card}"
end
puts "Sorry, dealer has 21 too. It's a draw"
exit
elsif dealertotal == 21 && mytotal != 21
puts "Dealer's cards: "
dealercards.each do |card|
puts "=> #{card}"
end
puts "Sorry, dealer has 21. You lose"
exit
elsif dealertotal > 21
puts "Congrats! dealer busted! you win!"
exit
end
end
puts "Dealer's cards: "
dealercards.each do |card|
puts "=> #{card}"
end
puts "Your cards:"
mycards.each do |card|
puts "=> #{card}"
end
if dealertotal > mytotal
puts "Sorry dealer wins: #{dealertotal} to #{mytotal}"
exit
elsif dealertotal < mytotal
puts "Congrats, you win! #{mytotal} to #{dealertotal}"
exit
else
puts "It's a tie. #{dealertotal} to #{mytotal}"
exit
end