tarzan 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec +2 -0
- data/Gemfile +2 -0
- data/HISTORY.md +9 -0
- data/README.md +2 -0
- data/bin/tarzan +7 -1
- data/lib/tarzan.rb +2 -22
- data/lib/tarzan/games/base/game.rb +42 -0
- data/lib/tarzan/games/odds_and_evens/game.rb +27 -0
- data/lib/tarzan/games/odds_and_evens/move.rb +36 -0
- data/lib/tarzan/games/rock_paper_scissors/game.rb +27 -0
- data/lib/tarzan/games/rock_paper_scissors/move.rb +29 -0
- data/lib/tarzan/interfaces/base/interface.rb +33 -0
- data/lib/tarzan/interfaces/campfire/interface.rb +26 -0
- data/lib/tarzan/interfaces/shell/interface.rb +20 -0
- data/lib/tarzan/version.rb +1 -1
- data/spec/tarzan/games/odds_and_evens/move_spec.rb +25 -0
- data/spec/tarzan/games/rock_paper_scissors/move_spec.rb +30 -0
- data/tarzan.gemspec +11 -8
- metadata +44 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f31aa1899f9fbf7f76718daf62b6cd37ceda35b1
|
4
|
+
data.tar.gz: dce2d1f47a6cdaa2205c8816a261afb84d8374ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5b39f5e860d52b9b4390ae3e322720f307a56c40eace5a0e42178c37e928588563915d8e5b3355e3ff55b2b23fcefc67644dd524b67692c9a480c0365733564
|
7
|
+
data.tar.gz: c26ad5145f86c11cf6de78d836afbd570fb915c88d31ed01c9c51aeb2e75a9777983a6e0a74d59532327be69bfbb4e274e043bed4a522067fd4e105215566fc9
|
data/.rspec
ADDED
data/Gemfile
CHANGED
data/HISTORY.md
ADDED
data/README.md
CHANGED
@@ -22,6 +22,8 @@ From the command line run:
|
|
22
22
|
|
23
23
|
$ tarzan
|
24
24
|
|
25
|
+
To use Campfire as an interface, define the following environment variables: `CAMPFIRE_SUBDOMAIN`, `CAMPFIRE_ROOM_ID` and `CAMPFIRE_TOKEN`.
|
26
|
+
|
25
27
|
## Contributing
|
26
28
|
|
27
29
|
1. Fork it ( http://github.com/claudiob/tarzan/fork )
|
data/bin/tarzan
CHANGED
@@ -7,4 +7,10 @@ rescue LoadError
|
|
7
7
|
require 'tarzan'
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
puts %{Pick [S]hell or [C]ampfire: }
|
11
|
+
interface = case gets.strip
|
12
|
+
when 'S' then Tarzan::Interfaces::Shell::Interface.new
|
13
|
+
when 'C' then Tarzan::Interfaces::Campfire::Interface.new subdomain: ENV['CAMPFIRE_SUBDOMAIN'], room_id: ENV['CAMPFIRE_ROOM_ID'], token: ENV['CAMPFIRE_TOKEN']
|
14
|
+
end
|
15
|
+
|
16
|
+
interface.play
|
data/lib/tarzan.rb
CHANGED
@@ -1,22 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
puts %{Welcome to the Game Hall}
|
4
|
-
|
5
|
-
puts %{Let’s play Rock Paper Scissors}
|
6
|
-
|
7
|
-
puts %{Pick [R]ock, [P]aper, or [S]cissors: }
|
8
|
-
|
9
|
-
move_p1 = gets.strip
|
10
|
-
move_p2 = ['R', 'P', 'S'].sample
|
11
|
-
|
12
|
-
puts %{You played #{move_p1} - I played #{move_p2}}
|
13
|
-
|
14
|
-
case "#{move_p1}#{move_p2}"
|
15
|
-
when 'RS', 'SP', 'PR' then puts %{You win!}
|
16
|
-
when 'RP', 'SR', 'PS' then puts %{You lose!}
|
17
|
-
when 'RR', 'SS', 'PP' then puts %{It’s a tie!}
|
18
|
-
end
|
19
|
-
|
20
|
-
puts %{Goodbye, and come back to the Game Hall}
|
21
|
-
end
|
22
|
-
end
|
1
|
+
require 'tarzan/interfaces/shell/interface'
|
2
|
+
require 'tarzan/interfaces/campfire/interface'
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Tarzan
|
2
|
+
module Games
|
3
|
+
module Base
|
4
|
+
class Game
|
5
|
+
def initialize(options = {})
|
6
|
+
@interface = options[:interface]
|
7
|
+
end
|
8
|
+
|
9
|
+
def play
|
10
|
+
@interface.say %{Rules: #{rules}}
|
11
|
+
|
12
|
+
move_p1 = prompt_move
|
13
|
+
move_p2 = random_move
|
14
|
+
|
15
|
+
@interface.say %{You played #{move_p1} - I played #{move_p2}}
|
16
|
+
|
17
|
+
outcome = case move_p1 <=> move_p2
|
18
|
+
when 1 then %{You win!}
|
19
|
+
when -1 then %{You lose!}
|
20
|
+
when 0 then %{It’s a tie!}
|
21
|
+
end
|
22
|
+
|
23
|
+
@interface.say outcome
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def rules
|
29
|
+
# Subclasses are expected to define rules
|
30
|
+
end
|
31
|
+
|
32
|
+
def prompt_move
|
33
|
+
# Subclasses are expected to define how to prompt the user for a move
|
34
|
+
end
|
35
|
+
|
36
|
+
def random_move
|
37
|
+
# Subclasses are expected to define how to get a random move
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'tarzan/games/base/game'
|
2
|
+
require 'tarzan/games/odds_and_evens/move'
|
3
|
+
|
4
|
+
module Tarzan
|
5
|
+
module Games
|
6
|
+
module OddsAndEvens
|
7
|
+
class Game < Base::Game
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def rules
|
12
|
+
'Odd sum wins, even sum loses'
|
13
|
+
end
|
14
|
+
|
15
|
+
def prompt_move
|
16
|
+
choice = @interface.prompt(Move.valid).to_i
|
17
|
+
Move.new choice: choice, wins_on_odds: true
|
18
|
+
end
|
19
|
+
|
20
|
+
def random_move
|
21
|
+
choice = Move.valid.sample
|
22
|
+
Move.new choice: choice, wins_on_odds: false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Tarzan
|
2
|
+
module Games
|
3
|
+
module OddsAndEvens
|
4
|
+
class Move
|
5
|
+
attr_reader :choice
|
6
|
+
|
7
|
+
def self.valid
|
8
|
+
('1'..'5').to_a
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(options = {})
|
12
|
+
@wins_on_odds = options[:wins_on_odds]
|
13
|
+
@choice = options[:choice]
|
14
|
+
end
|
15
|
+
|
16
|
+
def <=>(another)
|
17
|
+
case choice.to_i + another.choice.to_i + finger_offset
|
18
|
+
when ->(sum) { sum.odd? } then 1
|
19
|
+
when ->(sum) { sum.even? } then -1
|
20
|
+
else 0 # impossible :)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
"#{@choice}"
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def finger_offset
|
31
|
+
@wins_on_odds ? 0 : 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'tarzan/games/base/game'
|
2
|
+
require 'tarzan/games/rock_paper_scissors/move'
|
3
|
+
|
4
|
+
module Tarzan
|
5
|
+
module Games
|
6
|
+
module RockPaperScissors
|
7
|
+
class Game < Base::Game
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def rules
|
12
|
+
'Rock beats Scissors beats Paper beats Rock'
|
13
|
+
end
|
14
|
+
|
15
|
+
def prompt_move
|
16
|
+
choice = @interface.prompt Move.valid
|
17
|
+
Move.new choice: choice
|
18
|
+
end
|
19
|
+
|
20
|
+
def random_move
|
21
|
+
choice = Move.valid.sample
|
22
|
+
Move.new choice: choice
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Tarzan
|
2
|
+
module Games
|
3
|
+
module RockPaperScissors
|
4
|
+
class Move
|
5
|
+
attr_reader :choice
|
6
|
+
|
7
|
+
def self.valid
|
8
|
+
['R', 'P', 'S']
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(options = {})
|
12
|
+
@choice = options[:choice]
|
13
|
+
end
|
14
|
+
|
15
|
+
def <=>(another)
|
16
|
+
case "#{choice}#{another.choice}"
|
17
|
+
when 'RS', 'SP', 'PR' then 1
|
18
|
+
when 'RP', 'SR', 'PS' then -1
|
19
|
+
else 0
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
"#{@choice}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'tarzan/games/rock_paper_scissors/game'
|
2
|
+
require 'tarzan/games/odds_and_evens/game'
|
3
|
+
|
4
|
+
module Tarzan
|
5
|
+
module Interfaces
|
6
|
+
module Base
|
7
|
+
class Interface
|
8
|
+
def play
|
9
|
+
say %{Welcome to the Game Hall}
|
10
|
+
|
11
|
+
say %{Pick [R]ockPaperScissors or [O]ddsAndEvens: }
|
12
|
+
|
13
|
+
game = case prompt(['R', 'O'])
|
14
|
+
when 'R' then Tarzan::Games::RockPaperScissors::Game.new interface: self
|
15
|
+
when 'O' then Tarzan::Games::OddsAndEvens::Game.new interface: self
|
16
|
+
end
|
17
|
+
|
18
|
+
game.play
|
19
|
+
|
20
|
+
say %{Goodbye, and come back to the Game Hall}
|
21
|
+
end
|
22
|
+
|
23
|
+
def say(message)
|
24
|
+
# Subclasses are expected to define how to say messages
|
25
|
+
end
|
26
|
+
|
27
|
+
def prompt(valid_choices = [])
|
28
|
+
# Subclasses are expected to define how to prompt messages
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'tarzan/interfaces/base/interface'
|
2
|
+
require 'nico'
|
3
|
+
|
4
|
+
module Tarzan
|
5
|
+
module Interfaces
|
6
|
+
module Campfire
|
7
|
+
class Interface < Base::Interface
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
@room = Nico::Room.new options
|
11
|
+
end
|
12
|
+
|
13
|
+
def say(message)
|
14
|
+
@room.say message
|
15
|
+
end
|
16
|
+
|
17
|
+
def prompt(valid_choices = [])
|
18
|
+
say %{Pick one: #{valid_choices.join ' - '} }
|
19
|
+
@room.each_message do |message|
|
20
|
+
return message if valid_choices.include?(message)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'tarzan/interfaces/base/interface'
|
2
|
+
|
3
|
+
module Tarzan
|
4
|
+
module Interfaces
|
5
|
+
module Shell
|
6
|
+
class Interface < Base::Interface
|
7
|
+
|
8
|
+
def say(message)
|
9
|
+
puts message
|
10
|
+
end
|
11
|
+
|
12
|
+
def prompt(valid_choices = [])
|
13
|
+
say %{Pick one: #{valid_choices.join ' - '} }
|
14
|
+
choice = gets.strip
|
15
|
+
valid_choices.include?(choice) ? choice : prompt(valid_choices)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/tarzan/version.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'tarzan/games/odds_and_evens/move'
|
2
|
+
|
3
|
+
module Tarzan
|
4
|
+
module Games
|
5
|
+
module OddsAndEvens
|
6
|
+
describe Move do
|
7
|
+
describe '<=>' do
|
8
|
+
context 'given that victory is on odds and a hand of 3 fingers' do
|
9
|
+
let (:move_p1) { Move.new wins_on_odds: true, fingers: 3 }
|
10
|
+
|
11
|
+
context 'versus a hand of 4 fingers' do
|
12
|
+
let (:move_p2) { Move.new wins_on_odds: false, fingers: 4 }
|
13
|
+
it { expect(move_p1 <=> move_p2).to eq 1}
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'versus a hand of 5 fingers' do
|
17
|
+
let (:move_p2) { Move.new wins_on_odds: false, fingers: 5 }
|
18
|
+
it { expect(move_p1 <=> move_p2).to eq -1}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'tarzan/games/rock_paper_scissors/move'
|
2
|
+
|
3
|
+
module Tarzan
|
4
|
+
module Games
|
5
|
+
module RockPaperScissors
|
6
|
+
describe Move do
|
7
|
+
describe '<=>' do
|
8
|
+
context 'given a hand of Rock' do
|
9
|
+
let (:move_p1) { Move.new hand: 'R' }
|
10
|
+
|
11
|
+
context 'versus a hand of Scissors' do
|
12
|
+
let (:move_p2) { Move.new hand: 'S'}
|
13
|
+
it { expect(move_p1 <=> move_p2).to eq 1}
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'versus a hand of Paper' do
|
17
|
+
let (:move_p2) { Move.new hand: 'P'}
|
18
|
+
it { expect(move_p1 <=> move_p2).to eq -1}
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'versus a hand of Rock' do
|
22
|
+
let (:move_p2) { Move.new hand: 'R'}
|
23
|
+
it { expect(move_p1 <=> move_p2).to eq 0}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/tarzan.gemspec
CHANGED
@@ -4,20 +4,23 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'tarzan/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'tarzan'
|
8
8
|
spec.version = Tarzan::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['claudiob']
|
10
|
+
spec.email = ['claudiob@gmail.com']
|
11
11
|
spec.summary = %q{King of the Game Jungle.}
|
12
12
|
spec.description = %q{Step-by-step tutorial to modular games in Ruby}
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
13
|
+
spec.homepage = 'https://github.com/claudiob/tarzan'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.
|
22
|
-
|
21
|
+
spec.add_dependency 'nico', '>= 0.1.0' # Campfire integration
|
22
|
+
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.5'
|
24
|
+
spec.add_development_dependency 'rake', '~> 0'
|
25
|
+
spec.add_development_dependency 'rspec'
|
23
26
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tarzan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- claudiob
|
@@ -10,6 +10,20 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2014-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nico
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.1.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.1.0
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +52,20 @@ dependencies:
|
|
38
52
|
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
description: Step-by-step tutorial to modular games in Ruby
|
42
70
|
email:
|
43
71
|
- claudiob@gmail.com
|
@@ -47,13 +75,25 @@ extensions: []
|
|
47
75
|
extra_rdoc_files: []
|
48
76
|
files:
|
49
77
|
- ".gitignore"
|
78
|
+
- ".rspec"
|
50
79
|
- Gemfile
|
80
|
+
- HISTORY.md
|
51
81
|
- LICENSE.txt
|
52
82
|
- README.md
|
53
83
|
- Rakefile
|
54
84
|
- bin/tarzan
|
55
85
|
- lib/tarzan.rb
|
86
|
+
- lib/tarzan/games/base/game.rb
|
87
|
+
- lib/tarzan/games/odds_and_evens/game.rb
|
88
|
+
- lib/tarzan/games/odds_and_evens/move.rb
|
89
|
+
- lib/tarzan/games/rock_paper_scissors/game.rb
|
90
|
+
- lib/tarzan/games/rock_paper_scissors/move.rb
|
91
|
+
- lib/tarzan/interfaces/base/interface.rb
|
92
|
+
- lib/tarzan/interfaces/campfire/interface.rb
|
93
|
+
- lib/tarzan/interfaces/shell/interface.rb
|
56
94
|
- lib/tarzan/version.rb
|
95
|
+
- spec/tarzan/games/odds_and_evens/move_spec.rb
|
96
|
+
- spec/tarzan/games/rock_paper_scissors/move_spec.rb
|
57
97
|
- tarzan.gemspec
|
58
98
|
homepage: https://github.com/claudiob/tarzan
|
59
99
|
licenses:
|
@@ -79,4 +119,6 @@ rubygems_version: 2.2.0
|
|
79
119
|
signing_key:
|
80
120
|
specification_version: 4
|
81
121
|
summary: King of the Game Jungle.
|
82
|
-
test_files:
|
122
|
+
test_files:
|
123
|
+
- spec/tarzan/games/odds_and_evens/move_spec.rb
|
124
|
+
- spec/tarzan/games/rock_paper_scissors/move_spec.rb
|