Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Created very basic blackjack web app #49

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
Open
Binary file added .DS_Store
Binary file not shown.
7 changes: 7 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
source 'https://rubygems.org'
gem 'sinatra'
gem 'sinatra-contrib'

group :development do
gem 'pry-byebug'
end
44 changes: 44 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
GEM
remote: https://rubygems.org/
specs:
backports (3.6.8)
byebug (9.0.6)
coderay (1.1.1)
method_source (0.8.2)
multi_json (1.12.1)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
pry-byebug (3.4.2)
byebug (~> 9.0)
pry (~> 0.10)
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)
slop (3.6.0)
tilt (2.0.6)

PLATFORMS
ruby

DEPENDENCIES
pry-byebug
sinatra
sinatra-contrib

BUNDLED WITH
1.13.7
26 changes: 23 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,24 @@
# assignment_blackjack
Hit me baby one more time?
# Simple Black Jack Game in Sinatra

[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)
The goal of this simple Blackjack game is to focus on the function of the application rather than styling. The game is limited ot it's simplest logic - hitting, staying, making bets. (no split, double betting etc.)

<img src="black_jack.png" width="200" height="300" />


## Getting Started

If you want to quick run some the examples to see the code in action, and you have installed Ruby and Rails, run
```
$ ruby app_bj_2.rb
```

Open browser on http://localhost:4567/

## Authors

* **Dariusz Biskupski** - *Initial work* - https://dariuszbiskupski.com


## Acknowledgments

The assignment is created for [Viking Code School](https://www.vikingcodeschool.com/)
162 changes: 162 additions & 0 deletions app_bj_2.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@

require 'erb'
require 'pry-byebug'
require "bundler/setup"
require 'sinatra'
require 'sinatra/reloader' if development?
require './helpers/bj_helper_2.rb'
require 'json'

helpers BJHelper

enable :sessions
set :session_secret, '*&(^B234'

get "/" do
erb :home
end

get '/blackjack/bet' do
dealer_hand = BJHelper::Dealer.new(session[:dealer_hand]).load_dealer_hand
player = BJHelper::Player.new(session[:player_hand], session[:player_bankroll])
player_bankroll = player.bankroll
player_hand = player.load_player_hand
session[:player_bankroll] = player_bankroll.to_json
session[:dealer_hand] = dealer_hand.to_json
session[:player_hand] = player_hand.to_json
erb :"blackjack/bet", locals: { player_bankroll: player_bankroll }
end

post '/bet' do
dealer_hand = BJHelper::Dealer.new(session[:dealer_hand]).load_dealer_hand
player = BJHelper::Player.new(session[:player_hand], session[:player_bankroll])
player_bankroll = player.bankroll
player_hand = player.load_player_hand
player_bet = params[:amount].to_i
if player_bet < player_bankroll
session[:dealer_hand] = dealer_hand.to_json
session[:player_hand] = player_hand.to_json
player_bankroll = (player_bankroll - player_bet)
session[:player_bankroll] = player_bankroll.to_json
session[:player_bet] = player_bet.to_json
erb :"blackjack/hit", locals: { player_bet: player_bet, player_bankroll: player_bankroll, dealer_hand: dealer_hand, player_hand: player_hand }
else
player_bet = 0
session[:player_bet] = player_bet.to_json
erb :"blackjack/bet", locals: { player_bet: player_bet, player_bankroll: player_bankroll, dealer_hand: dealer_hand, player_hand: player_hand }
end
end

get '/blackjack/hit' do
dealer_hand = BJHelper::Dealer.new(session[:dealer_hand]).load_dealer_hand
player = BJHelper::Player.new(session[:player_hand], session[:player_bankroll])
player_bankroll = player.bankroll
player_hand = player.load_player_hand
player_bet = session[:player_bet]
session[:dealer_hand] = dealer_hand.to_json
session[:player_hand] = player_hand.to_json
session[:player_bankroll] = player_bankroll.to_json
erb :"blackjack/hit", locals: { player_bet: player_bet, player_bankroll: player_bankroll, dealer_hand: dealer_hand, player_hand: player_hand }
end

post '/hit' do
dealer_hand = BJHelper::Dealer.new(session[:dealer_hand]).load_dealer_hand
player = BJHelper::Player.new(session[:player_hand], session[:player_bankroll])
player_bankroll = player.bankroll
player_hand = player.load_player_hand
player_bet = session[:player_bet]
deck = BJHelper::Deck.new
if deck.checking_points(player_hand) >= 21
dealer_hand << deck.deal_hand
session[:dealer_hand] = dealer_hand.to_json
session[:player_hand] = player_hand.to_json
session[:player_bankroll] = player_bankroll.to_json
erb :"blackjack/stay", locals: { player_bet: player_bet, player_bankroll: player_bankroll,dealer_hand: dealer_hand, player_hand: player_hand }
redirect to("/blackjack/stay")
else
player_hand << deck.deal_hand
session[:dealer_hand] = dealer_hand.to_json
session[:player_hand] = player_hand.to_json
session[:player_bankroll] = player_bankroll.to_json
if deck.checking_points(player_hand) >= 21
erb :"blackjack/stay", locals: { player_bet: player_bet, player_bankroll: player_bankroll,dealer_hand: dealer_hand, player_hand: player_hand }
redirect to("/blackjack/stay")
else
erb :"blackjack/hit", locals: { player_bet: player_bet, player_bankroll: player_bankroll,dealer_hand: dealer_hand, player_hand: player_hand }
end
end
end

get '/blackjack/stay' do
dealer_hand = BJHelper::Dealer.new(session[:dealer_hand]).load_dealer_hand
player = BJHelper::Player.new(session[:player_hand], session[:player_bankroll])
player_bankroll = player.bankroll
player_hand = player.load_player_hand
player_bet = session[:player_bet]
session[:dealer_hand] = dealer_hand.to_json
session[:player_hand] = player_hand.to_json
session[:player_bankroll] = player_bankroll.to_json
erb :"blackjack/stay", locals: { player_bet: player_bet, player_bankroll: player_bankroll, dealer_hand: dealer_hand, player_hand: player_hand }
end

post '/stay' do
dealer_hand = BJHelper::Dealer.new(session[:dealer_hand]).load_dealer_hand
player = BJHelper::Player.new(session[:player_hand], session[:player_bankroll])
player_bankroll = player.bankroll
player_hand = player.load_player_hand
player_bet = JSON.parse(session[:player_bet],:quirks_mode => true)
deck = BJHelper::Deck.new
while deck.checking_points(dealer_hand) < 17
dealer_hand << deck.deal_hand
end
who_won = deck.check_who_won(player_hand, dealer_hand)
if who_won == -1
player_bet = 0
player_bankroll = player_bankroll - player_bet
session[:player_bankroll] = player_bankroll.to_json
session[:player_bet] = player_bet.to_json
elsif who_won == 0
player_bankroll = player_bankroll + player_bet
session[:player_bankroll] = player_bankroll.to_json
player_bet = 0
session[:player_bet] = player_bet.to_json
else
player_bankroll = player_bankroll + player_bet*2
session[:player_bankroll] = player_bankroll.to_json
player_bet = 0
session[:player_bet] = player_bet.to_json
end
session[:who_won] = who_won.to_json
session[:dealer_hand] = dealer_hand.to_json
session[:player_hand] = player_hand.to_json
erb :"blackjack/results", locals: { player_bet: player_bet, player_bankroll: player_bankroll, who_won: who_won, dealer_hand: dealer_hand, player_hand: player_hand }
redirect to("/blackjack/results")
end

get '/blackjack/results' do
dealer_hand = BJHelper::Dealer.new(session[:dealer_hand]).load_dealer_hand
player = BJHelper::Player.new(session[:player_hand], session[:player_bankroll])
player_bankroll = player.bankroll
player_hand = player.load_player_hand
player_bet = JSON.parse(session[:player_bet],:quirks_mode => true)
who_won = JSON.parse(session[:who_won],:quirks_mode => true)
erb :"blackjack/results", locals: { player_bet: player_bet, player_bankroll: player_bankroll,who_won: who_won, dealer_hand: dealer_hand, player_hand: player_hand }
end

post '/new_game' do
session.delete(:dealer_hand)
session.delete(:player_hand)
session.delete(:player_bankroll)
session.delete(:who_won)
session[:player_bet] = 0
redirect to("/blackjack/bet")
end

post '/continue_game' do
session.delete(:dealer_hand)
session.delete(:player_hand)
session.delete(:who_won)
session[:player_bet] = 0
redirect to("/blackjack/bet")
end

Binary file added black_jack.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added helpers/.DS_Store
Binary file not shown.
91 changes: 91 additions & 0 deletions helpers/bj_helper_2.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@

module BJHelper

class Player

attr_accessor :bankroll

def initialize(session_hand, bankroll) #make it to_json in app
session_hand == nil ? @session_hand = nil : @session_hand = JSON.parse(session_hand,:quirks_mode => true)
bankroll.nil? ? @bankroll = 1000 : @bankroll = JSON.parse(bankroll,:quirks_mode => true)
@decks = Deck.new
end

def load_player_hand
@session_hand ? @session_hand : [@decks.deal_hand, @decks.deal_hand]
end

end

class Dealer

def initialize(session_hand) #make it to_json in app
session_hand == nil ? @session_hand = nil : @session_hand = JSON.parse(session_hand,:quirks_mode => true)
@decks = Deck.new
end

def load_dealer_hand
@session_hand ? @session_hand : [@decks.deal_hand, @decks.deal_hand]
end

end

class Deck

def initialize #make it to_json in app
@five_decks = create_decks # if @session_hash.decks == nil || @session_hash.decks == []
end

def decks_builder
[2,3,4,5,6,7,8,9,10, "J", "Q", "K", "A"].product(["Diamonds", "Hearts", "Clubs", "Spades"])
end

def create_decks
the_deck = []
4.times { |i| the_deck += decks_builder }
the_deck.shuffle
end

def deal_hand
@five_decks.pop
end

def checking_points(current_hand)
total = 0
as_value = 0
current_hand.each do |arr|
if %w{J K Q}.include? arr[0]
total += 10
elsif "A" == arr[0]
total += 1
as_value += 10
else
total += arr[0]
end
end
puts "DBG: total = #{total.inspect}"
puts "DBG: match_ases_for_best_total(total, as_value) = #{match_ases_for_best_total(total, as_value).inspect}"
match_ases_for_best_total(total, as_value)
end

def match_ases_for_best_total(total, as_value)
if total <= 11
as_value != 0 ? total += 10 : total
else
total
end
end

def check_who_won(player_hand, dealer_hand)
if checking_points(player_hand) <= 21 && checking_points(dealer_hand) <= 21
checking_points(player_hand) <=> checking_points(dealer_hand)
elsif checking_points(player_hand) > 21
-1
else
1
end
end

end

end
Binary file added views/.DS_Store
Binary file not shown.
Binary file added views/blackjack/.DS_Store
Binary file not shown.
12 changes: 12 additions & 0 deletions views/blackjack/bet.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

<br>
<h1>Set the amount you want to bet</h1>
<br>
<h3>Your balance is: <%=player_bankroll%></h3>
<br>
<form action="/bet" method="post">
<textarea type="text" name="amount"></textarea>
<br>
<input type="submit" value="Accept and start the game">
</form>
<br>
34 changes: 34 additions & 0 deletions views/blackjack/hit.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@

<br>
<br>
<br>
<br>
<h2>Dealer's Cards</h2>
<br>
<%=dealer_hand[0]%>
<p>hidden card</p>
<br>
<br>
<h2>Your Cards</h2>
<br>
<%player_hand.length.times do |i| %>
<%=player_hand[i]%>
<%end%>
<br>
<form action="/hit" method="post">
<input type="submit" value="HIT">
</form>
<br>
<form action="/stay" method="post">
<input type="submit" value="STAY">
</form>
<br>
<br>
<h2>BETS</h2>
<%=player_bet%>
<br>
<br>
<h2>BANK ROLL</h2>
<%=player_bankroll%>
<br>
<br>
Loading