From 34e766a1d59548d7dc312387b9018e2bede1e55d Mon Sep 17 00:00:00 2001 From: Saif-ul Hussain Date: Sun, 5 Jun 2022 20:44:51 +0100 Subject: [PATCH 1/2] Completed Exercise --- Gemfile | 2 ++ Gemfile.lock | 14 +++++++++ app.rb | 52 +++++++++++++++++++++++++++++++ config.ru | 2 ++ lib/computer_player.rb | 23 ++++++++++++++ lib/game.rb | 38 ++++++++++++++++++++++ lib/player.rb | 22 +++++++++++++ spec/computer_player_spec.rb | 17 ++++++++++ spec/features/enter_names_spec.rb | 6 ++++ spec/game_spec.rb | 16 ++++++++++ spec/player_spec.rb | 27 ++++++++++++++++ spec/spec_helper.rb | 8 +++++ spec/web_helpers.rb | 5 +++ views/game_over.erb | 5 +++ views/index.erb | 8 +++++ views/move.erb | 11 +++++++ views/play.erb | 25 +++++++++++++++ 17 files changed, 281 insertions(+) create mode 100644 app.rb create mode 100644 config.ru create mode 100644 lib/computer_player.rb create mode 100644 lib/game.rb create mode 100644 lib/player.rb create mode 100644 spec/computer_player_spec.rb create mode 100644 spec/features/enter_names_spec.rb create mode 100644 spec/game_spec.rb create mode 100644 spec/player_spec.rb create mode 100644 spec/web_helpers.rb create mode 100644 views/game_over.erb create mode 100644 views/index.erb create mode 100644 views/move.erb create mode 100644 views/play.erb diff --git a/Gemfile b/Gemfile index 63415039a7..0e8f6b0614 100644 --- a/Gemfile +++ b/Gemfile @@ -3,6 +3,8 @@ source 'https://rubygems.org' ruby '3.0.2' gem 'sinatra' +gem 'sinatra-reloader' +gem 'puma' group :test do gem 'capybara' diff --git a/Gemfile.lock b/Gemfile.lock index 5afab6d697..20a22c38db 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,8 +17,10 @@ GEM docile (1.4.0) mini_mime (1.1.1) mini_portile2 (2.6.1) + multi_json (1.15.0) mustermann (1.1.1) ruby2_keywords (~> 0.0.1) + nio4r (2.5.8) nokogiri (1.12.3) mini_portile2 (~> 2.6.1) racc (~> 1.4) @@ -26,6 +28,8 @@ GEM parser (3.0.2.0) ast (~> 2.4.1) public_suffix (4.0.6) + puma (5.6.4) + nio4r (~> 2.0) racc (1.5.2) rack (2.2.3) rack-protection (2.1.0) @@ -76,6 +80,14 @@ GEM rack (~> 2.2) rack-protection (= 2.1.0) tilt (~> 2.0) + sinatra-contrib (2.1.0) + multi_json + mustermann (~> 1.0) + rack-protection (= 2.1.0) + sinatra (= 2.1.0) + tilt (~> 2.0) + sinatra-reloader (1.0) + sinatra-contrib terminal-table (3.0.1) unicode-display_width (>= 1.1.1, < 3) tilt (2.0.10) @@ -88,11 +100,13 @@ PLATFORMS DEPENDENCIES capybara + puma rspec rubocop (= 1.20) simplecov simplecov-console sinatra + sinatra-reloader RUBY VERSION ruby 3.0.2p107 diff --git a/app.rb b/app.rb new file mode 100644 index 0000000000..5bc30dbb79 --- /dev/null +++ b/app.rb @@ -0,0 +1,52 @@ +require 'sinatra/base' +require 'sinatra/reloader' +require './lib/player' +require './lib/computer_player' +require './lib/game' + +class RPS < Sinatra::Base + configure :development do + register Sinatra::Reloader + end + + get '/' do + erb :index + end + + post '/names' do + player_1 = Player.new(params[:player_1_name]) + player_2 = ComputerPlayer.new + $game = Game.new(player_1, player_2) + redirect '/play' +end + +get '/play' do + @game = $game + erb :play +end + +post '/move' do + @game = $game + @game.player_1.current_move(params[:Choice]) + @game.player_2.current_move + $outcome = @game.current_round(@game.player_1.current_move(params[:Choice]), @game.player_2.current_move) + erb :move +end + +post '/continue' do + @game = $game + if (@game.player_1.wins == 3) or (@game.player_2.wins == 3) + redirect '/game-over' + else + redirect '/play' + end +end + +get '/game-over' do + @game = $game + erb :game_over +end + + # start the server if ruby file executed directly + run! if app_file == $0 +end diff --git a/config.ru b/config.ru new file mode 100644 index 0000000000..47bb24ff91 --- /dev/null +++ b/config.ru @@ -0,0 +1,2 @@ +require_relative "./app" +run RPS \ No newline at end of file diff --git a/lib/computer_player.rb b/lib/computer_player.rb new file mode 100644 index 0000000000..4fab558821 --- /dev/null +++ b/lib/computer_player.rb @@ -0,0 +1,23 @@ +require_relative 'player' + +class ComputerPlayer < Player + + attr_reader :name, :move, :wins + + def initialize(name = "Computer") + super + end + + def current_move + selection = ["Rock", "Paper", "Scissors"] + @move = selection[rand(0..2)] + end + + def won + @wins += 1 + end + + def computer? + true + end +end \ No newline at end of file diff --git a/lib/game.rb b/lib/game.rb new file mode 100644 index 0000000000..a417441456 --- /dev/null +++ b/lib/game.rb @@ -0,0 +1,38 @@ +class Game + + attr_reader :player_1, :player_2, :rounds, :victor + + def initialize(player_1, player_2) + @player_1 = player_1 + @player_2 = player_2 + @victor = "" + end + + def current_round(player_1_move, player_2_move) + winner = "" + return winner = "draw" if player_1_move == player_2_move + case player_1_move + when "Rock" + if player_2_move == "Paper" + winner = @player_2 + else + winner = @player_1 + end + when "Paper" + if player_2_move == "Scissors" + winner = @player_2 + else + winner = @player_1 + end + when "Scissors" + if player_2_move == "Rock" + winner = @player_2 + else + winner = @player_1 + end + end + winner.won + @victor = winner if winner.wins == 3 + return winner + end +end \ No newline at end of file diff --git a/lib/player.rb b/lib/player.rb new file mode 100644 index 0000000000..906726f86e --- /dev/null +++ b/lib/player.rb @@ -0,0 +1,22 @@ +class Player + + attr_reader :name, :move, :wins + + def initialize(name) + @name = name + @wins = 0 + end + + def current_move(move) + @move = move + end + + def won + @wins += 1 + end + + def computer? + false + end + +end \ No newline at end of file diff --git a/spec/computer_player_spec.rb b/spec/computer_player_spec.rb new file mode 100644 index 0000000000..3841c0c703 --- /dev/null +++ b/spec/computer_player_spec.rb @@ -0,0 +1,17 @@ +require 'computer_player' + +describe ComputerPlayer do + subject(:computer_player) { described_class.new } + + it "Inherits from the player class" do + expect(described_class).to be < Player + end + + it "Checks to see whether it is a computer" do + expect(computer_player.computer?).to eq true + end + + it "Returns the default name of Computer" do + expect(computer_player.name).to eq "Computer" + end +end \ No newline at end of file diff --git a/spec/features/enter_names_spec.rb b/spec/features/enter_names_spec.rb new file mode 100644 index 0000000000..6c6f34a88a --- /dev/null +++ b/spec/features/enter_names_spec.rb @@ -0,0 +1,6 @@ +feature 'Enter Names' do + scenario 'Submit player 1 name and displays it on the following page' do + sign_in_and_play + expect(page).to have_content("SH vs. Computer") + end +end \ No newline at end of file diff --git a/spec/game_spec.rb b/spec/game_spec.rb new file mode 100644 index 0000000000..7ba979e7ee --- /dev/null +++ b/spec/game_spec.rb @@ -0,0 +1,16 @@ +require 'game' +require 'player' + +describe Game do + subject(:player_1) { Player.new("SH") } + subject(:player_2) { ComputerPlayer.new } + subject(:game) { Game.new(:player_1, :player_2) } + + it "Initializes" do + expect(game.player_1).to eq :player_1 + expect(game.player_2).to eq :player_2 + end + it "Confirms draw if selection is the same" do + expect(game.current_round("Rock", "Rock")).to eq "draw" + end +end \ No newline at end of file diff --git a/spec/player_spec.rb b/spec/player_spec.rb new file mode 100644 index 0000000000..eb8da3beed --- /dev/null +++ b/spec/player_spec.rb @@ -0,0 +1,27 @@ +require 'Player' + +RSpec.describe Player do + subject(:sh) { Player.new("SH") } + + it "Returns the player's name" do + expect(sh.name).to eq "SH" + end + + it "Checks to see if it is a computer player" do + expect(sh.computer?).to eq false + end + + it "Returns the move passed through the current_move method" do + sh.current_move("Rock") + expect(sh.move).to eq "Rock" + end + + it "Calls the won method and checks if it has increased by 1" do + # No. of wins to be initally 0 + expect(sh.wins).to eq 0 + # No. of wins to increase by 1 upon first win + sh.won + expect(sh.wins).to eq 1 + end + +end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 11a50a94e5..e38415a6ec 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,6 +1,14 @@ +ENV['RACK_ENV'] = 'test' + +require File.join(File.dirname(__FILE__), '..', 'app.rb') + +require 'capybara' require 'capybara/rspec' require 'simplecov' require 'simplecov-console' +require 'web_helpers' + +Capybara.app = RPS SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([ SimpleCov::Formatter::Console, diff --git a/spec/web_helpers.rb b/spec/web_helpers.rb new file mode 100644 index 0000000000..774b36f024 --- /dev/null +++ b/spec/web_helpers.rb @@ -0,0 +1,5 @@ +def sign_in_and_play + visit('/') + fill_in :player_1_name, with: 'SH' + click_button "Submit" +end \ No newline at end of file diff --git a/views/game_over.erb b/views/game_over.erb new file mode 100644 index 0000000000..f1bd9506ec --- /dev/null +++ b/views/game_over.erb @@ -0,0 +1,5 @@ +<% if @game.victor.name == "Computer" %> +

Game Over!

+<% else %> +

<%= @game.victor.name %> you won!

+<% end %> \ No newline at end of file diff --git a/views/index.erb b/views/index.erb new file mode 100644 index 0000000000..ea265a72e6 --- /dev/null +++ b/views/index.erb @@ -0,0 +1,8 @@ +

Rock, Paper, Scissors!

+
+ + +
\ No newline at end of file diff --git a/views/move.erb b/views/move.erb new file mode 100644 index 0000000000..fb1b75ba14 --- /dev/null +++ b/views/move.erb @@ -0,0 +1,11 @@ +

<%= @game.player_1.name %> chose <%= @game.player_1.move %>

+

<%= @game.player_2.name %> chose <%= @game.player_2.move %>

+<% if $outcome == "draw" %> +

It's a draw!

+<% else %> +

<%= $outcome.name %> won this round!

+<% end %> + +
+ +
diff --git a/views/play.erb b/views/play.erb new file mode 100644 index 0000000000..7c5eb15333 --- /dev/null +++ b/views/play.erb @@ -0,0 +1,25 @@ + + +

<%= @game.player_1.name %> vs. Computer

+

<%= @game.player_1.name %>: <%= @game.player_1.wins %>

+

<%= @game.player_2.name %>: <%= @game.player_2.wins %>

+
+ + + +
\ No newline at end of file From 8f8b794bfa7ef20f24b7247d2c1ed48d863e9806 Mon Sep 17 00:00:00 2001 From: Saif-ul Hussain Date: Sun, 5 Jun 2022 21:30:38 +0100 Subject: [PATCH 2/2] Refactored Code --- lib/game.rb | 6 +++--- views/game_over.erb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/game.rb b/lib/game.rb index a417441456..52763846e8 100644 --- a/lib/game.rb +++ b/lib/game.rb @@ -1,11 +1,11 @@ class Game - attr_reader :player_1, :player_2, :rounds, :victor + attr_reader :player_1, :player_2, :rounds, :overall_winner def initialize(player_1, player_2) @player_1 = player_1 @player_2 = player_2 - @victor = "" + @overall_winner = "" end def current_round(player_1_move, player_2_move) @@ -32,7 +32,7 @@ def current_round(player_1_move, player_2_move) end end winner.won - @victor = winner if winner.wins == 3 + @overall_winner = winner if winner.wins == 3 return winner end end \ No newline at end of file diff --git a/views/game_over.erb b/views/game_over.erb index f1bd9506ec..cec6ba1b76 100644 --- a/views/game_over.erb +++ b/views/game_over.erb @@ -1,5 +1,5 @@ -<% if @game.victor.name == "Computer" %> +<% if @game.overall_winner.name == "Computer" %>

Game Over!

<% else %> -

<%= @game.victor.name %> you won!

+

<%= @game.overall_winner.name %> you won!

<% end %> \ No newline at end of file