studio_game_sergio_silva 1.0.1
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 +7 -0
- data/LICENSE +21 -0
- data/README +6 -0
- data/bin/high_scores.txt +6 -0
- data/bin/players.csv +3 -0
- data/bin/studio_game +37 -0
- data/lib/studio_game/auditable.rb +9 -0
- data/lib/studio_game/berserker_player.rb +35 -0
- data/lib/studio_game/clumsy_player.rb +48 -0
- data/lib/studio_game/die.rb +25 -0
- data/lib/studio_game/game.rb +145 -0
- data/lib/studio_game/game_turn.rb +30 -0
- data/lib/studio_game/loaded_die.rb +15 -0
- data/lib/studio_game/playable.rb +19 -0
- data/lib/studio_game/player.rb +67 -0
- data/lib/studio_game/treasure_trove.rb +24 -0
- data/spec/studio_game/berserker_player_spec.rb +33 -0
- data/spec/studio_game/clumsy_player_spec.rb +44 -0
- data/spec/studio_game/files.rb +12 -0
- data/spec/studio_game/game_spec.rb +67 -0
- data/spec/studio_game/player_spec.rb +122 -0
- data/spec/studio_game/treasure_trove_spec.rb +26 -0
- metadata +90 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3d5089253366898c846b62b1da65518b6659b71b
|
4
|
+
data.tar.gz: d68a1e52db9a80a4a171385e86544f8dae44c9aa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 70649ccc5bbf515c5db96d839459239ea4064dc496fe8148a26a6426c3fededd9edf6bded32cc5067f5070579eedd782264e798fc0472d779900e294e4eef0b4
|
7
|
+
data.tar.gz: 8af9787a7e57542e8c6cbce358e5929325e1a913916cd0d4603a19aadd53e300023b87f094441da192f206c76fc6edcb97452f9d72a37c3de2ae9abcdf405eca
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2012 The Pragmatic Studio
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
- You may not use this Software in other training contexts.
|
11
|
+
|
12
|
+
- The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README
ADDED
data/bin/high_scores.txt
ADDED
data/bin/players.csv
ADDED
data/bin/studio_game
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#imports
|
4
|
+
require_relative '../lib/studio_game/game'
|
5
|
+
require_relative '../lib/studio_game/clumsy_player'
|
6
|
+
require_relative '../lib/studio_game/berserker_player'
|
7
|
+
|
8
|
+
#Create a game
|
9
|
+
knuckleheads = StudioGame::Game.new("Knuckleheads")
|
10
|
+
|
11
|
+
default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
|
12
|
+
knuckleheads.load(ARGV.shift || default_player_file)
|
13
|
+
|
14
|
+
#Create other players
|
15
|
+
player4 = StudioGame::ClumsyPlayer.new("klutz", 150)
|
16
|
+
player5 = StudioGame::BerserkerPlayer.new("berserker", 50)
|
17
|
+
|
18
|
+
#Adds players
|
19
|
+
knuckleheads.add_player(player4)
|
20
|
+
knuckleheads.add_player(player5)
|
21
|
+
|
22
|
+
#Running game
|
23
|
+
loop do
|
24
|
+
puts "How many rounds? ('quit' to exit the program)"
|
25
|
+
answer = gets.chomp.downcase
|
26
|
+
case answer
|
27
|
+
when /^\d+$/
|
28
|
+
knuckleheads.play(answer.to_i) do
|
29
|
+
knuckleheads.total_points >= 2000
|
30
|
+
end
|
31
|
+
when 'quit', 'exit'
|
32
|
+
knuckleheads.print_stats
|
33
|
+
break
|
34
|
+
else
|
35
|
+
puts "Please enter a number or 'quit'"
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
require_relative 'treasure_trove'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
class BerserkerPlayer < Player
|
6
|
+
|
7
|
+
def initialize(name, health = 100, counter = 0)
|
8
|
+
super(name, health)
|
9
|
+
@counter = counter
|
10
|
+
end
|
11
|
+
|
12
|
+
def berserker?
|
13
|
+
@w00t_counter.to_i > 5
|
14
|
+
end
|
15
|
+
|
16
|
+
def blam
|
17
|
+
berserker? ? w00t : super
|
18
|
+
end
|
19
|
+
|
20
|
+
def w00t
|
21
|
+
super
|
22
|
+
@w00t_counter = @w00t_counter.to_i + 1
|
23
|
+
|
24
|
+
puts "#{name} is berserker" if berserker?
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
if __FILE__ == $0
|
31
|
+
berserker = StudioGame::BerserkerPlayer.new("berserker", 50)
|
32
|
+
6.times { berserker.w00t }
|
33
|
+
2.times { berserker.blam }
|
34
|
+
puts berserker.health
|
35
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative 'player.rb'
|
2
|
+
require_relative 'treasure_trove.rb'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
class ClumsyPlayer < Player
|
6
|
+
attr_reader :boost
|
7
|
+
|
8
|
+
def initialize(name, health = 100, boost = 2)
|
9
|
+
super(name, health)
|
10
|
+
@boost = boost
|
11
|
+
end
|
12
|
+
|
13
|
+
def found_treasure(treasure)
|
14
|
+
damaged_treasure = Treasure.new(treasure.name, treasure.points / 2)
|
15
|
+
super(damaged_treasure)
|
16
|
+
puts "#{ name } found a #{ treasure.name } worth #{ treasure.points }"
|
17
|
+
puts "#{ name }'s treasures: #{ @found_treasures }"
|
18
|
+
end
|
19
|
+
|
20
|
+
def w00t
|
21
|
+
puts "#{ boost } boost factor give me #{ boost.to_i-1 } extra w00t"
|
22
|
+
@boost.to_i.times do
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
if __FILE__ == $0
|
31
|
+
clumsy = StudioGame::ClumsyPlayer.new("klutz", 100, 3)
|
32
|
+
hammer = StudioGame::Treasure.new(:hammer, 50)
|
33
|
+
crowbar = StudioGame::Treasure.new(:crowbar, 400)
|
34
|
+
|
35
|
+
clumsy.found_treasure(hammer)
|
36
|
+
clumsy.found_treasure(hammer)
|
37
|
+
clumsy.found_treasure(hammer)
|
38
|
+
clumsy.found_treasure(crowbar)
|
39
|
+
|
40
|
+
clumsy.each_found_treasure do |treasure|
|
41
|
+
puts "#{ treasure.points } total #{ treasure.name } points"
|
42
|
+
end
|
43
|
+
|
44
|
+
puts "#{ clumsy.points } grand total points"
|
45
|
+
|
46
|
+
clumsy.w00t
|
47
|
+
puts clumsy.health
|
48
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'auditable.rb'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
class Die
|
5
|
+
|
6
|
+
include Auditable
|
7
|
+
attr_reader :number
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@number = 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def roll
|
14
|
+
@number = 1 +rand(6)
|
15
|
+
audit(@number)
|
16
|
+
@number
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
if __FILE__ == $0
|
23
|
+
die = Die.new()
|
24
|
+
puts die.roll
|
25
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require_relative 'die.rb'
|
2
|
+
require_relative 'player.rb'
|
3
|
+
require_relative 'game_turn.rb'
|
4
|
+
require_relative 'treasure_trove.rb'
|
5
|
+
|
6
|
+
module StudioGame
|
7
|
+
class Game
|
8
|
+
|
9
|
+
attr_reader :name, :players
|
10
|
+
|
11
|
+
def initialize(name)
|
12
|
+
@name = name.capitalize
|
13
|
+
@players = Array.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_player(player)
|
17
|
+
players.push(player)
|
18
|
+
end
|
19
|
+
|
20
|
+
def load(from_file)
|
21
|
+
File.readlines(from_file).each do |line|
|
22
|
+
add_player(Player.from_csv(line))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def play(rounds)
|
27
|
+
puts "\nThere are #{players.size} players on this game"
|
28
|
+
|
29
|
+
@players.each do |p|
|
30
|
+
puts p
|
31
|
+
end
|
32
|
+
|
33
|
+
@treasures = TreasureTrove::TREASURES
|
34
|
+
puts"\nThere are #{@treasures.size} treasures to be found"
|
35
|
+
|
36
|
+
@treasures.each do |t|
|
37
|
+
puts "A #{t.name} is worth #{t.points}"
|
38
|
+
end
|
39
|
+
|
40
|
+
1.upto(rounds) do |counts|
|
41
|
+
|
42
|
+
if self.force_game_over?
|
43
|
+
puts "\nMaximum points limit reached at round #{counts}\n\t***GAME OVER***\n"
|
44
|
+
break
|
45
|
+
end
|
46
|
+
|
47
|
+
puts "\nRound #{counts}"
|
48
|
+
|
49
|
+
@players.each do |p|
|
50
|
+
puts "\n#{p}\n"
|
51
|
+
GameTurn.take_turn(p)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def print_name_and_health(player)
|
58
|
+
puts "#{player.name} (#{player.health})\n"
|
59
|
+
end
|
60
|
+
|
61
|
+
def print_total_points(player)
|
62
|
+
puts "\n #{player.name}'s points total:\n"
|
63
|
+
puts "#{player.name} grand #{player.points} total points\n"
|
64
|
+
end
|
65
|
+
|
66
|
+
#Bonus Round 17 method
|
67
|
+
def total_points
|
68
|
+
sum = 0
|
69
|
+
@players.each do |p|
|
70
|
+
sum += p.points
|
71
|
+
end
|
72
|
+
sum
|
73
|
+
end
|
74
|
+
|
75
|
+
#Bonus Round 18 method
|
76
|
+
def force_game_over?
|
77
|
+
self.total_points >= 2000
|
78
|
+
end
|
79
|
+
|
80
|
+
def save_high_scores(to_file = "high_scores.txt")
|
81
|
+
File.open(to_file, "w") do |file|
|
82
|
+
file.puts"#{@title} High Scores:"
|
83
|
+
@players.sort.each do |player|
|
84
|
+
file.puts(high_score_entry(player))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def high_score_entry(player)
|
90
|
+
formatted_name = player.name.ljust(20, '.')
|
91
|
+
"#{formatted_name}#{player.score}"
|
92
|
+
end
|
93
|
+
|
94
|
+
def print_stats
|
95
|
+
|
96
|
+
strong, wimpy = @players.partition { |p| p.strong? }
|
97
|
+
puts "\n#{@name}'s Statistics:\n"
|
98
|
+
|
99
|
+
puts "#{strong.size} strong players:\n"
|
100
|
+
strong.each do |s|
|
101
|
+
print_name_and_health(s)
|
102
|
+
end
|
103
|
+
|
104
|
+
puts "#{wimpy.size} wimpy players:\n"
|
105
|
+
wimpy.each do |w|
|
106
|
+
print_name_and_health(w)
|
107
|
+
end
|
108
|
+
|
109
|
+
@players = @players.sort
|
110
|
+
|
111
|
+
puts "\n#{@name}'s Grand points:\n"
|
112
|
+
@players.each do |p|
|
113
|
+
print_total_points(p)
|
114
|
+
end
|
115
|
+
|
116
|
+
puts "\n#{@name}'s High Scores:\n"
|
117
|
+
@players.each do |p|
|
118
|
+
high_score_entry(p)
|
119
|
+
end
|
120
|
+
|
121
|
+
puts "\nPoints on a per-treasure basis"
|
122
|
+
@players.each do |p|
|
123
|
+
puts "#{p.name}'s total points:\n"
|
124
|
+
p.each_found_treasure do |treasure|
|
125
|
+
puts "#{treasure.points} total #{treasure.name} points\n"
|
126
|
+
end
|
127
|
+
puts"\n"
|
128
|
+
end
|
129
|
+
|
130
|
+
puts "\n#{self.name}'s total found treasure points:\n"
|
131
|
+
puts total_points
|
132
|
+
|
133
|
+
save_high_scores
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
if __FILE__ == $0
|
140
|
+
player = Player.new("Sam")
|
141
|
+
game = Game.new("Game")
|
142
|
+
game.add_player(player)
|
143
|
+
game.play(3)
|
144
|
+
game.print_stats
|
145
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'die.rb'
|
2
|
+
#require_relative 'loaded_die.rb'
|
3
|
+
require_relative 'player.rb'
|
4
|
+
require_relative 'treasure_trove.rb'
|
5
|
+
|
6
|
+
module StudioGame
|
7
|
+
module GameTurn
|
8
|
+
|
9
|
+
def self.take_turn(player)
|
10
|
+
die = Die.new
|
11
|
+
#puts number_rolled
|
12
|
+
|
13
|
+
case die.roll
|
14
|
+
when 5..6
|
15
|
+
player.w00t
|
16
|
+
treasure = TreasureTrove.random
|
17
|
+
player.found_treasure(treasure)
|
18
|
+
when 3..4
|
19
|
+
puts "#{player.name} was skipped!"
|
20
|
+
treasure = TreasureTrove.random
|
21
|
+
player.found_treasure(treasure)
|
22
|
+
when 1..2
|
23
|
+
player.blam
|
24
|
+
treasure = TreasureTrove.random
|
25
|
+
player.found_treasure(treasure)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require_relative 'playable.rb'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
class Player
|
5
|
+
|
6
|
+
include Playable
|
7
|
+
#attr_reader :health - Changed in lesson 21
|
8
|
+
attr_accessor :name, :health
|
9
|
+
|
10
|
+
def initialize(name, health = 100)
|
11
|
+
@name = name.capitalize
|
12
|
+
@health = health
|
13
|
+
@found_treasures = Hash.new(0)
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"I am #{name} with health = #{health}, points = #{@found_treasures.values.reduce(:+)} and score = #{score}."
|
18
|
+
end
|
19
|
+
|
20
|
+
def score
|
21
|
+
@health + @found_treasures.values.reduce(:+).to_i
|
22
|
+
end
|
23
|
+
|
24
|
+
def strong?
|
25
|
+
@health > 100
|
26
|
+
end
|
27
|
+
|
28
|
+
def <=>(other)
|
29
|
+
other.score <=> self.score
|
30
|
+
end
|
31
|
+
|
32
|
+
def found_treasure(treasure)
|
33
|
+
@found_treasures[treasure.name] += treasure.points
|
34
|
+
puts "#{self.name} found a #{treasure.name} worth #{treasure.points}"
|
35
|
+
puts "#{self.name}'s treasures: #{@found_treasures}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def points
|
39
|
+
@found_treasures.values.reduce(:+).to_i
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.from_csv(string)
|
43
|
+
name, initial_health = string.split(",")
|
44
|
+
player = Player.new(name, initial_health.to_i)
|
45
|
+
end
|
46
|
+
|
47
|
+
def each_found_treasure
|
48
|
+
|
49
|
+
@found_treasures.each do|key, value|
|
50
|
+
treasure = Treasure.new(key, value)
|
51
|
+
yield(treasure)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
if __FILE__ == $0
|
60
|
+
player = Player.new("moe")
|
61
|
+
puts player.name
|
62
|
+
puts player.health
|
63
|
+
player.w00t
|
64
|
+
puts player.health
|
65
|
+
player.blam
|
66
|
+
puts player.health
|
67
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
module StudioGame
|
3
|
+
Treasure = Struct.new(:name, :points)
|
4
|
+
|
5
|
+
module TreasureTrove
|
6
|
+
TREASURES = [ Treasure.new(:pie, 5),
|
7
|
+
Treasure.new(:bottle, 25),
|
8
|
+
Treasure.new(:hammer, 50),
|
9
|
+
Treasure.new(:skillet, 100),
|
10
|
+
Treasure.new(:broomstick, 200),
|
11
|
+
Treasure.new(:crowbar, 400)]
|
12
|
+
|
13
|
+
def self.random
|
14
|
+
TREASURES.sample
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
if __FILE__ == $0
|
21
|
+
puts TreasureTrove::TREASURES
|
22
|
+
treasure = TreasureTrove.random
|
23
|
+
puts "You have found a #{treasure.name}. It values #{treasure.points} points"
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#require_relative '../../lib/studio_game/berserker_player'
|
2
|
+
require 'studio_game/berserker_player'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
describe BerserkerPlayer do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@initial_health = 50
|
9
|
+
@player = BerserkerPlayer.new("berserker", @initial_health)
|
10
|
+
puts @player
|
11
|
+
end
|
12
|
+
|
13
|
+
it "does not go berserk when w00ted up to 5 times" do
|
14
|
+
1.upto(5){ @player.w00t }
|
15
|
+
|
16
|
+
expect( @player.berserker? ).to be false
|
17
|
+
end
|
18
|
+
|
19
|
+
it "goes berserk after 5 blams" do
|
20
|
+
1.upto(6){ @player.w00t }
|
21
|
+
|
22
|
+
expect( @player.berserker? ).to be true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "gots w00ted instead of blammed when it's gone berserk" do
|
26
|
+
1.upto(6){ @player.w00t }
|
27
|
+
1.upto(2){ @player.blam }
|
28
|
+
|
29
|
+
expect( @player.health ).to eq( @initial_health + ( 8 * 15 ))
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#require_relative '../../lib/studio_game/clumsy_player'
|
2
|
+
require 'studio_game/clumsy_player'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
describe ClumsyPlayer do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@boost = 4
|
9
|
+
@initial_health = 100
|
10
|
+
@player = ClumsyPlayer.new("klutz", @initial_health, @boost)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "is being w00ted a several times by boost_factor" do
|
14
|
+
@player.w00t
|
15
|
+
expect(@player.health.to_i).to eq (@initial_health + (@boost * 15))
|
16
|
+
end
|
17
|
+
|
18
|
+
it "only gets half the point value for each treasure" do
|
19
|
+
expect(@player.points).to eq 0
|
20
|
+
|
21
|
+
hammer = Treasure.new(:hammer, 50)
|
22
|
+
@player.found_treasure(hammer)
|
23
|
+
@player.found_treasure(hammer)
|
24
|
+
@player.found_treasure(hammer)
|
25
|
+
|
26
|
+
expect(@player.points).to eq 75
|
27
|
+
|
28
|
+
crowbar = Treasure.new(:crowbar, 400)
|
29
|
+
@player.found_treasure(crowbar)
|
30
|
+
|
31
|
+
expect(@player.points).to eq 275
|
32
|
+
|
33
|
+
yielded = []
|
34
|
+
@player.each_found_treasure do |treasure|
|
35
|
+
yielded << treasure
|
36
|
+
end
|
37
|
+
|
38
|
+
expect(yielded).to eq ([Treasure.new(:hammer, 75),
|
39
|
+
Treasure.new(:crowbar, 200)
|
40
|
+
])
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'studio_game/game'
|
2
|
+
#require_relative '../../lib/studio_game/game'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
describe Game do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@game = Game.new("Knuckleheads")
|
9
|
+
@initial_health = 100
|
10
|
+
@player = Player.new("moe", @initial_health)
|
11
|
+
@rounds = 1
|
12
|
+
@game.add_player(@player)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "a high number was rolled" do
|
16
|
+
#Die.any_instance.stub(:roll).and_return(5) --> The teachers suggest to use this, but is deprecated
|
17
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(5)
|
18
|
+
|
19
|
+
@game.play(@rounds)
|
20
|
+
|
21
|
+
expect(@player.health).to eq(@initial_health + 15)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "a medium number was rolled" do
|
25
|
+
#Die.any_instance.stub(:roll).and_return(3) --> The teachers suggest to use this, but is deprecated
|
26
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(3)
|
27
|
+
|
28
|
+
@game.play(@rounds)
|
29
|
+
|
30
|
+
expect(@player.health).to eq(@initial_health)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "a low number was rolled" do
|
34
|
+
#Die.any_instance.stub(:roll).and_return(1) --> The teachers suggest to use this, but is deprecated
|
35
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(1)
|
36
|
+
|
37
|
+
@game.play(@rounds)
|
38
|
+
|
39
|
+
expect(@player.health).to eq(@initial_health - 10)
|
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
|
+
game.play(1)
|
48
|
+
|
49
|
+
expect(player.points).to_not eq(0)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "computes a total points as the sum of all player points" do
|
53
|
+
game = Game.new("Knuckleheads")
|
54
|
+
player1 = Player.new("moe")
|
55
|
+
player2 = Player.new("larry")
|
56
|
+
|
57
|
+
game.add_player(player1)
|
58
|
+
game.add_player(player2)
|
59
|
+
|
60
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
61
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
62
|
+
player2.found_treasure(Treasure.new(:crowbar, 400))
|
63
|
+
expect(game.total_points).to eq(500)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'studio_game/player'
|
2
|
+
require 'studio_game/treasure_trove'
|
3
|
+
#require_relative '../../lib/studio_game/player'
|
4
|
+
#require_relative '../../lib/studio_game/treasure_trove'
|
5
|
+
|
6
|
+
module StudioGame
|
7
|
+
describe Player do
|
8
|
+
|
9
|
+
before do
|
10
|
+
@initial_health = 150
|
11
|
+
@player = Player.new("larry", @initial_health)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a capitalized name" do
|
15
|
+
expect(@player.name).to eq("Larry")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "has an initial healgh" do
|
19
|
+
expect(@player.health).to eq(150)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "has a string representation" do
|
23
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
24
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
25
|
+
|
26
|
+
expect(@player.to_s).to eq("I am #{ @player.name } with health = #{ @player.health }, points = 100 and score = 250.")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "computes a score as the sum of its health and points" do
|
30
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
31
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
32
|
+
|
33
|
+
expect(@player.score).to eq(250)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "increases health by 15 when w00ted" do
|
37
|
+
@player.w00t
|
38
|
+
expect(@player.health).to eq(@initial_health + 15)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "decreases health by 10 when blammed" do
|
42
|
+
@player.blam
|
43
|
+
expect(@player.health).to eq(@initial_health - 10)
|
44
|
+
end
|
45
|
+
|
46
|
+
context "with a health of at least 101" do
|
47
|
+
|
48
|
+
before do
|
49
|
+
@player = Player.new("hulk", 150)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "is strong" do
|
53
|
+
expect(@player).to be_strong
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "with a health less than 101" do
|
58
|
+
|
59
|
+
before do
|
60
|
+
@player = Player.new("loki", 100)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "is wimpy" do
|
64
|
+
expect(@player).to_not be_strong
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "in a collection of players" do
|
69
|
+
|
70
|
+
before do
|
71
|
+
@player1 = Player.new("mow", 100)
|
72
|
+
@player2= Player.new("larryy", 200)
|
73
|
+
@player3 = Player.new("curly", 300)
|
74
|
+
|
75
|
+
@players = [@player1, @player2, @player3]
|
76
|
+
end
|
77
|
+
|
78
|
+
it "is sorted by decreasing score" do
|
79
|
+
expect(@players.sort).to eq([@player3, @player2, @player1])
|
80
|
+
end
|
81
|
+
|
82
|
+
it "computes points as the sum of all treasure points " do
|
83
|
+
expect(@player.points).to eq(0)
|
84
|
+
|
85
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
86
|
+
|
87
|
+
expect(@player.points).to be(50)
|
88
|
+
|
89
|
+
@player.found_treasure(Treasure.new(:crowbar, 400))
|
90
|
+
|
91
|
+
expect(@player.points).to be(450)
|
92
|
+
|
93
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
94
|
+
|
95
|
+
expect(@player.points).to be(500)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "yields each found treasure and its total points" do
|
99
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
100
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
101
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
102
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
103
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
104
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
105
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
106
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
107
|
+
|
108
|
+
yielded = []
|
109
|
+
|
110
|
+
@player.each_found_treasure do |treasure|
|
111
|
+
yielded << treasure
|
112
|
+
end
|
113
|
+
|
114
|
+
expect(yielded).to eq([Treasure.new(:skillet, 200),
|
115
|
+
Treasure.new(:hammer, 50),
|
116
|
+
Treasure.new(:bottle, 25)
|
117
|
+
])
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'studio_game/treasure_trove'
|
2
|
+
#require_relative '../../lib/studio_game/treasure_trove'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
describe TreasureTrove do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@name = :sword
|
9
|
+
@points
|
10
|
+
@treasure = Treasure.new(@name, @points)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "has an initial health" do
|
14
|
+
expect(@treasure.name).to eq(@name)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "has an initial point" do
|
18
|
+
expect(@treasure.points).to eq(@points)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns a random treasure" do
|
22
|
+
expect(TreasureTrove.random).to be_an_instance_of(Treasure)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: studio_game_sergio_silva
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sérgio Vitarelli Silva
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-06-30 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
|
+
This is an example application used in The Pragmatic Studio's
|
29
|
+
Ruby Programming course, as described at
|
30
|
+
|
31
|
+
http://pragmaticstudio.com
|
32
|
+
|
33
|
+
This code is Copyright 2012 The Pragmatic Studio. See the LICENSE file.
|
34
|
+
email: sergio.silva@dito.com.br
|
35
|
+
executables:
|
36
|
+
- studio_game
|
37
|
+
extensions: []
|
38
|
+
extra_rdoc_files: []
|
39
|
+
files:
|
40
|
+
- LICENSE
|
41
|
+
- README
|
42
|
+
- bin/high_scores.txt
|
43
|
+
- bin/players.csv
|
44
|
+
- bin/studio_game
|
45
|
+
- lib/studio_game/auditable.rb
|
46
|
+
- lib/studio_game/berserker_player.rb
|
47
|
+
- lib/studio_game/clumsy_player.rb
|
48
|
+
- lib/studio_game/die.rb
|
49
|
+
- lib/studio_game/game.rb
|
50
|
+
- lib/studio_game/game_turn.rb
|
51
|
+
- lib/studio_game/loaded_die.rb
|
52
|
+
- lib/studio_game/playable.rb
|
53
|
+
- lib/studio_game/player.rb
|
54
|
+
- lib/studio_game/treasure_trove.rb
|
55
|
+
- spec/studio_game/berserker_player_spec.rb
|
56
|
+
- spec/studio_game/clumsy_player_spec.rb
|
57
|
+
- spec/studio_game/files.rb
|
58
|
+
- spec/studio_game/game_spec.rb
|
59
|
+
- spec/studio_game/player_spec.rb
|
60
|
+
- spec/studio_game/treasure_trove_spec.rb
|
61
|
+
homepage: https://github.com/
|
62
|
+
licenses: []
|
63
|
+
metadata: {}
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '1.9'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 2.4.5
|
81
|
+
signing_key:
|
82
|
+
specification_version: 4
|
83
|
+
summary: Studio game gem
|
84
|
+
test_files:
|
85
|
+
- spec/studio_game/game_spec.rb
|
86
|
+
- spec/studio_game/files.rb
|
87
|
+
- spec/studio_game/clumsy_player_spec.rb
|
88
|
+
- spec/studio_game/player_spec.rb
|
89
|
+
- spec/studio_game/treasure_trove_spec.rb
|
90
|
+
- spec/studio_game/berserker_player_spec.rb
|