diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/.DS_Store differ diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..15ebcea --- /dev/null +++ b/Gemfile @@ -0,0 +1,7 @@ +source 'https://rubygems.org' +gem 'sinatra' +gem 'sinatra-contrib' + +group :development do + gem 'pry-byebug' +end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..231233a --- /dev/null +++ b/Gemfile.lock @@ -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 diff --git a/README.md b/README.md index 3f18110..e51b1dc 100644 --- a/README.md +++ b/README.md @@ -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.) + + + + +## 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/) diff --git a/app_bj_2.rb b/app_bj_2.rb new file mode 100644 index 0000000..1fee7e4 --- /dev/null +++ b/app_bj_2.rb @@ -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 + diff --git a/black_jack.png b/black_jack.png new file mode 100644 index 0000000..2dd3ec5 Binary files /dev/null and b/black_jack.png differ diff --git a/helpers/.DS_Store b/helpers/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/helpers/.DS_Store differ diff --git a/helpers/bj_helper_2.rb b/helpers/bj_helper_2.rb new file mode 100644 index 0000000..812a372 --- /dev/null +++ b/helpers/bj_helper_2.rb @@ -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 \ No newline at end of file diff --git a/views/.DS_Store b/views/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/views/.DS_Store differ diff --git a/views/blackjack/.DS_Store b/views/blackjack/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/views/blackjack/.DS_Store differ diff --git a/views/blackjack/bet.erb b/views/blackjack/bet.erb new file mode 100644 index 0000000..33c546c --- /dev/null +++ b/views/blackjack/bet.erb @@ -0,0 +1,12 @@ + +
+

Set the amount you want to bet

+
+

Your balance is: <%=player_bankroll%>

+
+
+ +
+ +
+
\ No newline at end of file diff --git a/views/blackjack/hit.erb b/views/blackjack/hit.erb new file mode 100644 index 0000000..43b6e12 --- /dev/null +++ b/views/blackjack/hit.erb @@ -0,0 +1,34 @@ + +
+
+
+
+

Dealer's Cards

+
+<%=dealer_hand[0]%> +

hidden card

+
+
+

Your Cards

+
+<%player_hand.length.times do |i| %> + <%=player_hand[i]%> +<%end%> +
+
+ +
+
+
+ +
+
+
+

BETS

+<%=player_bet%> +
+
+

BANK ROLL

+<%=player_bankroll%> +
+
\ No newline at end of file diff --git a/views/blackjack/results.erb b/views/blackjack/results.erb new file mode 100644 index 0000000..9631fc2 --- /dev/null +++ b/views/blackjack/results.erb @@ -0,0 +1,41 @@ + +
+
+
+
+

Dealer's Cards

+
+<%dealer_hand.length.times do |i| %> + <%=dealer_hand[i]%> +<%end%> +
+
+

Your Cards

+
+<%player_hand.length.times do |i| %> + <%=player_hand[i]%> +<%end%> +
+ <%if who_won == -1%> +

You busted!

+ <%elsif who_won == 0%> +

DRAW

+ <%else%> +

Congratulations, You won!!!

+ <%end%> +
+
+
+ +
+
+ +
+
+

BETS

+<%=player_bet%> +
+
+

BANK ROLL

+<%=player_bankroll%> +
\ No newline at end of file diff --git a/views/blackjack/stay.erb b/views/blackjack/stay.erb new file mode 100644 index 0000000..adfcdac --- /dev/null +++ b/views/blackjack/stay.erb @@ -0,0 +1,34 @@ + +
+
+
+
+

Dealer's Cards

+
+<%dealer_hand.length.times do |i| %> + <%=dealer_hand[i]%> +<%end%> +
+
+

Your Cards

+
+<%player_hand.length.times do |i| %> + <%=player_hand[i]%> +<%end%> +
+
+ +
+
+
+ +
+
+
+

BETS

+<%=player_bet%> +
+
+

BANK ROLL

+<%=player_bankroll%> +
\ No newline at end of file diff --git a/views/home.erb b/views/home.erb new file mode 100644 index 0000000..25372f3 --- /dev/null +++ b/views/home.erb @@ -0,0 +1,23 @@ + + + + WElcome to BlackJack Game + + +

+ Blackjack, also known as twenty-one, is the most widely played casino banking game in the world. +

+

+ Blackjack is a comparing card game between a player and dealer, meaning players compete against the dealer but not against other players.The objective of the game is to beat the dealer in one of the following ways: +

+ + +

PLAY THE GAME

+ + + + \ No newline at end of file diff --git a/views/layout.erb b/views/layout.erb new file mode 100644 index 0000000..40d94bd --- /dev/null +++ b/views/layout.erb @@ -0,0 +1,10 @@ + + + + BlackJack Game + + +

Welcome to the Blackjack game

+ <%= yield %> + + \ No newline at end of file