studio_game_rhino 1.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 252c3e3a5b64163760c33d115e00d4be9e7178c3
4
+ data.tar.gz: 57b6f2dea5db3248a389be7622b164c01a1a8e12
5
+ SHA512:
6
+ metadata.gz: 093343e214a299394def27f0569a2bf6ab0513db7f965fece6c01648e15fd109234fdaf78dfe2ff9259b62298e5e5961867ba5f535c0739a9158d9767341101a
7
+ data.tar.gz: 2fb4f433e0494de7f994f54115bc848a9eac22b7a8227d658b6f330f427665747b38d4913fbee541fe061066c6fa056218e67ae6c2b91cf9c77728c0834ff016
data/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright (c) 2015 Pragmatic Studios
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1 @@
1
+ # studio_game_for_pragstudios_course
data/bin/players.csv ADDED
@@ -0,0 +1,10 @@
1
+ The Ape Men,105
2
+ The Azarians,203
3
+ The Beast-Men,41
4
+ The Coripies, 17
5
+ The Ganaks,42
6
+ The Gorbuses,31
7
+ The Horibs,362
8
+ The Mahars,54
9
+ The Sabertooth Men,73
10
+ The Sagoths,149
data/bin/studio_game ADDED
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/studio_game/game'
4
+ require_relative '../lib/studio_game/player'
5
+ require_relative '../lib/studio_game/clumsy_player'
6
+ require_relative '../lib/studio_game/berserk_player'
7
+
8
+ player1 = StudioGame::Player.new("moe")
9
+ player2 = StudioGame::Player.new("larry", 60)
10
+ player3 = StudioGame::Player.new("curly", 125)
11
+ player4 = StudioGame::ClumsyPlayer.new("klutz", 105, 3)
12
+ player5 = StudioGame::BerserkPlayer.new("berserker", 105)
13
+
14
+ knuckleheads = StudioGame::Game.new("Knuckleheads")
15
+ # knuckleheads.add_player(player1)
16
+ # knuckleheads.add_player(player2)
17
+ # knuckleheads.add_player(player3)
18
+
19
+ knuckleheads.add_player(player4)
20
+ knuckleheads.add_player(player5)
21
+
22
+ default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
23
+ knuckleheads.load_players(ARGV.shift || default_player_file)
24
+
25
+
26
+ loop do
27
+ puts "\nHow many game rounds? (enter 'quit' to exit)"
28
+ answer = gets.chomp.downcase
29
+ case answer
30
+ when /^\d+$/
31
+ knuckleheads.play(answer.to_i)
32
+ when 'quit', 'exit'
33
+ knuckleheads.print_stats
34
+ break
35
+ else
36
+ puts "Please enter a number or enter 'quit' to exit."
37
+ end #case
38
+ end
39
+
40
+ knuckleheads.print_stats
41
+ knuckleheads.save_high_scores
42
+
43
+ # player4 = Player.new("Charlie Denmare")
44
+ # player5 = Player.new("Keith Scorfano", 95)
45
+ # player6 = Player.new("Muzzy Borbotti", 125)
46
+
47
+ # playwright = Game.new("Playwright")
48
+ # # playwright.add_player(player4)
49
+ # # playwright.add_player(player5)
50
+ # # playwright.add_player(player6)
51
+
52
+ # loop do
53
+ # puts "\nHow many game rounds? (enter 'quit' to exit)"
54
+ # answer = gets.chomp.downcase
55
+ # case answer
56
+ # when /^\d+$/
57
+ # playwright.play(answer.to_i)
58
+ # when 'quit', 'exit'
59
+ # playwright.print_stats
60
+ # break
61
+ # else
62
+ # puts "Please enter a number or enter 'quit' to exit."
63
+ # end #case
64
+ # end #loop
65
+
66
+ # playwright.print_stats
67
+
68
+
69
+ # player1 = Player.new("Moe")
70
+ # puts player1.health
71
+ #
72
+ # player2 = Player.new("larry", 60)
73
+ # player3 = Player.new("Curly", 70)
74
+ # puts player2.name
75
+ # player2.name = "lawrence"
76
+ # puts player2.name
77
+ # puts player2.health
78
+ # puts player2.score
79
+ # puts player2
80
+ #
81
+ # players = [player1, player2, player3]
82
+ # puts "There are #{players.size} players in the game."
83
+ # players.each do |p|
84
+ # puts p
85
+ # end
86
+ #
87
+ # players.each do |p|
88
+ # puts p.health
89
+ # end
90
+ #
91
+ # players.pop
92
+ # players.push(Player.new("Shemp", 120))
93
+ # players.each do |p|
94
+ # puts p.w00t
95
+ # puts p.blam
96
+ # puts p.w00t
97
+ # puts p.w00t
98
+ # puts p
99
+ # end
100
+
101
+
102
+ # def time
103
+ # current_time = Time.new
104
+ # current_time.strftime("%")
105
+ # end
106
+ #
107
+ #
108
+ # def say_hello (name, health=100)
109
+ # "I'm #{name.capitalize} with a health of #{health} as of #{time}."
110
+ # end
111
+ #
112
+ # puts say_hello("larry", 60)
113
+ # puts say_hello("curly", 125)
114
+ # puts say_hello("moe")
115
+ # puts say_hello("shemp", 90)
116
+
117
+
118
+ #puts self.class
119
+
120
+ #puts "Players:\n\t#{name1}\n\t#{name2}\n\t#{name3}"
121
+
122
+ # greeting = "Welcome!"
123
+ #
124
+ # 3.times do
125
+ # puts greeting.upcase
126
+ # end
127
+ #
128
+ # puts Time.now
129
+ #Check TextMAte for the correct Ruby variable
130
+ #puts RUBY_VERSION
131
+
@@ -0,0 +1,8 @@
1
+ module StudioGame
2
+ module Auditable
3
+ def audit
4
+ @number
5
+ puts "Rolled a #{@number} #{}"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,42 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+
5
+ class BerserkPlayer < Player
6
+
7
+ def initialize(name, health=100)
8
+ super(name, health)
9
+ @w00t_count = 0
10
+ end
11
+
12
+ def berserk?
13
+ @w00t_count > 5
14
+ end
15
+
16
+ def w00t
17
+ super
18
+ @w00t_count +=1
19
+ puts "#{@name} is berserk!" if berserk?
20
+ end
21
+
22
+ def blam
23
+ if berserk?
24
+ w00t
25
+ else
26
+ super
27
+ end
28
+ end
29
+
30
+ # or use the ternary operator:
31
+ # berserk? ? w00t : super
32
+
33
+ end #end BerserkPlayer
34
+
35
+ if __FILE__ == $0
36
+ berserker = BerserkPlayer.new("berserker", 50)
37
+ 6.times { berserker.w00t }
38
+ 2.times { berserker.blam }
39
+ puts berserker.health
40
+ end
41
+
42
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+ class ClumsyPlayer < Player
5
+ attr_reader :boost_factor
6
+
7
+ def initialize(name, health=100, boost_factor=1)
8
+ super(name, health)
9
+ @boost_factor = boost_factor
10
+ end
11
+
12
+ def w00t
13
+ @boost_factor.times { super }
14
+ end
15
+
16
+ def found_treasure(treasure)
17
+ damaged_treasure = Treasure.new(treasure.name, treasure.points / 2.0)
18
+ super(damaged_treasure)
19
+ end
20
+
21
+ end
22
+
23
+ if __FILE__ == $0
24
+ clumsy = ClumsyPlayer.new("klutz")
25
+
26
+ hammer = Treasure.new(:hammer, 50)
27
+ clumsy.found_treasure(hammer)
28
+ clumsy.found_treasure(hammer)
29
+ clumsy.found_treasure(hammer)
30
+
31
+ crowbar = Treasure.new(:crowbar, 400)
32
+ clumsy.found_treasure(crowbar)
33
+
34
+ clumsy.each_found_treasure do |treasure|
35
+ puts "#{treasure.points} total #{treasure.name} points"
36
+ end
37
+ puts "#{clumsy.points} grand total points"
38
+ end
39
+ end
@@ -0,0 +1,22 @@
1
+ require_relative 'auditable'
2
+
3
+ module StudioGame
4
+
5
+ class Die
6
+ include Auditable
7
+
8
+ attr_reader :number
9
+
10
+ def initialize
11
+ roll
12
+ end
13
+
14
+ def roll
15
+ @number = rand(1..6)
16
+ audit
17
+ @number
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,166 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'game_turn'
4
+ require_relative 'treasure_trove'
5
+
6
+ module StudioGame
7
+
8
+ class Game
9
+
10
+ attr_reader :title
11
+
12
+ def initialize(title)
13
+ @title = title
14
+ @players = []
15
+ end
16
+
17
+ # Roll your own CSV file reading
18
+ def load_players(from_file)
19
+ File.readlines(from_file).each do |line|
20
+ add_player(Player.from_csv(line))
21
+ end
22
+ end
23
+
24
+ # ... or with CSV class in Ruby core
25
+
26
+ # def load_players(from_file)
27
+ # CSV.foreach(from_file) do |row|
28
+ # player = Player.new(row[0], row[1].to_i)
29
+ # add_player(Player.from_csv(line))
30
+ # end
31
+ # end
32
+
33
+
34
+
35
+
36
+ def save_high_scores(to_file="high_scores.txt")
37
+ File.open(to_file, "w") do |file|
38
+ file.puts "#{@title} High Scores:"
39
+ @players.sort.each do |player|
40
+ file.puts high_score_entry(player)
41
+ end #players.each
42
+ end #File.open
43
+ end #save_high_scores
44
+
45
+ def high_score_entry(player)
46
+ formatted_name = player.name.ljust(20, '.')
47
+ "#{formatted_name} #{player.score}"
48
+ end
49
+
50
+
51
+ def add_player(a_player)
52
+ @players << a_player
53
+ #another way to do it @players.push(a_player)
54
+ end
55
+
56
+ def play(rounds)
57
+ puts "There are #{@players.size} players in #{@title}: "
58
+
59
+ @players.each do |player|
60
+ puts player
61
+ end
62
+
63
+ 1.upto(rounds) do |round|
64
+ if block_given?
65
+ break if yield
66
+ end
67
+ puts "\nRound #{round}:"
68
+ @players.each do |player|
69
+ GameTurn.take_turn(player)
70
+ puts player
71
+ end
72
+ end #end up to block
73
+
74
+ treasures = TreasureTrove::TREASURES
75
+
76
+ puts "\nThe treasure trove contains #{TreasureTrove::TREASURES.size} treasures."
77
+
78
+ treasures.each do |treasure|
79
+ puts "A #{treasure.name} is worth #{treasure.points} points."
80
+ end
81
+
82
+ end # end play
83
+
84
+ def print_name_and_health(player)
85
+ puts "#{player.name} ( #{player.health} )"
86
+ end
87
+
88
+ #iterates through each player and sums up the total points
89
+
90
+ def total_points
91
+ @players.reduce(0) do |sum, player|
92
+ sum + player.points
93
+ end
94
+ end
95
+
96
+
97
+ def print_stats
98
+
99
+ puts "#{total_points} total points from treasures found"
100
+
101
+ #Create two arrays:
102
+ #one containing only the strong players
103
+ strong_players = @players.select { |player| player.strong? }
104
+
105
+ #and the other containing only the wimpy players.
106
+ wimpy_players = @players.reject { |player| player.strong? }
107
+ puts "\n#{@title} Statistics:"
108
+
109
+ puts "\n#{strong_players.size} strong players"
110
+ strong_players.each do |strong_player|
111
+ print_name_and_health(strong_player)
112
+ end
113
+
114
+ puts "\n#{wimpy_players.size} wimpy players"
115
+ wimpy_players.each do |wimpy_player|
116
+ print_name_and_health(wimpy_player)
117
+ end
118
+
119
+ sorted_players = @players.sort { |a, b| b.score <=> a.score }
120
+
121
+ # puts "\n#{@title} High Scores:"
122
+ # @players.sort.each do |player|
123
+ # formatted_name = player.name.ljust(20, '.')
124
+ # puts "#{formatted_name} #{player.score}"
125
+ # end
126
+ #Refactored below:
127
+
128
+ puts "\n#{@title} High Scores:"
129
+ @players.sort.each do |player|
130
+ puts high_score_entry(player)
131
+ end
132
+
133
+
134
+ puts "\n#{@title} Total Points:"
135
+
136
+ @players.sort.each do |player|
137
+ puts "\n#{player.name}'s point totals:"
138
+ player.each_found_treasure do |treasure|
139
+ puts "#{treasure.points} total #{treasure.name} points"
140
+ end
141
+ puts "#{player.points} grand total points"
142
+ end
143
+
144
+
145
+
146
+ end # end print_stats
147
+
148
+ end # end class Game
149
+
150
+
151
+
152
+ if __FILE__ == $0
153
+ game = Game.new("Test Game")
154
+ puts game.title
155
+
156
+ player1 = Player.new("Testmaster I.C.E.")
157
+ player2 = Player.new("Testio Samploni", 95)
158
+ player3 = Player.new("Vera Fymyecode", 125)
159
+
160
+ game.add_player(player1)
161
+ game.add_player(player2)
162
+ game.add_player(player3)
163
+ game.play
164
+ end
165
+
166
+ end
@@ -0,0 +1,29 @@
1
+ require_relative 'player'
2
+ # require_relative 'loaded_die'
3
+ require_relative 'die'
4
+ require_relative 'treasure_trove'
5
+
6
+ module StudioGame
7
+
8
+ module GameTurn
9
+
10
+ def self.take_turn(player)
11
+ # die = LoadedDie.new
12
+ die = Die.new
13
+ case die.roll
14
+ when 1..2
15
+ player.blam
16
+ when 3..4
17
+ puts "#{player} was skipped."
18
+ else
19
+ player.w00t
20
+ end
21
+
22
+ treasure = TreasureTrove.random
23
+ player.found_treasure(treasure)
24
+ puts "#{player.name} found a #{treasure.name} worth #{treasure.points} points."
25
+
26
+ end # end take_turn
27
+
28
+ end # end GameTurn module
29
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'auditable'
2
+
3
+ module StudioGame
4
+
5
+ class LoadedDie
6
+ include Auditable
7
+ attr_reader :number
8
+
9
+ def roll
10
+ numbers = [1, 1, 2, 5, 6, 6]
11
+ @number = numbers.sample
12
+ audit
13
+ @number
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ module StudioGame
2
+ module Playable
3
+
4
+ def w00t
5
+ self.health += 15
6
+ puts "#{name.capitalize} got w00ted!"
7
+ end
8
+
9
+ def blam
10
+ self.health -= 10
11
+ puts "#{name.capitalize} got blammed!"
12
+ end
13
+
14
+ def strong?
15
+ self.health > 100
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,81 @@
1
+ require_relative 'treasure_trove'
2
+ require_relative 'playable'
3
+
4
+ module StudioGame
5
+
6
+ class Player
7
+ #mixin the methods from the Playable module
8
+ include Playable
9
+
10
+ attr_accessor :name
11
+ attr_accessor :health
12
+ #attr_writer
13
+
14
+
15
+ def initialize(name, health=100)
16
+ #set instance variables to parameter variables(local) so that they are available to other instance methods
17
+ @name = name.capitalize
18
+ @health = health
19
+ @found_treasures = Hash.new(0)
20
+
21
+ #Check that everything is set up:
22
+ #puts self.inspect
23
+ end
24
+
25
+
26
+
27
+ def name=(new_name)
28
+ @name = new_name.capitalize
29
+ end
30
+
31
+ def score
32
+ @health + points
33
+ #@health + @name.length
34
+ end
35
+
36
+ def to_s
37
+ "I'm #{@name.capitalize} with health = #{@health}, points = #{points}, and score = #{score}."
38
+ end
39
+
40
+
41
+ #Override the <=> method (the general comparison (aka spaceship) operator) in the Player class
42
+ #so that any time you call sort on an array of players it always returns them sorted by descending score.
43
+ def <=>(other)
44
+ other.score <=> score
45
+ end
46
+
47
+ def found_treasure(treasure)
48
+ @found_treasures[treasure.name] += treasure.points
49
+ puts "#{@name} found a #{treasure.name} worth #{treasure.points} points."
50
+ puts "#{@name}'s treasures: #{@found_treasures}"
51
+ end
52
+
53
+ def each_found_treasure
54
+ @found_treasures.each do |name, points|
55
+ yield Treasure.new(name, points)
56
+ end
57
+ end
58
+
59
+ def points
60
+ @found_treasures.values.reduce(0, :+)
61
+ end
62
+
63
+ def self.from_csv(string)
64
+ name, health = string.split(',')
65
+ Player.new(name, Integer(health))
66
+ end
67
+
68
+
69
+
70
+ end
71
+
72
+ if __FILE__ == $0
73
+ player = Player.new("moe")
74
+ puts player.name
75
+ puts player.health
76
+ player.w00t
77
+ puts player.health
78
+ player.blam
79
+ puts player.health
80
+ end
81
+ end #StudioGame module
@@ -0,0 +1,21 @@
1
+ module StudioGame
2
+
3
+ Treasure = Struct.new(:name, :points)
4
+
5
+ module TreasureTrove
6
+
7
+ TREASURES = [
8
+ Treasure.new(:pie, 5),
9
+ Treasure.new(:bottle, 25),
10
+ Treasure.new(:hammer, 50),
11
+ Treasure.new(:skillet, 100),
12
+ Treasure.new(:broomstick, 200),
13
+ Treasure.new(:crowbar, 400)
14
+ ]
15
+
16
+ def self.random
17
+ TREASURES.sample
18
+ end
19
+
20
+ end # end TreasureTrove
21
+ end
@@ -0,0 +1,37 @@
1
+ require 'studio_game/berserk_player'
2
+
3
+ module StudioGame
4
+
5
+ describe BerserkPlayer do
6
+
7
+ before do
8
+ @initial_health = 50
9
+ @player = BerserkPlayer.new("berserker", @initial_health)
10
+ end
11
+
12
+ it "does not go berserk when w00ted up to 5 times" do
13
+ 1.upto(5) { @player.w00t }
14
+
15
+ #@player.berserk?.should be_false
16
+ # or if using Rspec 3.0:
17
+ @player.berserk?.should be_falsey
18
+ end
19
+
20
+ it "goes berserk when w00ted more than 5 times" do
21
+ 1.upto(6) { @player.w00t }
22
+
23
+ #@player.berserk?.should be_true
24
+ # or if using Rspec 3.0:
25
+ @player.berserk?.should be_truthy
26
+ end
27
+
28
+ it "gets w00ted instead of blammed when it's gone berserk" do
29
+ 1.upto(6) { @player.w00t }
30
+ 1.upto(2) { @player.blam }
31
+
32
+ @player.health.should == @initial_health + (8 * 15)
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,53 @@
1
+ require 'studio_game/clumsy_player'
2
+
3
+
4
+ module StudioGame
5
+ describe ClumsyPlayer do
6
+ before do
7
+ @player = ClumsyPlayer.new("klutz")
8
+ end
9
+
10
+ it "only gets half the point value for each treasure" do
11
+ @player.points.should == 0
12
+
13
+ hammer = Treasure.new(:hammer, 50)
14
+ @player.found_treasure(hammer)
15
+ @player.found_treasure(hammer)
16
+ @player.found_treasure(hammer)
17
+
18
+ @player.points.should == 75
19
+
20
+ crowbar = Treasure.new(:crowbar, 400)
21
+ @player.found_treasure(crowbar)
22
+
23
+ @player.points.should == 275
24
+
25
+ yielded = []
26
+ @player.each_found_treasure do |treasure|
27
+ yielded << treasure
28
+ end
29
+
30
+ yielded.should == [Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)]
31
+ end
32
+
33
+ context "with a boost factor" do
34
+ before do
35
+ @initial_health = 100
36
+ @boost_factor = 5
37
+ @player = ClumsyPlayer.new("klutz", @initial_health, @boost_factor)
38
+ end
39
+
40
+ it "has a boost factor" do
41
+ @player.boost_factor.should == 5
42
+ end
43
+
44
+ it "gets boost factor number of w00ts when w00ted" do
45
+ @player.w00t
46
+
47
+ @player.health.should == @initial_health + (15 * @boost_factor)
48
+ end
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,76 @@
1
+ require 'studio_game/game'
2
+
3
+ module StudioGame
4
+ describe Game do
5
+
6
+ before do
7
+ @game = Game.new("Knuckleheads")
8
+
9
+ @initial_health = 100
10
+ @player = Player.new("moe", @initial_health)
11
+
12
+ @game.add_player(@player)
13
+ end
14
+
15
+ it "w00ts the player if a high number is rolled" do
16
+ Die.any_instance.stub(:roll).and_return(5)
17
+ #allow_any_instance_of(Die).to receive(:roll).and_return(5)
18
+
19
+ @game.play(2)
20
+
21
+ @player.health.should == @initial_health + (15 * 2)
22
+ end
23
+
24
+ it "skips the player if a medium number is rolled" do
25
+ Die.any_instance.stub(:roll).and_return(3)
26
+ #allow_any_instance_of(Die).to receive(:roll).and_return(3)
27
+
28
+ @game.play(2)
29
+
30
+ @player.health.should == @initial_health
31
+ end
32
+
33
+ it "blams the player if a low number is rolled" do
34
+ Die.any_instance.stub(:roll).and_return(1)
35
+ #allow_any_instance_of(Die).to receive(:roll).and_return(1)
36
+
37
+ @game.play(2)
38
+
39
+ @player.health.should == @initial_health - (10 * 2)
40
+ end
41
+
42
+ it "assigns a treasure for points during a player's turn" do
43
+ game = Game.new("Knuckleheads")
44
+ player = Player.new("moe")
45
+
46
+ game.add_player(player)
47
+
48
+ game.play(1)
49
+
50
+ player.points.should_not be_zero
51
+
52
+ # or use alternate expectation syntax:
53
+ # expect(player.points).not_to be_zero
54
+ end
55
+
56
+
57
+ it "computes total points as the sum of all player points" do
58
+ game = Game.new("Knuckleheads")
59
+
60
+ player1 = Player.new("moe")
61
+ player2 = Player.new("larry")
62
+
63
+ game.add_player(player1)
64
+ game.add_player(player2)
65
+
66
+ player1.found_treasure(Treasure.new(:hammer, 50))
67
+ player1.found_treasure(Treasure.new(:hammer, 50))
68
+ player2.found_treasure(Treasure.new(:crowbar, 400))
69
+
70
+ game.total_points.should == 500
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
@@ -0,0 +1,142 @@
1
+ require_relative 'spec_helper'
2
+ require 'studio_game/player'
3
+ require 'studio_game/treasure_trove'
4
+
5
+ module StudioGame
6
+ describe Player do
7
+
8
+ before do
9
+ @initial_health = 150
10
+ @player = Player.new("larry", @initial_health)
11
+ $stdout = StringIO.new
12
+ end
13
+
14
+ it "has a capitalized name" do
15
+ #old 2.8.0 syntax: player.name.should == "Larry"
16
+ expect(@player.name).to eq("Larry")
17
+ end
18
+
19
+ it "has an initial health" do
20
+ #old 2.8.0 syntax: player.health.should == 150
21
+ expect(@player.health).to eq(150)
22
+ end
23
+
24
+ it "has a string representation" do
25
+ @player.found_treasure(Treasure.new(:hammer, 50))
26
+ @player.found_treasure(Treasure.new(:hammer, 50))
27
+
28
+ @player.to_s.should == "I'm Larry with health = 150, points = 100, and score = 250."
29
+
30
+ end
31
+
32
+ it "computes a score as the sum of its health and points" do
33
+ @player.found_treasure(Treasure.new(:hammer, 50))
34
+ @player.found_treasure(Treasure.new(:hammer, 50))
35
+
36
+ @player.score.should == 250
37
+ end
38
+
39
+ it "increases health by 15 when w00ted" do
40
+ @player.w00t
41
+ #old 2.8.0 syntax: @player.health.should == @initial_health + 15
42
+ expect(@player.health).to eq(@initial_health + 15)
43
+ end
44
+
45
+ it "decreases health by 10 when blammed" do
46
+ @player.blam
47
+ #old 2.8.0 syntax: @player.health.should == @initial_health - 10
48
+ expect(@player.health).to eq(@initial_health - 10)
49
+ end
50
+
51
+
52
+ context "with a health greater than 100" do
53
+
54
+ before do
55
+ @player = Player.new("larry", 150)
56
+ end
57
+
58
+ it "is strong" do
59
+ expect(@player).to be_strong
60
+
61
+ # without syntax sugar expect(@player.strong?).to eq(true)
62
+ end
63
+
64
+
65
+ end
66
+
67
+ context "with a health of 100 or less" do
68
+
69
+ before do
70
+ @player = Player.new("larry", 100)
71
+ end
72
+
73
+ it "is wimpy" do
74
+ expect(@player).not_to be_strong
75
+
76
+ # without syntax sugar expect(@player.strong?).to eq(true)
77
+ end
78
+
79
+
80
+ end
81
+
82
+ context "in a collection of players" do
83
+ before do
84
+ @player1 = Player.new("moe", 100)
85
+ @player2 = Player.new("larry", 200)
86
+ @player3 = Player.new("curly", 300)
87
+
88
+ @players = [@player1, @player2, @player3]
89
+ end
90
+
91
+ it "is sorted by decreasing score" do
92
+ @players.sort.should == [@player3, @player2, @player1]
93
+ end
94
+ end
95
+
96
+ it "computes points as the sum of all treasure points" do
97
+ @player.points.should == 0
98
+
99
+ @player.found_treasure(Treasure.new(:hammer, 50))
100
+
101
+ @player.points.should == 50
102
+
103
+ @player.found_treasure(Treasure.new(:crowbar, 400))
104
+
105
+ @player.points.should == 450
106
+
107
+ @player.found_treasure(Treasure.new(:hammer, 50))
108
+
109
+ @player.points.should == 500
110
+ end
111
+
112
+ it "can be created from a CSV string" do
113
+ player = Player.from_csv("larry,150")
114
+
115
+ player.name.should == "Larry"
116
+ player.health.should == 150
117
+ end
118
+
119
+ it "yields each found treasure and its total points" do
120
+ @player.found_treasure(Treasure.new(:skillet, 100))
121
+ @player.found_treasure(Treasure.new(:skillet, 100))
122
+ @player.found_treasure(Treasure.new(:hammer, 50))
123
+ @player.found_treasure(Treasure.new(:bottle, 5))
124
+ @player.found_treasure(Treasure.new(:bottle, 5))
125
+ @player.found_treasure(Treasure.new(:bottle, 5))
126
+ @player.found_treasure(Treasure.new(:bottle, 5))
127
+ @player.found_treasure(Treasure.new(:bottle, 5))
128
+
129
+ yielded = []
130
+ @player.each_found_treasure do |treasure|
131
+ yielded << treasure
132
+ end
133
+
134
+ yielded.should == [
135
+ Treasure.new(:skillet, 200),
136
+ Treasure.new(:hammer, 50),
137
+ Treasure.new(:bottle, 25)
138
+ ]
139
+ end
140
+
141
+ end
142
+ end
@@ -0,0 +1,8 @@
1
+ RSpec.configure do |config|
2
+ config.expect_with :rspec do |c|
3
+ c.syntax = [:should, :expect]
4
+ end
5
+ config.mock_with :rspec do |c|
6
+ c.syntax = [:should, :expect]
7
+ end
8
+ end
@@ -0,0 +1,63 @@
1
+ require 'studio_game/treasure_trove'
2
+
3
+ module StudioGame
4
+ describe Treasure do
5
+
6
+ before do
7
+ @treasure = Treasure.new(:hammer, 50)
8
+ end
9
+
10
+ it "has a name attribute" do
11
+ expect(@treasure.name).to eq(:hammer)
12
+ #@treasure.name.should == :hammer
13
+ end
14
+
15
+ it "has a points attribute" do
16
+ expect(@treasure.points).to eq(50)
17
+ #@treasure.points.should == 50
18
+ end
19
+
20
+ end
21
+
22
+ describe TreasureTrove do
23
+
24
+ it "has six treasures" do
25
+ TreasureTrove::TREASURES.size.should == 6
26
+ end
27
+
28
+ it "has a pie worth 5 points" do
29
+ TreasureTrove::TREASURES[0].should == Treasure.new(:pie, 5)
30
+ end
31
+
32
+ it "has a bottle worth 25 points" do
33
+ TreasureTrove::TREASURES[1].should == Treasure.new(:bottle, 25)
34
+ end
35
+
36
+ it "has a hammer worth 50 points" do
37
+ TreasureTrove::TREASURES[2].should == Treasure.new(:hammer, 50)
38
+ end
39
+
40
+ it "has a skillet worth 100 points" do
41
+ TreasureTrove::TREASURES[3].should == Treasure.new(:skillet, 100)
42
+ end
43
+
44
+ it "has a broomstick worth 200 points" do
45
+ TreasureTrove::TREASURES[4].should == Treasure.new(:broomstick, 200)
46
+ end
47
+
48
+ it "has a crowbar worth 400 points" do
49
+ TreasureTrove::TREASURES[5].should == Treasure.new(:crowbar, 400)
50
+ end
51
+
52
+ it "returns a random treasure" do
53
+ treasure = TreasureTrove.random
54
+
55
+ TreasureTrove::TREASURES.should include(treasure)
56
+
57
+ # or use alternate expectation syntax:
58
+ # expect(TreasureTrove::TREASURES).to include(treasure)
59
+ end
60
+
61
+ end
62
+
63
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game_rhino
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Benedetti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: |
28
+ # studio_game_for_pragstudios_course
29
+ email: rhino.j.benedetti@gmail.com
30
+ executables:
31
+ - studio_game
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - LICENSE
36
+ - README
37
+ - bin/players.csv
38
+ - bin/studio_game
39
+ - lib/studio_game/auditable.rb
40
+ - lib/studio_game/berserk_player.rb
41
+ - lib/studio_game/clumsy_player.rb
42
+ - lib/studio_game/die.rb
43
+ - lib/studio_game/game.rb
44
+ - lib/studio_game/game_turn.rb
45
+ - lib/studio_game/loaded_die.rb
46
+ - lib/studio_game/playable.rb
47
+ - lib/studio_game/player.rb
48
+ - lib/studio_game/treasure_trove.rb
49
+ - spec/studio_game/berserk_player_spec.rb
50
+ - spec/studio_game/clumsy_player_spec.rb
51
+ - spec/studio_game/game_spec.rb
52
+ - spec/studio_game/player_spec.rb
53
+ - spec/studio_game/spec_helper.rb
54
+ - spec/studio_game/treasure_trove_spec.rb
55
+ homepage: https://github.com/ryanbenedetti/studio_game_for_pragstudios_course
56
+ licenses:
57
+ - MIT
58
+ metadata: {}
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '1.9'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project:
75
+ rubygems_version: 2.4.5
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: INSERT SUMMARY HERE
79
+ test_files:
80
+ - spec/studio_game/berserk_player_spec.rb
81
+ - spec/studio_game/clumsy_player_spec.rb
82
+ - spec/studio_game/game_spec.rb
83
+ - spec/studio_game/player_spec.rb
84
+ - spec/studio_game/spec_helper.rb
85
+ - spec/studio_game/treasure_trove_spec.rb