Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true
# A sample Gemfile
source "https://rubygems.org"

gem 'sinatra'

group :development do
gem 'pry-byebug'
end
32 changes: 32 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
GEM
remote: https://rubygems.org/
specs:
byebug (9.0.5)
coderay (1.1.1)
method_source (0.8.2)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
pry-byebug (3.4.0)
byebug (~> 9.0)
pry (~> 0.10)
rack (1.6.4)
rack-protection (1.5.3)
rack
sinatra (1.4.7)
rack (~> 1.5)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
slop (3.6.0)
tilt (2.0.5)

PLATFORMS
ruby

DEPENDENCIES
pry-byebug
sinatra

BUNDLED WITH
1.12.5
57 changes: 57 additions & 0 deletions app.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
require 'sinatra'
require 'pry-byebug'
require 'sinatra/reloader' if development?
require './helpers/blackjack_helper.rb'

enable :sessions

helpers BlackjackHelper

get '/' do
session.clear
session['purse'] ||= 1000
erb :welcome
end

get '/blackjack' do
deck = session['deck'] = new_deck.shuffle
player_cards = session['player_cards'] = deal(deck, 2)
dealer_cards = session['dealer_cards'] = deal(deck, 2)

erb :blackjack, locals: { player_cards: player_cards,
dealer_cards: dealer_cards.first, wording: nil,
bet: session['bet'], purse: session['purse']}
end

post '/blackjack/hit' do
session['player_cards'] << deal(session['deck'], 1).flatten
player_cards = session['player_cards']
if bust?(player_cards)
redirect('/blackjack/stay')
else
erb :blackjack, locals: {player_cards: session['player_cards'],
dealer_cards: session['dealer_cards'].first, wording: nil }
end
end



# welcome -> form :player_name, creates a game instance, assigns the player name
get '/blackjack/stay' do
dealer_cards = session['dealer_cards']
while calc_value(dealer_cards) < 17
dealer_cards << deal( session['deck'], 1 )
end
wording = final_result(dealer_cards, session['player_cards'])
erb :blackjack, locals: {player_cards: session['player_cards'],
dealer_cards: session['dealer_cards'], wording: wording }

end

get '/bet' do
erb :bet
end

post '/bet' do
handle_bet(params[:bet], session['purse'])
end
2 changes: 2 additions & 0 deletions helpers/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Morgan Martin's project_cli_blackjack
Hit me!
99 changes: 99 additions & 0 deletions helpers/blackjack_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
module BlackjackHelper
def deal(deck, num)
deck.pop(num)
end

def handle_bet(bet, purse)
bet = bet.to_i
if bet < purse
session['bet'] = bet
session['purse'] -= bet
redirect('/blackjack')
else
get :bet, locals: { message: "Please enter valid bet" }
end
end

def state(cards)
if calc_value(cards) > 21
:busted
elsif calc_value(cards) == 21 && cards.length == 2
:blackjack
else
calc_value(cards)
end
end

def final_result(dealer_cards, player_cards)
dealer_state = state(dealer_cards)
player_state = state(player_cards)
if dealer_state == player_state
"It was a tie!!"
elsif player_state == :busted
"You lost!"
elsif dealer_state == :blackjack
"The dealer had blackjack! You lose..."
elsif player_state == :blackjack
"You had blackjack, you win!"
elsif player_state < dealer_state
"You lose..."
elsif dealer_state < player_state
"You win!"
end
end

def cards_total(cards)
cards.map do |card|
if card[0].is_a?(Integer)
card[0]
elsif card[0] == :ace
11
else
10
end
end.reduce(:+)

end

def correct_for_aces(cards, total)
num_of_aces(cards).times do
total -=10 if total > 21
end
total
end

def calc_value(cards)
total = cards_total(cards)
correct_for_aces(cards, total)
end

def bust?(cards)
total_value = calc_value(cards)
if total_value > 21
true
elsif total_value <= 21
false
end
end

# def no_aces?(cards)
# !cards.map { |card| card[0] }.any? { |card| card == :ace }
# end

def num_of_aces(cards)
cards.select { |card| card[0] == :ace }.length
end

def new_deck
return_array = []
ranks.product(suits)
end

def ranks
(2..10).to_a << :ace << :jack << :queen << :king
end

def suits
[:spade, :heart, :diamond, :club]
end
end
Binary file added helpers/lib/.ace.rb.swp
Binary file not shown.
20 changes: 20 additions & 0 deletions helpers/lib/ace.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class Ace < Card
attr_reader :value

def initialize(suit, rank, face_up = true)
super
@value = 11
end

def toggle_value
@value = @value == 1 ? 11 : 1
end

def untoggled?
@value == 11
end

def convert_rank_to_value
@value
end
end
2 changes: 2 additions & 0 deletions helpers/lib/bet.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class Bet
end
12 changes: 12 additions & 0 deletions helpers/lib/blackjack.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
require './card'
require './ace'
require './hand'
require './view'
require './game_view'
require './player_view'
require './player.rb'
require './human_player'
require './dealer'
require './deck_empty_error'
require './deck'
require './game'
64 changes: 64 additions & 0 deletions helpers/lib/card.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
class Card
attr_reader :suit, :rank
def initialize(suit, rank, face_up = true)
@suit = suit
@rank = rank
@face_up = face_up
end

def value
convert_rank_to_value
end

def face_up?
@face_up
end

def face_down?
!@face_up
end

def flip
@face_up ^= true
end

def rank_symbol
convert_rank_to_symbol
end

def suit_symbol
convert_suit_to_symbol
end

private

def convert_rank_to_value
if @rank.is_a?(Symbol)
return 10 if [:jack, :queen, :king].include?(@rank)
else
@rank
end
end

# Converts rank to a string for rendering
def convert_rank_to_symbol
@rank.is_a?(Symbol) ? @rank.to_s.chars.first.upcase : @rank.to_s
end

def convert_suit_to_symbol
case @suit
when :diamond
encode("\u2666")
when :heart
encode("\u2665")
when :club
encode("\u2663")
when :spade
encode("\u2660")
end
end

def encode(string)
string.encode('utf-8')
end
end
17 changes: 17 additions & 0 deletions helpers/lib/dealer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class Dealer < Player
def make_last_card_facedown
@hand.flip_last_card unless last_card_in_hand.face_down?
end

def show_hidden_card
@hand.flip_last_card unless last_card_in_hand.face_up?
end

def last_card_in_hand
@hand.last_card
end

def hit?
@hand.total_value < 17
end
end
49 changes: 49 additions & 0 deletions helpers/lib/deck.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
class Deck
def initialize
@cards = new_deck.shuffle
end

def shuffle!
@cards.shuffle!
end

def size
@cards.size
end

def add_card(card)
@cards << card
end

def get_card
empty? ? (raise DeckEmptyError) : @cards.pop
end

private

def empty?
@cards.empty?
end

def ranks
(2..10).to_a << :ace << :jack << :queen << :king
end

def suits
[:spade, :heart, :diamond, :club]
end

def new_deck
return_array = []
ranks.each do |rank|
suits.each do |suit|
if rank == :ace
return_array << Ace.new(suit, rank)
else
return_array << Card.new(suit, rank)
end
end
end
return_array
end
end
5 changes: 5 additions & 0 deletions helpers/lib/deck_empty_error.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class DeckEmptyError < StandardError
def initialize(msg = "deck empty")
super(msg)
end
end
Loading