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

RPS Challenge #2129

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ source 'https://rubygems.org'
ruby '3.0.2'

gem 'sinatra'
gem 'sinatra-reloader'
gem 'puma'

group :test do
gem 'capybara'
Expand Down
14 changes: 14 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,19 @@ 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)
parallel (1.20.1)
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)
Expand Down Expand Up @@ -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)
Expand All @@ -88,11 +100,13 @@ PLATFORMS

DEPENDENCIES
capybara
puma
rspec
rubocop (= 1.20)
simplecov
simplecov-console
sinatra
sinatra-reloader

RUBY VERSION
ruby 3.0.2p107
Expand Down
52 changes: 52 additions & 0 deletions app.rb
Original file line number Diff line number Diff line change
@@ -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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice clean control file, you've extracted the methods well.

@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
2 changes: 2 additions & 0 deletions config.ru
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
require_relative "./app"
run RPS
23 changes: 23 additions & 0 deletions lib/computer_player.rb
Original file line number Diff line number Diff line change
@@ -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
38 changes: 38 additions & 0 deletions lib/game.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
class Game

attr_reader :player_1, :player_2, :rounds, :overall_winner

def initialize(player_1, player_2)
@player_1 = player_1
@player_2 = player_2
@overall_winner = ""
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
@overall_winner = winner if winner.wins == 3
return winner
end
end
22 changes: 22 additions & 0 deletions lib/player.rb
Original file line number Diff line number Diff line change
@@ -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
17 changes: 17 additions & 0 deletions spec/computer_player_spec.rb
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions spec/features/enter_names_spec.rb
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions spec/game_spec.rb
Original file line number Diff line number Diff line change
@@ -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
27 changes: 27 additions & 0 deletions spec/player_spec.rb
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
5 changes: 5 additions & 0 deletions spec/web_helpers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
def sign_in_and_play
visit('/')
fill_in :player_1_name, with: 'SH'
click_button "Submit"
end
5 changes: 5 additions & 0 deletions views/game_over.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<% if @game.overall_winner.name == "Computer" %>
<h1>Game Over!</h1>
<% else %>
<h1><%= @game.overall_winner.name %> you won!</h1>
<% end %>
8 changes: 8 additions & 0 deletions views/index.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<h1>Rock, Paper, Scissors!</h1>
<form action="/names" method="post">
<label for="player_1_name">
Please enter your name:
<input type="text" name="player_1_name">
</label>
<input type="submit" value="Submit">
</form>
11 changes: 11 additions & 0 deletions views/move.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<h1><%= @game.player_1.name %> chose <%= @game.player_1.move %></h1>
<h1><%= @game.player_2.name %> chose <%= @game.player_2.move %></h1>
<% if $outcome == "draw" %>
<h1>It's a draw!</h1>
<% else %>
<h1><%= $outcome.name %> won this round!</h1>
<% end %>

<form action="/continue" method="post">
<input type="submit" value="Continue">
</form>
25 changes: 25 additions & 0 deletions views/play.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<style>
.glow {
font-size: 40px;
color: navy;
animation: glow 1s ease-in-out infinite alternate;
}
@-webkit-keyframes glow {
from {
text-shadow: 0 0 10px #fff, 0 0 20px #fff, 0 0 10px #000099, 0 0 10px #000099, 0 0 10px #000099, 0 0 10px #000099, 0 0 10px #000099;
}

to {
text-shadow: 0 0 10px #fff, 0 0 30px #000099, 0 0 10px #000099, 0 0 10px #000099, 0 0 10px #000099, 0 0 10px #000099, 0 0 10px #000099;
}
}
</style>

<h1><%= @game.player_1.name %> vs. Computer</h1>
<h2><%= @game.player_1.name %>: <%= @game.player_1.wins %></h2>
<h2><%= @game.player_2.name %>: <%= @game.player_2.wins %></h2>
<form action="/move" method="post">
<input type="submit" name="Choice" value="Rock">
<input type="submit" name="Choice" value="Paper">
<input type="submit" name="Choice" value="Scissors">
</form>