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
8 changes: 8 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# frozen_string_literal: true
source "https://rubygems.org"
ruby "2.2.6"

# gem "rails"
gem 'sinatra'
gem 'sinatra-contrib'
gem 'json'
34 changes: 34 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
GEM
remote: https://rubygems.org/
specs:
backports (3.6.8)
json (1.8.6)
multi_json (1.12.1)
rack (1.6.5)
rack-protection (1.5.3)
rack
rack-test (0.6.3)
rack (>= 1.0)
sinatra (1.4.8)
rack (~> 1.5)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
sinatra-contrib (1.4.7)
backports (>= 2.0)
multi_json
rack-protection
rack-test
sinatra (~> 1.4.0)
tilt (>= 1.3, < 3)
tilt (2.0.6)

PLATFORMS
ruby

DEPENDENCIES
json
sinatra
sinatra-contrib

BUNDLED WITH
1.13.7
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
Hit me baby one more time?

[A Blackjack game using the Ruby Sinatra web application framework which uses object oriented programming, cookies, sessions, and JSON from the Viking Code School](http://www.vikingcodeschool.com)

Yi-Xuan Lau
84 changes: 84 additions & 0 deletions app.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
require 'sinatra'
require 'sinatra/reloader' if development?
require 'json'
require 'erb'
require_relative 'lib/player'
require_relative 'lib/deck'
require './helpers/sessions'

enable :sessions

helpers Sessions

get '/' do
player = load_player(session['player']) if session['player']
session.clear
set_up_player(player) if player
erb :index
end

get '/bet' do
bank = session['player'] ? Player.new(session['player']).bank : 1000
erb :bet, :locals => { 'redirect' => session['redirect_message'], 'bank' => bank}
end

post '/bet' do
player = Player.new(session['player'])
player.bet = params[:bet].to_i
if player.bank < player.bet
session['redirect_message'] = "Sorry, you only have $#{player.bank}<br> Please enter a different amount:<br>"
redirect '/bet'
end
save_player('player', player)
redirect '/blackjack'
end

get '/blackjack' do
deck = Deck.new(session['deck'])
player = Player.new(session['player'])
dealer = AI.new(session['dealer'])
deck.deal(player, dealer) unless session['on']
if dealer.blackjack? || player.blackjack?
deck.settle_winnings(player, dealer)
session['game_over'] = true
end

session['on'] = true
save_player('dealer', dealer)
save_player('player', player)
save_deck(deck)
erb :blackjack, :locals => {'deck' => deck, 'dealer' => dealer, 'player' => player, 'game_over' => session[:game_over], 'double' => session[:double]}
end

post '/blackjack/hit' do
deck = Deck.new(session['deck'])
player = Player.new(session['player'])
deck.hit(player)
save_deck(deck)
save_player('player', player)
redirect "/blackjack/stay" if player.sum > 21 || session['double']
redirect '/blackjack'
end

get '/blackjack/stay' do
dealer = AI.new(session['dealer'])
deck = Deck.new(session['deck'])
player = Player.new(session['player'])
deck.hit(dealer) until dealer.enough?
deck.settle_winnings(player, dealer)
save_player('player', player)
session['game_over'] = true
save_player('dealer', dealer)
redirect '/blackjack'
end

post '/blackjack/double' do
session['double'] = true
deck = Deck.new(session['deck'])
player = Player.new(session['player'])
deck.hit(player)
save_deck(deck)
player.bet *= 2
save_player('player', player)
redirect to("/blackjack/stay")
end
2 changes: 2 additions & 0 deletions config.ru
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require './app.rb'
run Sinatra::Application
25 changes: 25 additions & 0 deletions helpers/sessions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module Sessions
def save_deck(deck)
session['deck'] = deck.cards.to_json
end

def save_player(n, player)
bundle = { 'hand' => player.hand,
'bank' => player.bank,
'bet' => player.bet,
'status' => player.status}
session[n] = bundle.to_json
end

def load_player(session)
player = JSON.parse(session)
player.delete('hand')
player.delete('bet')
player
end

def set_up_player(player)
player = Player.new(player.to_json)
save_player('player', player)
end
end
45 changes: 45 additions & 0 deletions lib/deck.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
class Deck
attr_accessor :cards
def initialize(cards=nil)
@cards = cards ? JSON.parse(cards) : make_deck
end

def make_deck
%w{2 3 4 5 6 7 8 9 10 J Q K A}.product(%w{diamonds clubs hearts spades}).shuffle
end

def deal(one, two)
2.times do
s = @cards.sample
one.hand << s if one.hand.size < 2
@cards.delete(s)
s = @cards.sample
two.hand << s if two.hand.size < 2
@cards.delete(s)
end
end

def hit(player)
s = @cards.sample
player.hand << s
@cards.delete(s)
end

def settle_winnings(player, dealer)
if player.sum > 21 || player.sum < dealer.sum && dealer.sum < 21 || dealer.sum == 21 && player.sum != 21
player.bank -= player.bet
player.status = :loss
elsif player.sum == 21 && dealer.sum != 21 || player.sum > dealer.sum && player.sum < 21 || dealer.sum > 21
player.bank += player.bet
player.status = :win
elsif player.blackjack? && ! dealer.blackjack?
player.bank += player.bet * 1.5
player.status = :blackjack
elsif dealer.blackjack? && ! player.blackjack?
player.bank -= player.bet * 1.5
player.status = :loss
else
player.status = :tie
end
end
end
39 changes: 39 additions & 0 deletions lib/player.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
class Player
attr_accessor :hand, :bank, :bet, :status
def initialize(opts=nil)
opts = opts ? JSON.parse(opts) : {}
@hand = opts['hand'] ? opts['hand'] : []
@bank = opts['bank'] ? opts['bank'] : 1000
@bet = opts['bet'] ? opts['bet'] : 0
@status = opts['status']
end

def sum
sum = 0
ace = false
@hand.each do |card|
if card[0] == 'A'
ace = true
elsif card[0] == 'K' || card[0] == 'J' || card[0] == 'Q'
sum += 10
else
sum += card[0].to_i
end
end
if ace
sum = sum + 11 <= 21 ? sum + 11 : sum + 1
end
sum
end

def blackjack?
self.sum == 21
end

end

class AI < Player
def enough?
self.sum >= 17
end
end
35 changes: 35 additions & 0 deletions public/custom.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
.container {
margin-top: 80px;
}
body {
font-family: "Roboto Mono", Menlo, "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.card {
font-size: 10em;
margin-top: -20px;
}
.card .logo-right {
transform: rotate(15deg);
}
.card .logo-left {
transform: rotate(-15deg);
}
.card > div {
display: inline-block;
margin-top: -20px;
}
.card.small {
font-size: 2.5em;
display: inline-block;
margin-left: 1em;
}
.suit.red {
color: red;
}
form {
display: inline-block;
margin-top: 1em;
}
.card-display {
margin: 3em auto 1em;
}
Loading