From dacad35ad02977d8e8a68f377f1eef60a64b4b52 Mon Sep 17 00:00:00 2001 From: Visiona Date: Wed, 1 Feb 2017 21:14:07 +0000 Subject: [PATCH 01/13] Starting Blackjack Web App --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f18110..9ab10e7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # assignment_blackjack -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) + +by Dariusz Biskupski From b0119a61c907327cb4150d2e6bb69b1839b9c6e0 Mon Sep 17 00:00:00 2001 From: Visiona Date: Wed, 1 Feb 2017 23:34:40 +0000 Subject: [PATCH 02/13] Created simplest layout with structure of the game view --- Gemfile | 6 ++++++ Gemfile.lock | 32 ++++++++++++++++++++++++++++++++ app_bj.rb | 14 ++++++++++++++ views/blackjack/game_view.erb | 25 +++++++++++++++++++++++++ views/home.erb | 23 +++++++++++++++++++++++ views/layout.erb | 10 ++++++++++ 6 files changed, 110 insertions(+) create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 app_bj.rb create mode 100644 views/blackjack/game_view.erb create mode 100644 views/home.erb create mode 100644 views/layout.erb diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..792547d --- /dev/null +++ b/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' +gem 'sinatra' + +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..2d874f6 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,32 @@ +GEM + remote: https://rubygems.org/ + specs: + byebug (9.0.6) + 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.2) + byebug (~> 9.0) + pry (~> 0.10) + rack (1.6.5) + rack-protection (1.5.3) + rack + sinatra (1.4.8) + rack (~> 1.5) + rack-protection (~> 1.4) + tilt (>= 1.3, < 3) + slop (3.6.0) + tilt (2.0.6) + +PLATFORMS + ruby + +DEPENDENCIES + pry-byebug + sinatra + +BUNDLED WITH + 1.13.7 diff --git a/app_bj.rb b/app_bj.rb new file mode 100644 index 0000000..c46d685 --- /dev/null +++ b/app_bj.rb @@ -0,0 +1,14 @@ + +require 'erb' +require 'pry-byebug' +require "bundler/setup" +require 'sinatra' +require 'sinatra/reloader' if development? + +get "/" do + erb :home +end + +get "/blackjack/game_view" do + erb :"blackjack/game_view" +end \ No newline at end of file diff --git a/views/blackjack/game_view.erb b/views/blackjack/game_view.erb new file mode 100644 index 0000000..fa703a0 --- /dev/null +++ b/views/blackjack/game_view.erb @@ -0,0 +1,25 @@ + +
+
+
+
+

Dealer's Cards

+
+
+
+
+

Your Cards

+
+
+
+ +
+ +
+
+
+

Points

+
+
+
+
\ No newline at end of file diff --git a/views/home.erb b/views/home.erb new file mode 100644 index 0000000..0254527 --- /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 From 27a570f18e1d852a031e68cdb127e5d59908bdde Mon Sep 17 00:00:00 2001 From: Visiona Date: Sat, 4 Feb 2017 16:05:10 +0000 Subject: [PATCH 03/13] reated cards shuffling, and simple one turn game. Routing bug needs to be finxed --- Gemfile | 1 + Gemfile.lock | 12 ++++++ app_bj.rb | 58 +++++++++++++++++++++++++- helpers/bj_helper.rb | 78 +++++++++++++++++++++++++++++++++++ views/blackjack/game_view.erb | 55 +++++++++++++----------- views/blackjack/hit.erb | 35 ++++++++++++++++ views/blackjack/stay.erb | 36 ++++++++++++++++ 7 files changed, 249 insertions(+), 26 deletions(-) create mode 100644 helpers/bj_helper.rb create mode 100644 views/blackjack/hit.erb create mode 100644 views/blackjack/stay.erb diff --git a/Gemfile b/Gemfile index 792547d..15ebcea 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,6 @@ source 'https://rubygems.org' gem 'sinatra' +gem 'sinatra-contrib' group :development do gem 'pry-byebug' diff --git a/Gemfile.lock b/Gemfile.lock index 2d874f6..231233a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,9 +1,11 @@ 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) @@ -14,10 +16,19 @@ GEM 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) @@ -27,6 +38,7 @@ PLATFORMS DEPENDENCIES pry-byebug sinatra + sinatra-contrib BUNDLED WITH 1.13.7 diff --git a/app_bj.rb b/app_bj.rb index c46d685..2a25438 100644 --- a/app_bj.rb +++ b/app_bj.rb @@ -4,11 +4,65 @@ require "bundler/setup" require 'sinatra' require 'sinatra/reloader' if development? +require './helpers/bj_helper.rb' + +helpers BJHelper + +enable :sessions get "/" do erb :home end -get "/blackjack/game_view" do +get '/blackjack/game_view' do + @deck = load_the_deck + @dealer_hand = [deal_hand(@deck), deal_hand(@deck)] + @player_hand = [deal_hand(@deck), deal_hand(@deck)] + puts "DBG: @player_hand = #{@player_hand.inspect}" erb :"blackjack/game_view" -end \ No newline at end of file +end + +post '/hit' do + puts "DBG: @player_hand = #{@player_hand.inspect}" + if checking_points(@player_hand)[0] > 21 + redirect to("/blackjack/stay") + else + @deck = save_the_deck(params[:deck]) + @dealer_hand = save_dealer_hand(params[:dealer_hand]) + @player_hand = save_player_hand(params[:player_hand]) + redirect to("blackjack/hit") + end +end + +get '/blackjack/hit' do + @dealer_hand = load_dealer_hand + @player_hand = load_player_hand + @deck = load_the_deck + puts "DBG: @player_handin get /hit = #{@player_hand.inspect}" + puts "DBG: @dealer_handin get /hit = #{@dealer_hand.inspect}" + puts "DBG: @deckin get /hit = #{@deck.inspect}" + erb :"blackjack/hit" +end + +get '/blackjack/stay' do + @dealer_hand = load_dealer_hand + @player_hand = load_player_hand + @deck = load_the_deck + erb :"blackjack/stay" +end + +post '/stay' do + @deck = save_the_deck(params[:deck]) + @dealer_hand = save_dealer_hand(params[:dealer_hand]) + @player_hand = save_player_hand(params[:player_hand]) + if checking_points(@dealer_hand)[0] < 17 + redirect to("/blackjack/stay") + else + redirect to ('/blackjack/game_view') + end +end + + + + + diff --git a/helpers/bj_helper.rb b/helpers/bj_helper.rb new file mode 100644 index 0000000..be7991e --- /dev/null +++ b/helpers/bj_helper.rb @@ -0,0 +1,78 @@ + +module BJHelper + + #we need to store the status of the deck + + #we neeed current_hand of dealer + + def save_dealer_hand(dealer_hand) + session[:dealer_hand] = dealer_hand + end + + def save_player_hand(player_hand) + session[:player_hand] = player_hand + end + + def save_the_deck(deck) + session[:deck] = deck + end + + def load_player_hand + session[:player_hand] + # session[:player_hand] + # else + # [deal_hand(deck), deal_hand(deck)] + # end + end + + def load_dealer_hand + session[:player_hand] + # session[:player_hand] + # else + # [deal_hand(deck), deal_hand(deck)] + # end + end + + def load_the_deck + session[:deck] || deck + end + + def creating_deck + [2,3,4,5,6,7,8,9,10, "J", "Q", "K", "A"].product(["Diamonds", "Hearts", "Clubs", "Spades"]) + end + + def deck + the_deck = [] + 4.times { |i| the_deck += creating_deck } + the_deck.shuffle + end + + def deal_hand(deck) + deck.pop + end + + #we need current_hand of player + + def dealer_deals(current_hand) + points = checking_points(current_hand) + deal_hand(deck) if points[0] + points[1] < 17 + end + + def checking_points(current_hand) + total = 0 + as_value = 0 + puts "DBG: current_hand = #{current_hand.inspect}" + 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 + [total, as_value] + end + +end \ No newline at end of file diff --git a/views/blackjack/game_view.erb b/views/blackjack/game_view.erb index fa703a0..fca4e1f 100644 --- a/views/blackjack/game_view.erb +++ b/views/blackjack/game_view.erb @@ -1,25 +1,32 @@ -
-
-
-
-

Dealer's Cards

-
-
-
-
-

Your Cards

-
-
-
- -
- -
-
-
-

Points

-
-
-
-
\ No newline at end of file +
+
+
+
+

Dealer's Cards

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

hidden card

+
+
+

Your Cards

+
+<%=@player_hand[0]%> +<%=@player_hand[1]%> +
+
+ +
+
+
+ +
+
+
+

BETS

+
+
+

BANK ROLL

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

Dealer's Cards

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

hidden card

+
+
+

Your Cards

+
+<%@player_hand << deal_hand(@deck)%> +<%@player_hand.length.times do |i| %> + <%=@player_hand[i]%> +<%end%> +
+<%@deck.pop%> +
+ +
+
+
+ +
+
+
+

BETS

+
+
+

BANK ROLL

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

Dealer's Cards

+
+<%@deck%> +<%@dealer_hand << deal_hand(@deck)%> +<%@dealer_hand.length.times do |i| %> + <%=@dealer_hand[i]%> +<%end%> +
+
+

Your Cards

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

BETS

+
+
+

BANK ROLL

+
+
\ No newline at end of file From 9318ae867f3729be88171e179947674b2fdc4f29 Mon Sep 17 00:00:00 2001 From: Visiona Date: Tue, 7 Feb 2017 21:34:08 +0000 Subject: [PATCH 04/13] still trying to locate the bug --- app_bj.rb | 60 +++++++++++++++++++++-------------- helpers/bj_helper.rb | 20 ++++++------ views/blackjack/game_view.erb | 8 ++--- views/blackjack/hit.erb | 12 +++---- views/blackjack/stay.erb | 14 ++++---- 5 files changed, 64 insertions(+), 50 deletions(-) diff --git a/app_bj.rb b/app_bj.rb index 2a25438..bc62a86 100644 --- a/app_bj.rb +++ b/app_bj.rb @@ -5,6 +5,7 @@ require 'sinatra' require 'sinatra/reloader' if development? require './helpers/bj_helper.rb' +require 'json' helpers BJHelper @@ -15,47 +16,58 @@ end get '/blackjack/game_view' do - @deck = load_the_deck - @dealer_hand = [deal_hand(@deck), deal_hand(@deck)] - @player_hand = [deal_hand(@deck), deal_hand(@deck)] - puts "DBG: @player_hand = #{@player_hand.inspect}" - erb :"blackjack/game_view" + deck = load_the_deck + dealer_hand = load_dealer_hand + player_hand = load_player_hand + puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" + puts "DBG: player_hand_get = #{player_hand.inspect}" + erb :"blackjack/game_view", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } + # binding.pry end post '/hit' do - puts "DBG: @player_hand = #{@player_hand.inspect}" - if checking_points(@player_hand)[0] > 21 + + deck = load_the_deck + dealer_hand = load_dealer_hand + player_hand = load_player_hand + puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" + puts "DBG: session[:player_hand] = #{session[:player_hand].inspect}" + puts "DBG: session[:deck] = #{session[:deck].inspect}" + if checking_points(player_hand)[0] > 21 + save_the_deck(params[:deck]) + save_dealer_hand(params[:dealer_hand]) + save_player_hand(params[:player_hand]) redirect to("/blackjack/stay") else - @deck = save_the_deck(params[:deck]) - @dealer_hand = save_dealer_hand(params[:dealer_hand]) - @player_hand = save_player_hand(params[:player_hand]) + save_the_deck(params[:deck]) + save_dealer_hand(params[:dealer_hand]) + save_player_hand(params[:player_hand]) redirect to("blackjack/hit") end end get '/blackjack/hit' do - @dealer_hand = load_dealer_hand - @player_hand = load_player_hand - @deck = load_the_deck - puts "DBG: @player_handin get /hit = #{@player_hand.inspect}" - puts "DBG: @dealer_handin get /hit = #{@dealer_hand.inspect}" - puts "DBG: @deckin get /hit = #{@deck.inspect}" - erb :"blackjack/hit" + dealer_hand = load_dealer_hand + player_hand = load_player_hand + deck = load_the_deck + puts "DBG: player_handin get /hit = #{player_hand.inspect}" + puts "DBG: dealer_handin get /hit = #{dealer_hand.inspect}" + puts "DBG: deckin get /hit = #{deck.inspect}" + erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } end get '/blackjack/stay' do - @dealer_hand = load_dealer_hand - @player_hand = load_player_hand - @deck = load_the_deck + dealer_hand = load_dealer_hand + player_hand = load_player_hand + deck = load_the_deck erb :"blackjack/stay" end post '/stay' do - @deck = save_the_deck(params[:deck]) - @dealer_hand = save_dealer_hand(params[:dealer_hand]) - @player_hand = save_player_hand(params[:player_hand]) - if checking_points(@dealer_hand)[0] < 17 + deck = save_the_deck(params[:deck]) + dealer_hand = save_dealer_hand(params[:dealer_hand]) + player_hand = save_player_hand(params[:player_hand]) + if checking_points(dealer_hand)[0] < 17 redirect to("/blackjack/stay") else redirect to ('/blackjack/game_view') diff --git a/helpers/bj_helper.rb b/helpers/bj_helper.rb index be7991e..e57afa7 100644 --- a/helpers/bj_helper.rb +++ b/helpers/bj_helper.rb @@ -1,4 +1,6 @@ +require 'json' + module BJHelper #we need to store the status of the deck @@ -6,27 +8,27 @@ module BJHelper #we neeed current_hand of dealer def save_dealer_hand(dealer_hand) - session[:dealer_hand] = dealer_hand + ( session[:dealer_hand] = dealer_hand ).to_json end def save_player_hand(player_hand) - session[:player_hand] = player_hand + ( session[:player_hand] = player_hand).to_json end def save_the_deck(deck) - session[:deck] = deck + ( session[:deck] = deck).to_json end def load_player_hand - session[:player_hand] + session[:player_hand] ? JSON.parse(session[:player_hand]) : [deal_hand(create_deck), deal_hand(create_deck)] # session[:player_hand] # else - # [deal_hand(deck), deal_hand(deck)] + # [deal_hand(create_deck), deal_hand(create_deck)] # end end def load_dealer_hand - session[:player_hand] + session[:dealer_hand] ? JSON.parse(session[:dealer_hand]) : [deal_hand(create_deck), deal_hand(create_deck)] # session[:player_hand] # else # [deal_hand(deck), deal_hand(deck)] @@ -34,14 +36,14 @@ def load_dealer_hand end def load_the_deck - session[:deck] || deck + session[:deck] ? JSON.parse(session[:deck]) : create_deck end def creating_deck [2,3,4,5,6,7,8,9,10, "J", "Q", "K", "A"].product(["Diamonds", "Hearts", "Clubs", "Spades"]) end - def deck + def create_deck the_deck = [] 4.times { |i| the_deck += creating_deck } the_deck.shuffle @@ -55,7 +57,7 @@ def deal_hand(deck) def dealer_deals(current_hand) points = checking_points(current_hand) - deal_hand(deck) if points[0] + points[1] < 17 + deal_hand(create_deck) if points[0] + points[1] < 17 end def checking_points(current_hand) diff --git a/views/blackjack/game_view.erb b/views/blackjack/game_view.erb index fca4e1f..c6b944a 100644 --- a/views/blackjack/game_view.erb +++ b/views/blackjack/game_view.erb @@ -5,15 +5,15 @@

Dealer's Cards


-<%@deck%> -<%=@dealer_hand[0]%> +<%deck%> +<%=dealer_hand[0]%>

hidden card



Your Cards


-<%=@player_hand[0]%> -<%=@player_hand[1]%> +<%=player_hand[0]%> +<%=player_hand[1]%>
diff --git a/views/blackjack/hit.erb b/views/blackjack/hit.erb index 038f480..692ecf7 100644 --- a/views/blackjack/hit.erb +++ b/views/blackjack/hit.erb @@ -5,19 +5,19 @@

Dealer's Cards


-<%@deck%> -<%=@dealer_hand[0]%> +<%deck%> +<%=dealer_hand[0]%>

hidden card



Your Cards


-<%@player_hand << deal_hand(@deck)%> -<%@player_hand.length.times do |i| %> - <%=@player_hand[i]%> +<%player_hand << deal_hand(deck)%> +<%player_hand.length.times do |i| %> + <%=player_hand[i]%> <%end%>
-<%@deck.pop%> +<%deck.pop%>
diff --git a/views/blackjack/stay.erb b/views/blackjack/stay.erb index 1ed8922..dddaf4a 100644 --- a/views/blackjack/stay.erb +++ b/views/blackjack/stay.erb @@ -5,20 +5,20 @@

Dealer's Cards


-<%@deck%> -<%@dealer_hand << deal_hand(@deck)%> -<%@dealer_hand.length.times do |i| %> - <%=@dealer_hand[i]%> +<%deck%> +<%dealer_hand << deal_hand(deck)%> +<%dealer_hand.length.times do |i| %> + <%=dealer_hand[i]%> <%end%>

Your Cards


-<%@player_hand.length.times do |i| %> - <%=@player_hand[i]%> +<%player_hand.length.times do |i| %> + <%=player_hand[i]%> <%end%>
-<%@deck.pop%> +<%deck.pop%>
From 0899149bd0ba2972980ff5d9a84de40a12bf2f89 Mon Sep 17 00:00:00 2001 From: Visiona Date: Wed, 8 Feb 2017 22:05:42 +0000 Subject: [PATCH 05/13] Cookie exceeeds 4K - working on solution --- app_bj copy.rb | 87 +++++++++++++++++++++++++++++++++++++++ app_bj.rb | 38 ++++++++--------- helpers/bj_helper.rb | 24 ++++------- helpers/bj_helper_copy.rb | 75 +++++++++++++++++++++++++++++++++ 4 files changed, 188 insertions(+), 36 deletions(-) create mode 100644 app_bj copy.rb create mode 100644 helpers/bj_helper_copy.rb diff --git a/app_bj copy.rb b/app_bj copy.rb new file mode 100644 index 0000000..136018e --- /dev/null +++ b/app_bj copy.rb @@ -0,0 +1,87 @@ + +require 'erb' +require 'pry-byebug' +require "bundler/setup" +require 'sinatra' +require 'sinatra/reloader' if development? +require './helpers/bj_helper.rb' +require 'json' + +helpers BJHelper + +enable :sessions + +get "/" do + erb :home +end + +get '/blackjack/game_view' do + # binding.pry + deck = load_the_deck + dealer_hand = load_dealer_hand + player_hand = load_player_hand + puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" + puts "DBG: session[:deck] = #{session[:deck].inspect}" + save_the_deck(deck) + save_dealer_hand(dealer_hand) + save_player_hand(player_hand) + erb :"blackjack/game_view", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } +end + +get '/clear_session' do + session.clear + redirect to("/") +end + +post '/hit' do + deck = load_the_deck + dealer_hand = load_dealer_hand + player_hand = load_player_hand + puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" + puts "DBG: session[:player_hand] = #{session[:player_hand].inspect}" + puts "DBG: session[:deck] = #{session[:deck].inspect}" + if checking_points(player_hand)[0] > 21 + save_the_deck(params[:deck]) + save_dealer_hand(params[:dealer_hand]) + save_player_hand(params[:player_hand]) + redirect to("/blackjack/stay") + else + save_the_deck(params[:deck]) + save_dealer_hand(params[:dealer_hand]) + save_player_hand(params[:player_hand]) + redirect to("blackjack/hit") + end +end + +get '/blackjack/hit' do + dealer_hand = load_dealer_hand + player_hand = load_player_hand + deck = load_the_deck + puts "DBG: player_handin get /hit = #{player_hand.inspect}" + puts "DBG: dealer_handin get /hit = #{dealer_hand.inspect}" + puts "DBG: deckin get /hit = #{deck.inspect}" + erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } +end + +get '/blackjack/stay' do + dealer_hand = load_dealer_hand + player_hand = load_player_hand + deck = load_the_deck + erb :"blackjack/stay" +end + +post '/stay' do + deck = save_the_deck(params[:deck]) + dealer_hand = save_dealer_hand(params[:dealer_hand]) + player_hand = save_player_hand(params[:player_hand]) + if checking_points(dealer_hand)[0] < 17 + redirect to("/blackjack/stay") + else + redirect to ('/blackjack/game_view') + end +end + + + + + diff --git a/app_bj.rb b/app_bj.rb index bc62a86..e1e7209 100644 --- a/app_bj.rb +++ b/app_bj.rb @@ -10,38 +10,41 @@ helpers BJHelper enable :sessions +set :session_secret, '*&(^B234' get "/" do erb :home end get '/blackjack/game_view' do + # binding.pry deck = load_the_deck dealer_hand = load_dealer_hand player_hand = load_player_hand - puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" - puts "DBG: player_hand_get = #{player_hand.inspect}" + save_the_deck(deck) + save_dealer_hand(dealer_hand) + save_player_hand(player_hand) erb :"blackjack/game_view", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } - # binding.pry end -post '/hit' do +get '/clear_session' do + session.clear + redirect to("/") +end +post '/hit' do deck = load_the_deck dealer_hand = load_dealer_hand player_hand = load_player_hand - puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" - puts "DBG: session[:player_hand] = #{session[:player_hand].inspect}" - puts "DBG: session[:deck] = #{session[:deck].inspect}" if checking_points(player_hand)[0] > 21 - save_the_deck(params[:deck]) - save_dealer_hand(params[:dealer_hand]) - save_player_hand(params[:player_hand]) + save_the_deck(deck) + save_dealer_hand(dealer_hand) + save_player_hand(player_hand) redirect to("/blackjack/stay") else - save_the_deck(params[:deck]) - save_dealer_hand(params[:dealer_hand]) - save_player_hand(params[:player_hand]) + save_the_deck(deck) + save_dealer_hand(dealer_hand) + save_player_hand(player_hand) redirect to("blackjack/hit") end end @@ -50,9 +53,6 @@ dealer_hand = load_dealer_hand player_hand = load_player_hand deck = load_the_deck - puts "DBG: player_handin get /hit = #{player_hand.inspect}" - puts "DBG: dealer_handin get /hit = #{dealer_hand.inspect}" - puts "DBG: deckin get /hit = #{deck.inspect}" erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } end @@ -64,9 +64,9 @@ end post '/stay' do - deck = save_the_deck(params[:deck]) - dealer_hand = save_dealer_hand(params[:dealer_hand]) - player_hand = save_player_hand(params[:player_hand]) + deck = save_the_deck(:deck) + dealer_hand = save_dealer_hand(dealer_hand) + player_hand = save_player_hand(player_hand) if checking_points(dealer_hand)[0] < 17 redirect to("/blackjack/stay") else diff --git a/helpers/bj_helper.rb b/helpers/bj_helper.rb index e57afa7..35a99dd 100644 --- a/helpers/bj_helper.rb +++ b/helpers/bj_helper.rb @@ -1,6 +1,4 @@ -require 'json' - module BJHelper #we need to store the status of the deck @@ -8,35 +6,28 @@ module BJHelper #we neeed current_hand of dealer def save_dealer_hand(dealer_hand) - ( session[:dealer_hand] = dealer_hand ).to_json + session[:dealer_hand] = dealer_hand.to_json + puts "DBG: session[:dealer_hand] method save_dealer_hand = #{session[:dealer_hand] .inspect}" end def save_player_hand(player_hand) - ( session[:player_hand] = player_hand).to_json + session[:player_hand] = player_hand.to_json end def save_the_deck(deck) - ( session[:deck] = deck).to_json + session[:deck] = deck.to_json end def load_player_hand - session[:player_hand] ? JSON.parse(session[:player_hand]) : [deal_hand(create_deck), deal_hand(create_deck)] - # session[:player_hand] - # else - # [deal_hand(create_deck), deal_hand(create_deck)] - # end + session[:player_hand] ? JSON.parse(session[:player_hand],:quirks_mode => true) : [deal_hand(create_deck), deal_hand(create_deck)] end def load_dealer_hand - session[:dealer_hand] ? JSON.parse(session[:dealer_hand]) : [deal_hand(create_deck), deal_hand(create_deck)] - # session[:player_hand] - # else - # [deal_hand(deck), deal_hand(deck)] - # end + session[:dealer_hand] ? JSON.parse(session[:dealer_hand],:quirks_mode => true) : [deal_hand(create_deck), deal_hand(create_deck)] end def load_the_deck - session[:deck] ? JSON.parse(session[:deck]) : create_deck + session[:deck] ? JSON.parse(session[:deck],:quirks_mode => true) : create_deck end def creating_deck @@ -63,7 +54,6 @@ def dealer_deals(current_hand) def checking_points(current_hand) total = 0 as_value = 0 - puts "DBG: current_hand = #{current_hand.inspect}" current_hand.each do |arr| if %w{J K Q}.include? arr[0] total += 10 diff --git a/helpers/bj_helper_copy.rb b/helpers/bj_helper_copy.rb new file mode 100644 index 0000000..5341101 --- /dev/null +++ b/helpers/bj_helper_copy.rb @@ -0,0 +1,75 @@ + +require 'json' + +module BJHelper + + #we need to store the status of the deck + + #we neeed current_hand of dealer + + def save_dealer_hand(dealer_hand) + session[:dealer_hand] = dealer_hand + end + + def save_player_hand(player_hand) + session[:player_hand] = player_hand + end + + def save_the_deck(deck) + session[:deck] = deck + end + + def load_player_hand + session[:player_hand] ? session[:player_hand] : [deal_hand(create_deck), deal_hand(create_deck)] + end + + def load_dealer_hand + puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" + puts "DBG: session[:dealer_hand]) = #{session[:dealer_hand].inspect}" + session[:dealer_hand] ? session[:dealer_hand] : [deal_hand(create_deck), deal_hand(create_deck)] + end + + def load_the_deck + puts "DBG: session[:deck] = #{session[:deck].inspect}" + session[:deck] ? session[:deck] : create_deck + end + + def creating_deck + [2,3,4,5,6,7,8,9,10, "J", "Q", "K", "A"].product(["Diamonds", "Hearts", "Clubs", "Spades"]) + end + + def create_deck + the_deck = [] + 4.times { |i| the_deck += creating_deck } + the_deck.shuffle + end + + def deal_hand(deck) + deck.pop + end + + #we need current_hand of player + + def dealer_deals(current_hand) + points = checking_points(current_hand) + deal_hand(create_deck) if points[0] + points[1] < 17 + end + + def checking_points(current_hand) + total = 0 + as_value = 0 + puts "DBG: current_hand = #{current_hand.inspect}" + 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 + [total, as_value] + end + +end \ No newline at end of file From 9ad8dcb1dc7d2290c1bcd761df8820df31c335cc Mon Sep 17 00:00:00 2001 From: Visiona Date: Thu, 9 Feb 2017 23:30:56 +0000 Subject: [PATCH 06/13] Reated main game flow up to showing results, now work on results and betting --- app_bj copy.rb | 87 ----------------------------------- app_bj.rb | 81 ++++++++++++++++++++------------ helpers/bj_helper.rb | 14 +++++- helpers/bj_helper_copy.rb | 75 ------------------------------ views/blackjack/game_view.erb | 32 ------------- views/blackjack/hit.erb | 3 -- views/blackjack/results.erb | 37 +++++++++++++++ views/blackjack/stay.erb | 5 +- views/home.erb | 2 +- 9 files changed, 102 insertions(+), 234 deletions(-) delete mode 100644 app_bj copy.rb delete mode 100644 helpers/bj_helper_copy.rb delete mode 100644 views/blackjack/game_view.erb create mode 100644 views/blackjack/results.erb diff --git a/app_bj copy.rb b/app_bj copy.rb deleted file mode 100644 index 136018e..0000000 --- a/app_bj copy.rb +++ /dev/null @@ -1,87 +0,0 @@ - -require 'erb' -require 'pry-byebug' -require "bundler/setup" -require 'sinatra' -require 'sinatra/reloader' if development? -require './helpers/bj_helper.rb' -require 'json' - -helpers BJHelper - -enable :sessions - -get "/" do - erb :home -end - -get '/blackjack/game_view' do - # binding.pry - deck = load_the_deck - dealer_hand = load_dealer_hand - player_hand = load_player_hand - puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" - puts "DBG: session[:deck] = #{session[:deck].inspect}" - save_the_deck(deck) - save_dealer_hand(dealer_hand) - save_player_hand(player_hand) - erb :"blackjack/game_view", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } -end - -get '/clear_session' do - session.clear - redirect to("/") -end - -post '/hit' do - deck = load_the_deck - dealer_hand = load_dealer_hand - player_hand = load_player_hand - puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" - puts "DBG: session[:player_hand] = #{session[:player_hand].inspect}" - puts "DBG: session[:deck] = #{session[:deck].inspect}" - if checking_points(player_hand)[0] > 21 - save_the_deck(params[:deck]) - save_dealer_hand(params[:dealer_hand]) - save_player_hand(params[:player_hand]) - redirect to("/blackjack/stay") - else - save_the_deck(params[:deck]) - save_dealer_hand(params[:dealer_hand]) - save_player_hand(params[:player_hand]) - redirect to("blackjack/hit") - end -end - -get '/blackjack/hit' do - dealer_hand = load_dealer_hand - player_hand = load_player_hand - deck = load_the_deck - puts "DBG: player_handin get /hit = #{player_hand.inspect}" - puts "DBG: dealer_handin get /hit = #{dealer_hand.inspect}" - puts "DBG: deckin get /hit = #{deck.inspect}" - erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } -end - -get '/blackjack/stay' do - dealer_hand = load_dealer_hand - player_hand = load_player_hand - deck = load_the_deck - erb :"blackjack/stay" -end - -post '/stay' do - deck = save_the_deck(params[:deck]) - dealer_hand = save_dealer_hand(params[:dealer_hand]) - player_hand = save_player_hand(params[:player_hand]) - if checking_points(dealer_hand)[0] < 17 - redirect to("/blackjack/stay") - else - redirect to ('/blackjack/game_view') - end -end - - - - - diff --git a/app_bj.rb b/app_bj.rb index e1e7209..c5ea786 100644 --- a/app_bj.rb +++ b/app_bj.rb @@ -16,65 +16,86 @@ erb :home end -get '/blackjack/game_view' do - # binding.pry - deck = load_the_deck +# get '/blackjack/game_view' do +# deck = load_the_deck +# dealer_hand = load_dealer_hand +# player_hand = load_player_hand +# # save_the_deck(deck) +# save_dealer_hand(dealer_hand) +# save_player_hand(player_hand) +# erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } +# end + +get '/blackjack/hit' do dealer_hand = load_dealer_hand player_hand = load_player_hand - save_the_deck(deck) + deck = load_the_deck save_dealer_hand(dealer_hand) save_player_hand(player_hand) - erb :"blackjack/game_view", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } -end - -get '/clear_session' do - session.clear - redirect to("/") + erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } end post '/hit' do + # binding.pry deck = load_the_deck dealer_hand = load_dealer_hand player_hand = load_player_hand - if checking_points(player_hand)[0] > 21 - save_the_deck(deck) + if checking_points(player_hand) > 21 + # save_the_deck(deck) + dealer_hand << deal_hand(deck) save_dealer_hand(dealer_hand) save_player_hand(player_hand) + erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } redirect to("/blackjack/stay") else - save_the_deck(deck) + # save_the_deck(deck) + player_hand << deal_hand(deck) save_dealer_hand(dealer_hand) save_player_hand(player_hand) - redirect to("blackjack/hit") + erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } end end -get '/blackjack/hit' do - dealer_hand = load_dealer_hand - player_hand = load_player_hand - deck = load_the_deck - erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } -end - get '/blackjack/stay' do dealer_hand = load_dealer_hand player_hand = load_player_hand deck = load_the_deck - erb :"blackjack/stay" + save_dealer_hand(dealer_hand) + save_player_hand(player_hand) + erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } end post '/stay' do - deck = save_the_deck(:deck) - dealer_hand = save_dealer_hand(dealer_hand) - player_hand = save_player_hand(player_hand) - if checking_points(dealer_hand)[0] < 17 - redirect to("/blackjack/stay") + deck = load_the_deck + dealer_hand = load_dealer_hand + player_hand = load_player_hand + # deck = load_the_deck + if checking_points(dealer_hand) < 17 + # save_the_deck(deck) + dealer_hand << deal_hand(deck) + save_dealer_hand(dealer_hand) + save_player_hand(player_hand) + erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } else - redirect to ('/blackjack/game_view') + save_dealer_hand(dealer_hand) + save_player_hand(player_hand) + erb :"blackjack/results", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } + redirect to("/blackjack/results") end end +get '/blackjack/results' do + dealer_hand = load_dealer_hand + player_hand = load_player_hand + deck = load_the_deck + erb :"blackjack/results", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } + save_dealer_hand(nil) + save_player_hand(nil) +end - - +post '/new_game' do + save_dealer_hand(nil) + save_player_hand(nil) + erb :"blackjack/hit" +end diff --git a/helpers/bj_helper.rb b/helpers/bj_helper.rb index 35a99dd..2e167bb 100644 --- a/helpers/bj_helper.rb +++ b/helpers/bj_helper.rb @@ -27,7 +27,8 @@ def load_dealer_hand end def load_the_deck - session[:deck] ? JSON.parse(session[:deck],:quirks_mode => true) : create_deck + create_deck + # session[:deck] ? JSON.parse(session[:deck],:quirks_mode => true) : create_deck end def creating_deck @@ -46,6 +47,10 @@ def deal_hand(deck) #we need current_hand of player + def check_who_won(player_hand, dealer_hand) + checking_points(player_hand) <=> checking_points(dealer_hand) + end + def dealer_deals(current_hand) points = checking_points(current_hand) deal_hand(create_deck) if points[0] + points[1] < 17 @@ -64,7 +69,12 @@ def checking_points(current_hand) total += arr[0] end end - [total, as_value] + if total <= 11 + total += 10 if as_value != 0 + else + return total + end + total end end \ No newline at end of file diff --git a/helpers/bj_helper_copy.rb b/helpers/bj_helper_copy.rb deleted file mode 100644 index 5341101..0000000 --- a/helpers/bj_helper_copy.rb +++ /dev/null @@ -1,75 +0,0 @@ - -require 'json' - -module BJHelper - - #we need to store the status of the deck - - #we neeed current_hand of dealer - - def save_dealer_hand(dealer_hand) - session[:dealer_hand] = dealer_hand - end - - def save_player_hand(player_hand) - session[:player_hand] = player_hand - end - - def save_the_deck(deck) - session[:deck] = deck - end - - def load_player_hand - session[:player_hand] ? session[:player_hand] : [deal_hand(create_deck), deal_hand(create_deck)] - end - - def load_dealer_hand - puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" - puts "DBG: session[:dealer_hand]) = #{session[:dealer_hand].inspect}" - session[:dealer_hand] ? session[:dealer_hand] : [deal_hand(create_deck), deal_hand(create_deck)] - end - - def load_the_deck - puts "DBG: session[:deck] = #{session[:deck].inspect}" - session[:deck] ? session[:deck] : create_deck - end - - def creating_deck - [2,3,4,5,6,7,8,9,10, "J", "Q", "K", "A"].product(["Diamonds", "Hearts", "Clubs", "Spades"]) - end - - def create_deck - the_deck = [] - 4.times { |i| the_deck += creating_deck } - the_deck.shuffle - end - - def deal_hand(deck) - deck.pop - end - - #we need current_hand of player - - def dealer_deals(current_hand) - points = checking_points(current_hand) - deal_hand(create_deck) if points[0] + points[1] < 17 - end - - def checking_points(current_hand) - total = 0 - as_value = 0 - puts "DBG: current_hand = #{current_hand.inspect}" - 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 - [total, as_value] - end - -end \ No newline at end of file diff --git a/views/blackjack/game_view.erb b/views/blackjack/game_view.erb deleted file mode 100644 index c6b944a..0000000 --- a/views/blackjack/game_view.erb +++ /dev/null @@ -1,32 +0,0 @@ - -
-
-
-
-

Dealer's Cards

-
-<%deck%> -<%=dealer_hand[0]%> -

hidden card

-
-
-

Your Cards

-
-<%=player_hand[0]%> -<%=player_hand[1]%> -
-
- -
-
-
- -
-
-
-

BETS

-
-
-

BANK ROLL

-
-
\ No newline at end of file diff --git a/views/blackjack/hit.erb b/views/blackjack/hit.erb index 692ecf7..8c5e3d7 100644 --- a/views/blackjack/hit.erb +++ b/views/blackjack/hit.erb @@ -5,19 +5,16 @@

Dealer's Cards


-<%deck%> <%=dealer_hand[0]%>

hidden card



Your Cards


-<%player_hand << deal_hand(deck)%> <%player_hand.length.times do |i| %> <%=player_hand[i]%> <%end%>
-<%deck.pop%>
diff --git a/views/blackjack/results.erb b/views/blackjack/results.erb new file mode 100644 index 0000000..562b311 --- /dev/null +++ b/views/blackjack/results.erb @@ -0,0 +1,37 @@ + +
+
+
+
+

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 check_who_won(player_hand, dealer_hand) == -1%> +

You busted!

+ <%elsif check_who_won(player_hand, dealer_hand) == 0%> +

DRAW

+ <%else%> +

Congratulations, You won!!!

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

BETS

+
+
+

BANK ROLL

+
+
\ No newline at end of file diff --git a/views/blackjack/stay.erb b/views/blackjack/stay.erb index dddaf4a..3ac76d1 100644 --- a/views/blackjack/stay.erb +++ b/views/blackjack/stay.erb @@ -5,8 +5,6 @@

Dealer's Cards


-<%deck%> -<%dealer_hand << deal_hand(deck)%> <%dealer_hand.length.times do |i| %> <%=dealer_hand[i]%> <%end%> @@ -18,9 +16,8 @@ <%=player_hand[i]%> <%end%>
-<%deck.pop%>
- +

diff --git a/views/home.erb b/views/home.erb index 0254527..d80e663 100644 --- a/views/home.erb +++ b/views/home.erb @@ -16,7 +16,7 @@
  • Let the dealer draw additional cards until his or her hand exceeds 21.
  • -

    PLAY THE GAME

    +

    PLAY THE GAME

    From 396ad5b83cbb35e69378ab9d730a6d33451882c0 Mon Sep 17 00:00:00 2001 From: Visiona Date: Sat, 11 Feb 2017 16:48:07 +0000 Subject: [PATCH 07/13] created smooth flow of the blackjack simple game --- app_bj.rb | 62 +++++++++++++++++++------------------ helpers/bj_helper.rb | 11 +++++-- views/blackjack/results.erb | 6 ++-- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/app_bj.rb b/app_bj.rb index c5ea786..c394879 100644 --- a/app_bj.rb +++ b/app_bj.rb @@ -16,16 +16,6 @@ erb :home end -# get '/blackjack/game_view' do -# deck = load_the_deck -# dealer_hand = load_dealer_hand -# player_hand = load_player_hand -# # save_the_deck(deck) -# save_dealer_hand(dealer_hand) -# save_player_hand(player_hand) -# erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } -# end - get '/blackjack/hit' do dealer_hand = load_dealer_hand player_hand = load_player_hand @@ -36,7 +26,7 @@ end post '/hit' do - # binding.pry + deck = load_the_deck dealer_hand = load_dealer_hand player_hand = load_player_hand @@ -45,14 +35,21 @@ dealer_hand << deal_hand(deck) save_dealer_hand(dealer_hand) save_player_hand(player_hand) + # binding.pry erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } redirect to("/blackjack/stay") + else - # save_the_deck(deck) + # save_the_deck(deck) player_hand << deal_hand(deck) save_dealer_hand(dealer_hand) save_player_hand(player_hand) - erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } + if checking_points(player_hand) >= 21 + erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } + redirect to("/blackjack/stay") + else + erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } + end end end @@ -66,22 +63,27 @@ end post '/stay' do - deck = load_the_deck - dealer_hand = load_dealer_hand - player_hand = load_player_hand - # deck = load_the_deck - if checking_points(dealer_hand) < 17 - # save_the_deck(deck) - dealer_hand << deal_hand(deck) - save_dealer_hand(dealer_hand) - save_player_hand(player_hand) - erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } - else + deck = load_the_deck + dealer_hand = load_dealer_hand + player_hand = load_player_hand + + # if checking_points(dealer_hand) < 17 + # # save_the_deck(deck) + # dealer_hand << deal_hand(deck) + # save_dealer_hand(dealer_hand) + # save_player_hand(player_hand) + # erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } + while checking_points(dealer_hand) < 17 + puts "DBG: dealer_hand iteration = #{dealer_hand.inspect}" + dealer_hand << deal_hand(deck) + # save_dealer_hand(dealer_hand) + # save_player_hand(player_hand) + # erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } + end save_dealer_hand(dealer_hand) save_player_hand(player_hand) erb :"blackjack/results", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } redirect to("/blackjack/results") - end end get '/blackjack/results' do @@ -89,13 +91,13 @@ player_hand = load_player_hand deck = load_the_deck erb :"blackjack/results", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } - save_dealer_hand(nil) - save_player_hand(nil) end post '/new_game' do - save_dealer_hand(nil) - save_player_hand(nil) - erb :"blackjack/hit" + # save_dealer_hand(nil) + # save_player_hand(nil) + session.delete(:dealer_hand) + session.delete(:player_hand) + redirect to("/blackjack/hit") end diff --git a/helpers/bj_helper.rb b/helpers/bj_helper.rb index 2e167bb..b0f1fb6 100644 --- a/helpers/bj_helper.rb +++ b/helpers/bj_helper.rb @@ -7,7 +7,6 @@ module BJHelper def save_dealer_hand(dealer_hand) session[:dealer_hand] = dealer_hand.to_json - puts "DBG: session[:dealer_hand] method save_dealer_hand = #{session[:dealer_hand] .inspect}" end def save_player_hand(player_hand) @@ -23,6 +22,7 @@ def load_player_hand end def load_dealer_hand + puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" session[:dealer_hand] ? JSON.parse(session[:dealer_hand],:quirks_mode => true) : [deal_hand(create_deck), deal_hand(create_deck)] end @@ -35,6 +35,7 @@ def creating_deck [2,3,4,5,6,7,8,9,10, "J", "Q", "K", "A"].product(["Diamonds", "Hearts", "Clubs", "Spades"]) end + def create_deck the_deck = [] 4.times { |i| the_deck += creating_deck } @@ -48,7 +49,13 @@ def deal_hand(deck) #we need current_hand of player def check_who_won(player_hand, dealer_hand) - checking_points(player_hand) <=> checking_points(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 def dealer_deals(current_hand) diff --git a/views/blackjack/results.erb b/views/blackjack/results.erb index 562b311..28e6bb5 100644 --- a/views/blackjack/results.erb +++ b/views/blackjack/results.erb @@ -16,13 +16,13 @@ <%=player_hand[i]%> <%end%>
    -<%if check_who_won(player_hand, dealer_hand) == -1%> -

    You busted!

    + <%if check_who_won(player_hand, dealer_hand) == -1%> +

    You busted!

    <%elsif check_who_won(player_hand, dealer_hand) == 0%>

    DRAW

    <%else%>

    Congratulations, You won!!!

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

    From c669087ac635971492440838c5b42fc78a38b54d Mon Sep 17 00:00:00 2001 From: Visiona Date: Sun, 12 Feb 2017 22:22:41 +0000 Subject: [PATCH 08/13] created betting system and refactored into OOP --- app_bj_2.rb | 162 ++++++++++++++++++++++++++++++++++++ helpers/bj_helper.rb | 16 +++- helpers/bj_helper_2.rb | 91 ++++++++++++++++++++ views/blackjack/bet.erb | 12 +++ views/blackjack/hit.erb | 2 + views/blackjack/results.erb | 12 ++- views/blackjack/stay.erb | 3 +- views/home.erb | 2 +- 8 files changed, 291 insertions(+), 9 deletions(-) create mode 100644 app_bj_2.rb create mode 100644 helpers/bj_helper_2.rb create mode 100644 views/blackjack/bet.erb 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/helpers/bj_helper.rb b/helpers/bj_helper.rb index b0f1fb6..db6d918 100644 --- a/helpers/bj_helper.rb +++ b/helpers/bj_helper.rb @@ -1,9 +1,19 @@ module BJHelper - #we need to store the status of the deck - - #we neeed current_hand of dealer + class Player + + def initialize(session_hash) + end + + end + + class Dealer + + def initialize(session_hash) + end + + end def save_dealer_hand(dealer_hand) session[:dealer_hand] = dealer_hand.to_json 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/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 index 8c5e3d7..43b6e12 100644 --- a/views/blackjack/hit.erb +++ b/views/blackjack/hit.erb @@ -25,8 +25,10 @@

    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 index 28e6bb5..9631fc2 100644 --- a/views/blackjack/results.erb +++ b/views/blackjack/results.erb @@ -16,22 +16,26 @@ <%=player_hand[i]%> <%end%>
    - <%if check_who_won(player_hand, dealer_hand) == -1%> + <%if who_won == -1%>

    You busted!

    - <%elsif check_who_won(player_hand, dealer_hand) == 0%> + <%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 index 3ac76d1..adfcdac 100644 --- a/views/blackjack/stay.erb +++ b/views/blackjack/stay.erb @@ -26,8 +26,9 @@

    BETS

    +<%=player_bet%>

    BANK ROLL

    -
    +<%=player_bankroll%>
    \ No newline at end of file diff --git a/views/home.erb b/views/home.erb index d80e663..25372f3 100644 --- a/views/home.erb +++ b/views/home.erb @@ -16,7 +16,7 @@
  • Let the dealer draw additional cards until his or her hand exceeds 21.
  • -

    PLAY THE GAME

    +

    PLAY THE GAME

    From 8bc72a7f9b116509a148b0514951ad79992e695f Mon Sep 17 00:00:00 2001 From: Visiona Date: Sun, 12 Feb 2017 22:24:12 +0000 Subject: [PATCH 09/13] Deleted procedural version of the game --- app_bj.rb | 103 ------------------------------------------- helpers/bj_helper.rb | 97 ---------------------------------------- 2 files changed, 200 deletions(-) delete mode 100644 app_bj.rb delete mode 100644 helpers/bj_helper.rb diff --git a/app_bj.rb b/app_bj.rb deleted file mode 100644 index c394879..0000000 --- a/app_bj.rb +++ /dev/null @@ -1,103 +0,0 @@ - -require 'erb' -require 'pry-byebug' -require "bundler/setup" -require 'sinatra' -require 'sinatra/reloader' if development? -require './helpers/bj_helper.rb' -require 'json' - -helpers BJHelper - -enable :sessions -set :session_secret, '*&(^B234' - -get "/" do - erb :home -end - -get '/blackjack/hit' do - dealer_hand = load_dealer_hand - player_hand = load_player_hand - deck = load_the_deck - save_dealer_hand(dealer_hand) - save_player_hand(player_hand) - erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } -end - -post '/hit' do - - deck = load_the_deck - dealer_hand = load_dealer_hand - player_hand = load_player_hand - if checking_points(player_hand) > 21 - # save_the_deck(deck) - dealer_hand << deal_hand(deck) - save_dealer_hand(dealer_hand) - save_player_hand(player_hand) - # binding.pry - erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } - redirect to("/blackjack/stay") - - else - # save_the_deck(deck) - player_hand << deal_hand(deck) - save_dealer_hand(dealer_hand) - save_player_hand(player_hand) - if checking_points(player_hand) >= 21 - erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } - redirect to("/blackjack/stay") - else - erb :"blackjack/hit", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } - end - end -end - -get '/blackjack/stay' do - dealer_hand = load_dealer_hand - player_hand = load_player_hand - deck = load_the_deck - save_dealer_hand(dealer_hand) - save_player_hand(player_hand) - erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } -end - -post '/stay' do - deck = load_the_deck - dealer_hand = load_dealer_hand - player_hand = load_player_hand - - # if checking_points(dealer_hand) < 17 - # # save_the_deck(deck) - # dealer_hand << deal_hand(deck) - # save_dealer_hand(dealer_hand) - # save_player_hand(player_hand) - # erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } - while checking_points(dealer_hand) < 17 - puts "DBG: dealer_hand iteration = #{dealer_hand.inspect}" - dealer_hand << deal_hand(deck) - # save_dealer_hand(dealer_hand) - # save_player_hand(player_hand) - # erb :"blackjack/stay", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } - end - save_dealer_hand(dealer_hand) - save_player_hand(player_hand) - erb :"blackjack/results", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } - redirect to("/blackjack/results") -end - -get '/blackjack/results' do - dealer_hand = load_dealer_hand - player_hand = load_player_hand - deck = load_the_deck - erb :"blackjack/results", locals: { deck: deck, dealer_hand: dealer_hand, player_hand: player_hand } -end - -post '/new_game' do - # save_dealer_hand(nil) - # save_player_hand(nil) - session.delete(:dealer_hand) - session.delete(:player_hand) - redirect to("/blackjack/hit") -end - diff --git a/helpers/bj_helper.rb b/helpers/bj_helper.rb deleted file mode 100644 index db6d918..0000000 --- a/helpers/bj_helper.rb +++ /dev/null @@ -1,97 +0,0 @@ - -module BJHelper - - class Player - - def initialize(session_hash) - end - - end - - class Dealer - - def initialize(session_hash) - end - - end - - def save_dealer_hand(dealer_hand) - session[:dealer_hand] = dealer_hand.to_json - end - - def save_player_hand(player_hand) - session[:player_hand] = player_hand.to_json - end - - def save_the_deck(deck) - session[:deck] = deck.to_json - end - - def load_player_hand - session[:player_hand] ? JSON.parse(session[:player_hand],:quirks_mode => true) : [deal_hand(create_deck), deal_hand(create_deck)] - end - - def load_dealer_hand - puts "DBG: session[:dealer_hand] = #{session[:dealer_hand].inspect}" - session[:dealer_hand] ? JSON.parse(session[:dealer_hand],:quirks_mode => true) : [deal_hand(create_deck), deal_hand(create_deck)] - end - - def load_the_deck - create_deck - # session[:deck] ? JSON.parse(session[:deck],:quirks_mode => true) : create_deck - end - - def creating_deck - [2,3,4,5,6,7,8,9,10, "J", "Q", "K", "A"].product(["Diamonds", "Hearts", "Clubs", "Spades"]) - end - - - def create_deck - the_deck = [] - 4.times { |i| the_deck += creating_deck } - the_deck.shuffle - end - - def deal_hand(deck) - deck.pop - end - - #we need current_hand of player - - 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 - - def dealer_deals(current_hand) - points = checking_points(current_hand) - deal_hand(create_deck) if points[0] + points[1] < 17 - 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 - if total <= 11 - total += 10 if as_value != 0 - else - return total - end - total - end - -end \ No newline at end of file From 009ff3fd8cb1c9b1c1bd05855b81bf2c20a1fffc Mon Sep 17 00:00:00 2001 From: Visiona Date: Sat, 21 Oct 2017 14:24:16 +0100 Subject: [PATCH 10/13] Updated README --- .DS_Store | Bin 0 -> 6148 bytes README.md | 24 +++++++++++++++++++++--- helpers/.DS_Store | Bin 0 -> 6148 bytes views/.DS_Store | Bin 0 -> 6148 bytes views/blackjack/.DS_Store | Bin 0 -> 6148 bytes 5 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 .DS_Store create mode 100644 helpers/.DS_Store create mode 100644 views/.DS_Store create mode 100644 views/blackjack/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Sat, 21 Oct 2017 14:28:48 +0100 Subject: [PATCH 11/13] Updated README --- README.md | 2 ++ black_jack.png | Bin 0 -> 46310 bytes 2 files changed, 2 insertions(+) create mode 100644 black_jack.png diff --git a/README.md b/README.md index d2918c7..4b6f30c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ 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.) + ![Black Jack with Sinatra]((black_jack.png) + ## Getting Started diff --git a/black_jack.png b/black_jack.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd3ec5c99f806e933116fa98eacc79d93f149c1 GIT binary patch literal 46310 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

    +wrBuczE$JAUg@XdWHj>L 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 I>)M3=2T@3UdjJ3c literal 0 HcmV?d00001 From 63e27ea6217243369850f5def9361cc0da0d43a8 Mon Sep 17 00:00:00 2001 From: Visiona Date: Sat, 21 Oct 2017 14:30:15 +0100 Subject: [PATCH 12/13] Updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b6f30c..d90a0f0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 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.) - ![Black Jack with Sinatra]((black_jack.png) + ![Black Jack with Sinatra]((/black_jack.png) From 070abb50aa79dc4767c8c1d1a94ada6bd3ea15dd Mon Sep 17 00:00:00 2001 From: Visiona Date: Sat, 21 Oct 2017 14:34:42 +0100 Subject: [PATCH 13/13] Updated README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index d90a0f0..e51b1dc 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,7 @@ 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.) - ![Black Jack with Sinatra]((/black_jack.png) - + ## Getting Started